Конфигурация весенней загрузки с Jasypt
1. Вступление
Jasypt (Java Simplified Encryption) Spring Boot provides utilities for encrypting property sources в загрузочных приложениях.
В этой статье мы обсудим, как добавить поддержкуjasypt-spring-boot и использовать ее.
Для получения дополнительной информации об использовании Jasypt в качестве основы для шифрования ознакомьтесь с нашим введением в Jasypthere.
2. Почему Ясыпт?
Всякий раз, когда нам нужно сохранить конфиденциальную информацию в файле конфигурации - это означает, что мы, по сути, делаем эту информацию уязвимой; это включает любую конфиденциальную информацию, такую как учетные данные, но, безусловно, многое другое.
Byusing Jasypt, we can provide encryption for the property file attributes, и наше приложение расшифрует его и получит исходное значение.
3. Способы использования JASYPT с Spring Boot
Давайте обсудим различные способы использования Jasypt с Spring Boot.
3.1. Using jasypt-spring-boot-starter
Нам нужно добавить одну зависимость в наш проект:
com.github.ulisesbocchio
jasypt-spring-boot-starter
2.0.0
В Maven Central установлена последняя версияjasypt-spring-boot-starter.
Теперь зашифруем текст“[email protected]” секретным ключом «пароль» и добавим его вencrypted.properties:
encrypted.property=ENC(uTSqb9grs1+vUv3iN8lItC0kl65lMG+8)
И давайте определим класс конфигурацииAppConfigForJasyptStarter - чтобы указать файлencrypted.properties какPropertySource:
@Configuration
@PropertySource("encrypted.properties")
public class AppConfigForJasyptStarter {
}
Теперь мы напишем служебный компонентPropertyServiceForJasyptStarter для извлечения значений изencrypted.properties. The decrypted value can be retrieved using the @Value annotation or the getProperty() method of Environment class:
@Service
public class PropertyServiceForJasyptStarter {
@Value("${encrypted.property}")
private String property;
public String getProperty() {
return property;
}
public String getPasswordUsingEnvironment(Environment environment) {
return environment.getProperty("encrypted.property");
}
}
Наконец,using the above service class and setting the secret key which we used for encryption, we can easily retrieve the decrypted password and use in our application:
@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
System.setProperty("jasypt.encryptor.password", "password");
PropertyServiceForJasyptStarter service = appCtx
.getBean(PropertyServiceForJasyptStarter.class);
assertEquals("[email protected]", service.getProperty());
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"[email protected]",
service.getPasswordUsingEnvironment(environment));
}
3.2. Использование jasypt-spring-boot
Для проектов, не использующих@SpringBootApplication или@EnableAutoConfiguration, мы можем напрямую использовать зависимостьjasypt-spring-boot:
com.github.ulisesbocchio
jasypt-spring-boot
2.0.0
Точно так же давайте зашифруем текст“[email protected]” секретным ключом“password” и добавим его кencryptedv2.properties:
encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)
И давайте создадим новый класс конфигурации для зависимости jasypt-spring-boot.
Здесь нам нужно добавить аннотацию@EncryptablePropertySource:
@Configuration
@EncryptablePropertySource("encryptedv2.properties")
public class AppConfigForJasyptSimple {
}
Также определен новый bean-компонентPropertyServiceForJasyptSimple для возвратаencryptedv2.properties:
@Service
public class PropertyServiceForJasyptSimple {
@Value("${encryptedv2.property}")
private String property;
public String getProperty() {
return property;
}
}
Наконец, используя указанный выше класс обслуживания и задав секретный ключ, который мы использовали для шифрования, мы можем легко получитьencryptedv2.property:
@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
System.setProperty("jasypt.encryptor.password", "password");
PropertyServiceForJasyptSimple service = appCtx
.getBean(PropertyServiceForJasyptSimple.class);
assertEquals("[email protected]", service.getProperty());
}
3.3. Использование специального шифратора JASYPT
Шифраторы, определенные в разделе 3.1. и 3.2. построены со значениями конфигурации по умолчанию.
However, let’s go and define our own Jasypt encryptor и попробуйте использовать для нашего приложения.
S0, пользовательский bean-компонент encryptor будет выглядеть так:
@Bean(name = "encryptorBean")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("password");
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;
}
Кроме того, мы можем изменить все свойстваSimpleStringPBEConfig.
Такжеwe need to add a property “jasypt.encryptor.bean” to our application.properties, so that Spring Boot knows which Custom Encryptor it should use.
Например, мы добавляем собственный текст“[email protected]”, зашифрованный секретным ключом“password”, вapplication.properties:
jasypt.encryptor.bean=encryptorBean
encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)
Установив его, мы можем легко получитьencryptedv3.property изEnvironment Spring:
@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"[email protected]",
environment.getProperty("encryptedv3.property"));
}
4. Заключение
By using Jasypt we canprovide additional security for the data that application handles.
Это позволяет нам уделять больше внимания ядру нашего приложения, а также может быть использовано для обеспечения специального шифрования, если это необходимо.
Как всегда, доступен полный код этого примераover on Github.