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

Конфигурация весенней загрузки с 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.