Обновите Spring Boot 1.x до 2.x (обновите аргумент ENCRYPT KEY VM, если используете тексты {cipher}) - PullRequest
1 голос
/ 24 октября 2019

Если {cipher} зашифрованный текст используется в файле свойств приложения Spring-Boot.

application.yml или application.properties

my.password='{cipher}68e78a954bfa0297ecc733`

Выше происходит сбой запуска в SpringBoot2 ссообщение об ошибке Cannot decrypt: key=my.password

Stack Trace

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)

1 Ответ

1 голос
/ 24 октября 2019

Spring-boot-1

Любой из следующих аргументов виртуальной машины действителен для предоставления секретного ключа, чтобы Spring могла расшифровать '{cipher}f75146b2d391aa6' при загрузке свойств.

  1. encrypt.key (ключ по умолчанию)
  2. encrypt_key
  3. encryptKey
  4. encryptkey
  5. ENCRYPT.KEY
  6. ENCRYPT_KEY
  7. ENCRYPTKEY

Spring использует org.springframework.boot.bind.RelaxedPropertyResolver для разрешения указанных выше ключей, чтобы получить секретный ключ, но этот класс устарел и удален в spring-boot-2.

Фрагмент кода в spring-cloud-context-1.x.jar из класса org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration

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передать секретный ключ.

Фрагмент кода в spring-cloud-context-2.x.jar из класса org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration

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));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...