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 .