1. введение
Jasypt (упрощенное шифрование Java) Spring Boot предоставляет утилиты для шифрования источников свойств в загрузочных приложениях.
В этой статье мы обсудим, как мы можем добавить поддержку jasypt-spring-boot и использовать ее.
Для получения дополнительной информации об использовании Jasypt в качестве основы для шифрования ознакомьтесь с нашим введением в Jasypt здесь .
2. Почему Jasypt?
Всякий раз, когда нам нужно хранить конфиденциальную информацию в файле конфигурации, это означает, что мы, по сути, делаем эту информацию уязвимой; это включает в себя любую конфиденциальную информацию, такую как учетные данные, но, безусловно, гораздо больше.
Используя Jasypt, мы можем обеспечить шифрование атрибутов файла свойств , и наше приложение выполнит работу по его расшифровке и извлечению исходного значения.
3. Способы использования JASYPT с пружинным загрузчиком
Давайте обсудим различные способы использования Jasypt с Spring Boot.
3.1. Использование 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 {
}
Теперь мы напишем служебный компонент Property Service для Jasypt Starter для извлечения значений из encrypted.properties . Расшифрованное значение может быть получено с помощью аннотации @Value или метода |/getProperty() класса Environment :
@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");
}
}
Наконец, используя вышеуказанный класс обслуживания и установив секретный ключ, который мы использовали для шифрования, мы можем легко получить расшифрованный пароль и использовать его в нашем приложении :
@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 , мы можем использовать ясыпт -пружинный ботинок зависимость напрямую:
com.github.ulisesbocchio jasypt-spring-boot 2.0.0
Аналогично, давайте зашифруем текст “ [email protected] “ с помощью секретного ключа “пароль” и добавим его в encryptedv2.properties :
encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)
И давайте создадим новый класс конфигурации для зависимости jasypt-spring-boot.
Здесь нам нужно добавить аннотацию @EncryptablePropertySource :
@Configuration
@EncryptablePropertySource("encryptedv2.properties")
public class AppConfigForJasyptSimple {
}Кроме того, определен новый сервис Property Для Jasypt Simple bean для возврата encrypted v2.properties :
@Service
public class PropertyServiceForJasyptSimple {
@Value("${encryptedv2.property}")
private String property;
public String getProperty() {
return property;
}
}
Наконец, используя приведенный выше класс обслуживания и установив секретный ключ, который мы использовали для шифрования, мы можем легко получить свойство encryptedv2.:
@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, построены со значениями конфигурации по умолчанию.
Тем не менее, давайте определим наше собственное шифрование Jasypt и попробуем использовать его для нашего приложения.
S0, пользовательский компонент шифрования будет выглядеть следующим образом:
@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;
}
Кроме того, мы можем изменить все свойства для Простой строки PBEConfig.
Кроме того, нам нужно добавить свойство “jasypt.encryption.been” в наш application.properties, чтобы Spring Boot знал, какой пользовательский шифратор он должен использовать .
Например, мы добавляем пользовательский текст “ [email protected] “ зашифрованный секретным ключом “пароль” в application.properties:
jasypt.encryptor.bean=encryptorBean encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)
Как только мы его установим, мы сможем легко получить свойство encrypted v3.property из среды Spring :
@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"[email protected]",
environment.getProperty("encryptedv3.property"));
}
4. Заключение
Используя Jasypt, мы можем обеспечить дополнительную безопасность данных, обрабатываемых приложением .
Это позволяет нам больше сосредоточиться на ядре нашего приложения, а также может быть использовано для обеспечения пользовательского шифрования, если это необходимо.
Как всегда, полный код для этого примера доступен на Github .