问题场景:使用shell脚本调用jasypt.jar的对一个已加密字串进行解码时报出
java.security.spec.InvalidKeySpecException: Password is not ASCII
错误。其中加密字串和加密秘钥都是从yaml文件中解析的。以下内容描述了错误处理过程
问题范围缩小
在shell中调用jasypt解密的脚本如下:
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="9kQtb2W8i2VmFZIjLt0jPYfjWZLZpPtl" password=shen algorithm=PBEWithMD5AndDES
因为从yaml文件中获取了input
和password
后面所用的变量,并且报错也指明是Password出错,所以使用固定值替换password
后面的值,结果加密字串得到正常解密。这样就确定了出错就在password的变量。
使用od命令查看输入变量的值
在shell脚本中使用echo ${your_variable} | od -c
查看内容中是否有不可见的异常字符。
echo ${your_variable} | od -c
0000000 s h e n
0000007
结果发现变量结束除了有正常的换行符
外,还有回车符
。原因是这个yaml文件是其它组在Windows上编写的,其分行都是使用了
的方式,我们在使用shell解析时没有考虑到这种情况。
最后,使用以下方式解决此问题。
your_variable_new=$(echo ${your_variable} | tr -d '
')