Keytool错误:Keystore被篡改...特殊字符

rea*_*404 7 java encoding keystore keytool

我知道已经有一些关于此错误的帖子,但我找不到适合我的问题的答案:

我使用以下命令创建了一个AES密钥:

keytool -genseckey -alias TEST -keyalg AES -keysize 128 -storepass "a#b$c<d>" 
-storetype JCEKS -keystore /usr/my/path/test.jck
Run Code Online (Sandbox Code Playgroud)

然后我尝试从java代码访问密钥库:

String password = "a#b$c<d>";

char[] passwordChars= password.toCharArray(); 

// loading the file containing the key
InputStream inputStreamFichierCle;
try {
    inputStreamFichierCle = new FileInputStream(filePath);
    keyStore.load(inputStreamFichierCle, passwordChars);
}
Run Code Online (Sandbox Code Playgroud)

我得到了一个IOException : keystore was tampered with or password was incorrect.

请注意,我尝试使用普通密码(例如:传递),这很有效,所以我想这里的问题与我在密码中使用的特殊字符有关.

发生了什么,我该如何解决这个问题?

Omi*_*ron 14

这个问题的原因是美元符号与bash命令行的组合.

基本上,"$ c"被替换为名为"c"的变量的内容.不幸的是,这个名称没有变量,因此它被替换为空字符串.

您可以使用单引号来避免变量替换.看到不同:

$ echo "a#b$c<d>"
a#b<d>
$ echo 'a#b$c<d>'
a#b$c<d>
Run Code Online (Sandbox Code Playgroud)

如果您a#b<d>在java代码中使用密码" ",它将起作用.

  • @GedankenNebel这就是为什么建议使用单引号代替的原因。然后,您可以在密码中输入任何字符,并且没有意外更改。 (2认同)