問題場景:使用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 \r \n
0000007
結果發現變量結束除了有正常的換行符\n
外,還有回車符\r
。原因是這個yaml文件是其它組在Windows上編寫的,其分行都是使用了\r\n
的方式,我們在使用shell解析時沒有考慮到這種情況。
最后,使用以下方式解決此問題。
your_variable_new=$(echo ${your_variable} | tr -d '\r')