Есть ли способ заставить jasypt иметь настраиваемое шифрование в Springboot - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужно зашифровать пароль базы данных, который есть в нашем файле bootstrap.yml, и для этого мы решили пойти с -

jasypt

Я использую версию jasypt 1.18 с выпуском весенней загрузки 1.5.13.

Последняя версия jasypt-spring-boot: 2.1.1 не поддерживает релиз весенней загрузки 1.5.13, и поэтому я собираюсь использовать более старую версию.

Мое требование - иметь секретный ключ в файле, который копируется в изображение во время создания образа, и путь к нему указывается в bootstrap.yml

Асимметричное шифрование невозможно, так как это присутствует в последнем банке.

Пожалуйста, предложите способ, как этого добиться?

=============================================== ================

Для шифрования пароля jaspyt предоставил 3 различных подхода. Я попробовал Первые два подхода и смог успешно зашифровать / расшифровать, но проблема в том, что секретный ключ должен быть передан как окружение или системное свойство.

Третий подход - использование Custom JASYPT Encryptor. Я думал, что это решение было то, что я искал, где я могу сохранить пароль во внешнем файле и передать путь из bootstrap.yml.

pom.xml

<dependency>
     <groupId>com.github.ulisesbocchio</groupId>
     <artifactId>jasypt-spring-boot-starter</artifactId>
     <version>1.18</version>
</dependency>

Класс конфигурации

@Bean(name = "encryptorBean")
public StringEncryptor stringEncryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    \\ will add code here to get the password from the file                                 
    config.setPassword("Read from a file"); 
    config.setAlgorithm("PBEWithMD5AndDES");
    config.setKeyObtentionIterations("1000");
    config.setPoolSize("1");
    config.setProviderName("SunJCE");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    config.setStringOutputType("base64");
    encryptor.setConfig(config);
    return encryptor;
}

bootstrap.yml

jasypt:
  encryptor:
    bean: encryptorBean  

С этим кодом я получаю следующее исключение -

Caused by: java.lang.IllegalStateException: Required Encryption configuration property missing: jasypt.encryptor.password
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.getRequiredProperty(DefaultLazyEncryptor.java:70) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.createDefault(DefaultLazyEncryptor.java:45) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.lambda$new$2(DefaultLazyEncryptor.java:34) ~[jasypt-spring-boot-1.18.jar:na]
    at java.util.Optional.orElseGet(Unknown Source) ~[na:1.8.0_191]
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.lambda$new$3(DefaultLazyEncryptor.java:32) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.util.Singleton.lambda$new$1(Singleton.java:20) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.util.Singleton.get(Singleton.java:31) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.decrypt(DefaultLazyEncryptor.java:82) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.resolver.DefaultPropertyResolver.resolvePropertyValue(DefaultPropertyResolver.java:35) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.resolver.DefaultLazyPropertyResolver.resolvePropertyValue(DefaultLazyPropertyResolver.java:41) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.EncryptablePropertySource.getProperty(EncryptablePropertySource.java:16) ~[jasypt-spring-boot-1.18.jar:na]
    at com.ulisesbocchio.jasyptspringboot.wrapper.EncryptableMapPropertySourceWrapper.getProperty(EncryptableMapPropertySourceWrapper.java:29) ~[jasypt-spring-boot-1.18.jar:na]
    at org.springframework.boot.bind.PropertySourcesPropertyValues.getEnumerableProperty(PropertySourcesPropertyValues.java:166) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.bind.PropertySourcesPropertyValues.processEnumerablePropertySource(PropertySourcesPropertyValues.java:149) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.bind.PropertySourcesPropertyValues.processPropertySource(PropertySourcesPropertyValues.java:128) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.bind.PropertySourcesPropertyValues.<init>(PropertySourcesPropertyValues.java:118) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.bind.PropertiesConfigurationFactory.getPropertySourcesPropertyValues(PropertiesConfigurationFactory.java:331) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:285) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:250) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:331) ~[spring-boot-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    ... 58 common frames omitted

Почему он запрашивает jasypt.encryptor.password, когда я на самом деле использую настраиваемый подход шифрования, где я определяю bean-компонент «encryptorBean» в bootstrap.yml

=============================================== ===========

Я также прошел через Github, где была поднята похожая проблема, где они сказали использовать зависимость ниже, но при таком подходе я даже не могу загрузить jasypt.

<dependency>
     <groupId>com.github.ulisesbocchio</groupId>
     <artifactId>jasypt-spring-boot</artifactId>
     <version>1.18</version>
</dependency>

https://github.com/ulisesbocchio/jasypt-spring-boot/issues/79

Было бы здорово, если бы кто-нибудь помог мне с решением.

1 Ответ

0 голосов
/ 24 мая 2019

Измените имя компонента на jasyptStringEncryptor:

> @Bean(name = "jasyptStringEncryptor") public StringEncryptor
> stringEncryptor() {

ИЛИ

установите свойство jasypt.encryptor.bean

jasypt.encryptor.bean=encryptorBean

Ссылка: https://github.com/ulisesbocchio/jasypt-spring-boot#use-you-own-custom-encryptor

...