将Spring Boot 1.x升级至2.x(如果使用{cipher}文本,请更新ENCRYPT KEY VM参数)



如果在春季启动应用程序属性文件中使用{cipher}加密文本。

application.ymlapplication.properties

my.password='{cipher}68e78a954bfa0297ecc733`

以上是SpringBoot2中的启动失败,错误消息为Cannot decrypt: key=my.password

堆栈跟踪

java.lang.IllegalStateException: Cannot decrypt: key=enterpriseInventoryService.password
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:292)
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.lambda$decrypt$0(EnvironmentDecryptApplicationInitializer.java:270)
at java.util.LinkedHashMap.replaceAll(Unknown Source)
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:265)
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:190)
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.initialize(EnvironmentDecryptApplicationInitializer.java:124)
at org.springframework.cloud.bootstrap.BootstrapApplicationListener$DelegatingEnvironmentDecryptApplicationInitializer.initialize(BootstrapApplicationListener.java:413)
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:623)
.
.
Caused by: java.lang.IllegalStateException: Unable to invoke Cipher due to bad padding
at org.springframework.security.crypto.encrypt.CipherUtils.doFinal(CipherUtils.java:142)

Spring-boot-1

以下任何一个VM参数都可以有效地提供密钥,以便spring可以在加载属性时解密'{cipher}f75146b2d391aa6'

  1. 加密密钥(默认密钥(
  2. encrypt_key
  3. encryptKey
  4. 加密密钥
  5. ENCRYPT.KEY
  6. ENCRYPT_KEY
  7. 加密密钥

Spring使用org.springframework.boot.bind.RelaxedPropertyResolver解析上述密钥以获得密钥,但此类已在spring-boot-2中被弃用并删除。

org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration类的spring-cloud-context-1.x.jar中的代码段

Environment environment = context.getEnvironment();
RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(environment);
hasProperty(propertyResolver, environment, "encrypt.key");
private boolean hasProperty(RelaxedPropertyResolver propertyResolver, Environment environment, String key) {
String value = propertyResolver.getProperty(key);
if (value == null) {
return false;
}
return StringUtils.hasText(environment.resolvePlaceholders(value));
}

Spring-boot-2

只有encrypt.key是传递密钥的有效VM参数。

org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration类中spring-cloud-context-2.x.jar的代码段

Environment environment = context.getEnvironment();
hasProperty(environment, "encrypt.key");
private boolean hasProperty(Environment environment, String key) {
String value = environment.getProperty(key);
if (value == null) {
return false;
}
return StringUtils.hasText(environment.resolvePlaceholders(value));
}

最新更新