Spring Boot密码BadPaddingException:解密错误

时间:2018-11-29 21:12:33

标签: spring-boot encryption keystore badpaddingexception

我正在关注文章here,其中描述了如何使用密码来加密Spring Boot应用程序属性。

因此,根据说明,我下载并放置了JCE Java密码扩展(JCE)文件。

然后我创建了一个密钥库

keytool -genkeypair -alias mytestkey -keyalg RSA 
  -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" 
  -keypass changeme -keystore server.jks -storepass letmein 
  -validity 365

此后,我将server.jks文件复制到Spring项目的 resource 文件夹中,并将以下属性也添加到位于 resource 文件夹下的bootstrap.properties文件中

bootstrap.properties文件的内容如下:

encrypt.key-store.location: classpath:/server.jks
encrypt.key-store.password=letmein
encrypt.key-store.alias=mytestkey
encrypt.key-store.secret=changeme

现在,当我运行应用程序时,可以通过对http://localhost/encrypthttp://localhost/decrypt进行POST调用来轻松加密或解密端点。

我也可以使用 TextEncryptor 在代码中成功加密或解密。

但是,当我加密一些值并将加密后的值添加到application.properties时,如下所示:

messageinfo={cipher}AQBt2RnIRqX1UrHGfvcJpQhfurqbxjGEgeHh....

再次运行该应用程序时,我会得到

java.lang.IllegalStateException: Cannot decrypt: key=messageinfo
javax.crypto.BadPaddingException: Decryption error

我不确定如何解决此问题,感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

我设法找到了问题,这是与 Java环境有关的问题,我的盒子上安装了多个Java SDK,我的 JAVA_HOME(和PATH)指向 Java 11 SDK ,因此当我使用keytool生成密钥时,它使用的是 Java 11

但是在Spring Studio中,它指向的是 Java 8 SDK ,因此,当我运行项目时,它使用 Java 8 进行读取和解密。

所以之后:

  • 未安装的Java 11
  • 已将JAVA_HOME(和PATH)更改为指向Java 8 SDK
  • 使用keytool重新生成密钥

一切正常。