1. Введение
Jasypt (упрощенное шифрование Java) Spring Boot предоставляет утилиты для шифрования источников свойств в загрузочных приложениях.
В этой статье мы обсудим, как мы можем добавить поддержку jasypt-spring-boot и использовать ее.
Для получения дополнительной информации об использовании Jasypt в качестве фреймворка для шифрования ознакомьтесь с нашим введением в Jasypt здесь .
2. Почему Джасыпт?
Всякий раз, когда нам нужно сохранить конфиденциальную информацию в файле конфигурации, это означает, что мы, по сути, делаем эту информацию уязвимой; это включает в себя любую конфиденциальную информацию, такую как учетные данные, но, безусловно, намного больше.
Используя Jasypt, мы можем обеспечить шифрование атрибутов файла свойств, и наше приложение выполнит работу по его расшифровке и извлечению исходного значения.
3. Способы использования JASYPT с Spring Boot
Давайте обсудим различные способы использования Jasypt с Spring Boot.
3.1. Использование jasypt -spring -boot-starter
Нам нужно добавить одну зависимость в наш проект:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
Maven Central имеет последнюю версию jasypt-spring-boot-starter .
Давайте теперь зашифруем текст « Пароль@1 »
секретным ключом «пароль» и добавим его в зашифрованные.свойства:
encrypted.property=ENC(uTSqb9grs1+vUv3iN8lItC0kl65lMG+8)
И давайте определим класс конфигурации AppConfigForJasyptStarter
— чтобы указать файлcrypted.properties
в качестве PropertySource
:
@Configuration
@PropertySource("encrypted.properties")
public class AppConfigForJasyptStarter {
}
Теперь мы напишем сервисный компонент PropertyServiceForJasyptStarter
для извлечения значений из зашифрованных
свойств . Расшифрованное значение можно получить с помощью аннотации @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("Password@1", service.getProperty());
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"Password@1",
service.getPasswordUsingEnvironment(environment));
}
3.2. Использование jasypt-spring-boot
Для проектов, не использующих @SpringBootApplication
или @EnableAutoConfiguration
, мы можем напрямую использовать зависимость jasypt -spring -boot
:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>2.0.0</version>
</dependency>
Точно так же зашифруем текст « Пароль@2 »
секретным ключом «пароль»
и добавим его в зашифрованные v2.properties
:
encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)
И давайте создадим новый класс конфигурации для зависимости jasypt-spring-boot.
Здесь нам нужно добавить аннотацию @EncryptablePropertySource
:
@Configuration
@EncryptablePropertySource("encryptedv2.properties")
public class AppConfigForJasyptSimple {
}
Кроме того, определен новый bean-компонент PropertyServiceForJasyptSimple
для возврата зашифрованных
v2.properties:
@Service
public class PropertyServiceForJasyptSimple {
@Value("${encryptedv2.property}")
private String property;
public String getProperty() {
return property;
}
}
Наконец, используя приведенный выше сервисный класс и установив секретный ключ, который мы использовали для шифрования, мы можем легко получить зашифрованное свойство v2.property:
@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
System.setProperty("jasypt.encryptor.password", "password");
PropertyServiceForJasyptSimple service = appCtx
.getBean(PropertyServiceForJasyptSimple.class);
assertEquals("Password@2", service.getProperty());
}
3.3. Использование пользовательского шифратора JASYPT
Шифрователи, определенные в разделе 3.1. и 3.2. строятся со значениями конфигурации по умолчанию.
Однако давайте определим наш собственный шифратор Jasypt и попробуем использовать его для нашего приложения.
S0, пользовательский bean-компонент шифрования будет выглядеть так:
@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.
Кроме того, нам нужно добавить свойство «jasypt.encryptor.bean»
в наш application.properties,
чтобы Spring Boot знал, какой Custom Encryptor следует использовать .
Например, мы добавляем пользовательский текст « Пароль@3 »
, зашифрованный секретным ключом «пароль»
в application.properties:
jasypt.encryptor.bean=encryptorBean
encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)
Как только мы его установим, мы можем легко получить зашифрованное свойство v3.property
из среды
Spring :
@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"Password@3",
environment.getProperty("encryptedv3.property"));
}
4. Вывод
Используя Jasypt, мы можем обеспечить дополнительную безопасность данных, которые обрабатывает приложение .
Это позволяет нам больше сосредоточиться на ядре нашего приложения, а также может использоваться для обеспечения пользовательского шифрования, если это необходимо.
Как всегда, полный код этого примера доступен на Github .