«1. Введение

Jasypt (упрощенное шифрование Java) Spring Boot предоставляет утилиты для шифрования источников свойств в приложениях 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.

Давайте теперь зашифруем текст «[email protected]» секретным ключом «пароль» и добавим его в зашифрованные.свойства:

encrypted.property=ENC(uTSqb9grs1+vUv3iN8lItC0kl65lMG+8)

И давайте определим класс конфигурации AppConfigForJasyptStarter – для укажите файлcrypted.properties как PropertySource :


@Configuration
@PropertySource("encrypted.properties")
public class AppConfigForJasyptStarter {
}

Теперь мы напишем сервисный компонент PropertyServiceForJasyptStarter для извлечения значений из зашифрованных.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, мы можем напрямую использовать зависимость jasypt-spring-boot:

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

Аналогичным образом зашифруем текст «[email protected] â € с секретным ключом «password» и добавьте его в зашифрованные 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.:

@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-компонент шифрования будет выглядеть так:

@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 знал, какой пользовательский шифратор он должен использовать.


Например, мы добавляем пользовательский текст «[электронная почта защищена]», зашифрованный секретным ключом «пароль» в application.properties: cryptv3.property из среды Spring:

jasypt.encryptor.bean=encryptorBean
encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)

4. Заключение

@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
    Environment environment = appCtx.getBean(Environment.class);
 
    assertEquals(
      "[email protected]", 
      environment.getProperty("encryptedv3.property"));
}

Используя Jasypt, мы можем обеспечить дополнительную безопасность данных, которые обрабатывает приложение.

Это позволяет нам больше сосредоточиться на ядре нашего приложения, а также может использоваться для обеспечения пользовательского шифрования, если это необходимо.

Как всегда, полный код этого примера доступен на Github.

«