Перейти к основному содержимому

Конфигурация Spring Boot с Jasypt

· 4 мин. чтения

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 .