Интеграция Jasypt для Spring boot 2.x и 3.0.0
Jasypt Spring Boot обеспечивает поддержку шифрования для источников свойств в приложениях Spring Boot.
Есть 3 способа интегрировать jasypt-spring-boot
в ваш проект:
jasypt-spring-boot-starter
в ваш путь к классам, если вы используете @SpringBootApplication
или @EnableAutoConfiguration
включит шифруемые свойства во всей среде Spring.jasypt-spring-boot
в ваш путь к классам и добавление @EnableEncryptableProperties
в ваш основной класс конфигурации, чтобы включить шифруемые свойства во всей среде Spring.jasypt-spring-boot
в ваш путь к классам и объявление отдельных источников зашифрованных свойств с помощью @EncrytablePropertySource
Используйте один из следующих трех методов (кратко объясненных выше):
Просто добавьте зависимость стартового jar-файла в свой проект, если ваше приложение Spring Boot использует @SpringBootApplication
или @EnableAutoConfiguration
, и шифруемые свойства будут включены во всей среде Spring (это означает, что любое системное свойство, свойство среды, аргумент командной строки, application.properties, приложение -*.properties, свойства yaml и любые другие источники свойств могут содержать зашифрованные свойства):
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot-starter</ artifactId >
< version >3.0.5</ version >
</ dependency >
ЕСЛИ вы не используете аннотации автоматической настройки @SpringBootApplication
или @EnableAutoConfiguration
, добавьте эту зависимость в свой проект:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
А затем добавьте @EnableEncryptableProperties
в свой класс конфигурации. Например:
@ Configuration
@ EnableEncryptableProperties
public class MyApplication {
...
}
Зашифрованные свойства будут включены во всей среде Spring (это означает, что любое системное свойство, свойство среды, аргумент командной строки, application.properties, свойства yaml и любые другие источники пользовательских свойств могут содержать зашифрованные свойства).
ЕСЛИ вы не используете аннотации автоматической настройки @SpringBootApplication
или @EnableAutoConfiguration
и не хотите включать шифруемые свойства во всей среде Spring, есть третий вариант. Сначала добавьте в свой проект следующую зависимость:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
Затем добавьте в свои файлы конфигурации столько аннотаций @EncryptablePropertySource
, сколько хотите. Точно так же, как вы делаете это с аннотацией @PropertySource
Spring. Например:
@ Configuration
@ EncryptablePropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
Удобно, что есть также аннотация @EncryptablePropertySources
, которую можно использовать для группировки аннотаций типа @EncryptablePropertySource
следующим образом:
@ Configuration
@ EncryptablePropertySources ({ @ EncryptablePropertySource ( "classpath:encrypted.properties" ),
@ EncryptablePropertySource ( "classpath:encrypted2.properties" )})
public class MyApplication {
...
}
Также обратите внимание, что начиная с версии 1.8 @EncryptablePropertySource
поддерживает файлы YAML.
По версии 1,7 1.15, для некоторых особых случаев существует четвертый метод включения шифруемых свойств. Предоставляется собственный класс ConfigurableEnvironment
: EncryptableEnvironment
StandardEncryptableEnvironment
и StandardEncryptableServletEnvironment
, которые можно использовать с SpringApplicationBuilder
для определения пользовательской среды следующим образом:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
Этот метод потребует только использования зависимости для jasypt-spring-boot
. Никакой зависимости от стартовой банки не требуется. Этот метод полезен для раннего доступа к зашифрованным свойствам при начальной загрузке. Хотя это не требуется в большинстве сценариев, оно может быть полезно при настройке поведения инициализации Spring Boot или интеграции с определенными возможностями, которые настраиваются очень рано, например, конфигурация ведения журнала. В качестве конкретного примера, этот метод включения шифруемых свойств является единственным, который работает с заменой Spring Properties в файлах logback-spring.xml
с использованием тега springProperty
. Например:
< springProperty name = " user " source = " db.user " />
< springProperty name = " password " source = " db.password " />
< appender name = " db " class = " ch.qos.logback.classic.db.DBAppender " >
< connectionSource
class = " ch.qos.logback.core.db.DriverManagerConnectionSource " >
< driverClass >org.postgresql.Driver</ driverClass >
< url >jdbc:postgresql://localhost:5432/simple</ url >
< user >${user}</ user >
< password >${password}</ password >
</ connectionSource >
</ appender >
Этот механизм можно использовать, например (как показано), для инициализации приложения ведения журнала базы данных, которое требует передачи конфиденциальных учетных данных. В качестве альтернативы, если необходимо предоставить собственный StringEncryptor
, для настройки предоставляется статический метод компоновщика StandardEncryptableEnvironment#builder
(возможны другие настройки):
StandardEncryptableEnvironment
. builder ()
. encryptor ( new MyEncryptor ())
. build ()
Это приведет к загрузке некоторой конфигурации, которая в основном выполняет две вещи:
StringEncryptor
по умолчанию, который можно настроить с помощью обычных свойств, системных свойств или аргументов командной строки. При использовании МЕТОДОВ 1 и 2 вы можете определить зашифрованные свойства в любом PropertySource, содержащемся в среде. Например, используя аннотацию @PropertySource:
@ SpringBootApplication
@ EnableEncryptableProperties
@ PropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
И ваш файл Encrypted.properties будет выглядеть примерно так:
secret.property =ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
Теперь, когда вы выполняете environment.getProperty("secret.property")
или используете @Value("${secret.property}")
вы получаете расшифрованную версию secret.property
.
При использовании МЕТОДА 3 ( @EncryptablePropertySource
) вы можете получить доступ к зашифрованным свойствам таким же образом, с той лишь разницей, что вы должны поместить свойства в ресурс, который был объявлен в аннотации @EncryptablePropertySource
, чтобы свойства можно было правильно расшифровать.
Jasypt использует StringEncryptor
для расшифровки свойств. Для всех трех методов, если в контексте Spring не найден пользовательский StringEncryptor
(подробности см. в разделе «Пользовательский шифратор»), он создается автоматически и может быть настроен с помощью следующих свойств (система, файл свойств, аргументы командной строки, переменная среды, и т. д.):
Ключ | Необходимый | Значение по умолчанию |
jasypt.encryptor.пароль | Истинный | - |
jasypt.encryptor.algorithm | ЛОЖЬ | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | ЛОЖЬ | 1000 |
jasypt.encryptor.размер пула | ЛОЖЬ | 1 |
jasypt.encryptor.имя-провайдера | ЛОЖЬ | SunJCE |
jasypt.encryptor.provider-имя-класса | ЛОЖЬ | нулевой |
jasypt.encryptor.salt-генератор-имя-класса | ЛОЖЬ | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-генератор-имя-класса | ЛОЖЬ | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | ЛОЖЬ | база64 |
jasypt.encryptor.proxy-property-sources | ЛОЖЬ | ЛОЖЬ |
jasypt.encryptor.skip-property-sources | ЛОЖЬ | пустой список |
Единственное необходимое свойство — это пароль шифрования, для остальных можно оставить значения по умолчанию. Хотя все эти свойства могут быть объявлены в файле свойств, пароль шифрования не следует хранить в файле свойств, его следует передавать как системное свойство, аргумент командной строки или переменную среды, и, если его имя — jasypt.encryptor.password
это сработает.
Последнее свойство, jasypt.encryptor.proxyPropertySources
используется для указания jasyp-spring-boot
, как значения свойств будут перехватываться для расшифровки. Значение по умолчанию false
использует пользовательские реализации оболочек PropertySource
, EnumerablePropertySource
и MapPropertySource
. Если для этого свойства указано true
, механизм перехвата будет использовать прокси-серверы CGLib для каждой конкретной реализации PropertySource
. Это может быть полезно в некоторых сценариях, где необходимо сохранить тип исходного PropertySource
.
Для пользовательской конфигурации шифратора и источника пароля шифратора вы всегда можете определить свой собственный bean-компонент StringEncryptor в контексте Spring, и шифратор по умолчанию будет игнорироваться. Например:
@ Bean ( "jasyptStringEncryptor" )
public StringEncryptor stringEncryptor () {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor ();
SimpleStringPBEConfig config = new SimpleStringPBEConfig ();
config . setPassword ( "password" );
config . setAlgorithm ( "PBEWITHHMACSHA512ANDAES_256" );
config . setKeyObtentionIterations ( "1000" );
config . setPoolSize ( "1" );
config . setProviderName ( "SunJCE" );
config . setSaltGeneratorClassName ( "org.jasypt.salt.RandomSaltGenerator" );
config . setIvGeneratorClassName ( "org.jasypt.iv.RandomIvGenerator" );
config . setStringOutputType ( "base64" );
encryptor . setConfig ( config );
return encryptor ;
}
Обратите внимание, что имя компонента является обязательным, поскольку jasypt-spring-boot
обнаруживает пользовательские шифраторы строк по имени, начиная с версии 1.5
. Имя компонента по умолчанию:
jasyptStringEncryptor
Но это также можно переопределить, определив свойство:
jasypt.encryptor.bean
Так, например, если вы определите jasypt.encryptor.bean=encryptorBean
, вы определите свой собственный шифратор с этим именем:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
...
}
Начиная с jasypt-spring-boot-1.10
появились новые точки расширения. EncryptablePropertySource
теперь использует EncryptablePropertyResolver
для разрешения всех свойств:
public interface EncryptablePropertyResolver {
String resolvePropertyValue ( String value );
}
Реализации этого интерфейса отвечают как за обнаружение , так и за расшифровку свойств. Реализация по умолчанию DefaultPropertyResolver
использует ранее упомянутый StringEncryptor
и новый EncryptablePropertyDetector
.
EncryptablePropertyDetector
Вы можете переопределить реализацию по умолчанию, предоставив Bean типа EncryptablePropertyDetector
с именем encryptablePropertyDetector
или, если вы хотите указать собственное имя bean-компонента, переопределить свойство jasypt.encryptor.property.detector-bean
и указать имя, которое вы хотите дать bean-компоненту. Предоставляя это, вы будете нести ответственность за обнаружение зашифрованных свойств. Пример:
private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
@ Override
public boolean isEncrypted ( String value ) {
if ( value != null ) {
return value . startsWith ( "ENC@" );
}
return false ;
}
@ Override
public String unwrapEncryptedValue ( String value ) {
return value . substring ( "ENC@" . length ());
}
}
@ Bean ( name = "encryptablePropertyDetector" )
public EncryptablePropertyDetector encryptablePropertyDetector () {
return new MyEncryptablePropertyDetector ();
}
prefix
и suffix
пользовательского зашифрованного свойства. Если все, что вам нужно, это иметь разные префиксы/суффиксы для зашифрованных свойств, вы можете продолжать использовать все реализации по умолчанию и просто переопределить следующие свойства в application.properties
(или application.yml
):
jasypt :
encryptor :
property :
prefix : " ENC@[ "
suffix : " ] "
EncryptablePropertyResolver
Вы можете переопределить реализацию по умолчанию, предоставив Bean типа EncryptablePropertyResolver
с именем encryptablePropertyResolver
или, если вы хотите указать собственное имя bean-компонента, переопределить свойство jasypt.encryptor.property.resolver-bean
и указать имя, которое вы хотите дать bean-компоненту. Предоставляя это, вы будете нести ответственность за обнаружение и расшифровку зашифрованных свойств. Пример:
class MyEncryptablePropertyResolver implements EncryptablePropertyResolver {
private final PooledPBEStringEncryptor encryptor ;
public MyEncryptablePropertyResolver ( char [] password ) {
this . encryptor = new PooledPBEStringEncryptor ();
SimpleStringPBEConfig config = new SimpleStringPBEConfig ();
config . setPasswordCharArray ( password );
config . setAlgorithm ( "PBEWITHHMACSHA512ANDAES_256" );
config . setKeyObtentionIterations ( "1000" );
config . setPoolSize ( 1 );
config . setProviderName ( "SunJCE" );
config . setSaltGeneratorClassName ( "org.jasypt.salt.RandomSaltGenerator" );
config . setIvGeneratorClassName ( "org.jasypt.iv.RandomIvGenerator" );
config . setStringOutputType ( "base64" );
encryptor . setConfig ( config );
}
@ Override
public String resolvePropertyValue ( String value ) {
if ( value != null && value . startsWith ( "{cipher}" )) {
return encryptor . decrypt ( value . substring ( "{cipher}" . length ()));
}
return value ;
}
}
@ Bean ( name = "encryptablePropertyResolver" )
EncryptablePropertyResolver encryptablePropertyResolver ( @ Value ( "${jasypt.encryptor.password}" ) String password ) {
return new MyEncryptablePropertyResolver ( password . toCharArray ());
}
Обратите внимание, что при переопределении EncryptablePropertyResolver
любая другая конфигурация или переопределения, которые вы можете иметь для префиксов, суффиксов, EncryptablePropertyDetector
и StringEncryptor
перестанут работать, поскольку их использует преобразователь по умолчанию. Вам придется подключить все это самому. К счастью, в большинстве случаев вам не нужно переопределять этот компонент, предыдущих вариантов должно быть достаточно.
Но, как вы можете видеть в реализации, обнаружение и расшифровка зашифрованных свойств являются внутренними для MyEncryptablePropertyResolver
jasypt-spring-boot:2.1.0
представляет новую функцию для указания фильтров свойств. Фильтр является частью API EncryptablePropertyResolver
и позволяет определить, какие свойства или источники свойств следует рассмотреть для расшифровки. Это происходит еще до того, как вы исследуете фактическое значение свойства для его поиска или попытки расшифровать. Например, по умолчанию из проверки исключаются все свойства, имена которых начинаются с jasypt.encryptor
. Это сделано для того, чтобы избежать циклических зависимостей во время загрузки, когда библиотечные компоненты настроены.
По умолчанию DefaultPropertyResolver
использует DefaultPropertyFilter
, который позволяет вам указать следующие списки шаблонов строк:
EncryptablePropertyFilter
Вы можете переопределить реализацию по умолчанию, предоставив bean-компонент типа EncryptablePropertyFilter
с именем encryptablePropertyFilter
или, если вы хотите указать собственное имя bean-компонента, переопределить свойство jasypt.encryptor.property.filter-bean
и указать имя, которое вы хотите дать bean-компоненту. Предоставляя это, вы будете нести ответственность за обнаружение свойств и/или источников свойств, которые вы хотите рассмотреть для расшифровки. Пример:
class MyEncryptablePropertyFilter implements EncryptablePropertyFilter {
public boolean shouldInclude ( PropertySource <?> source , String name ) {
return name . startsWith ( 'encrypted.' );
}
}
@ Bean ( name = "encryptablePropertyFilter" )
EncryptablePropertyFilter encryptablePropertyFilter () {
return new MyEncryptablePropertyFilter ();
}
Обратите внимание: чтобы этот механизм работал, вам не следует предоставлять собственный EncryptablePropertyResolver
, а использовать вместо него преобразователь по умолчанию. Если вы предоставляете собственный преобразователь, вы несете ответственность за весь процесс обнаружения и расшифровки свойств.
PropertySource
от самоанализаОпределите список полных имен классов, разделенных запятыми, которые будут пропущены при самоанализе. Эти классы не будут обернуты/проксированы этим плагином, и поэтому содержащиеся в них свойства не будут поддерживать шифрование/дешифрование:
jasypt.encryptor.skip-property-sources =org.springframework.boot.env.RandomValuePropertySource,org.springframework.boot.ansi.AnsiPropertySource
Зашифрованные свойства кэшируются внутри вашего приложения, и в определенных сценариях, например, при использовании внешней конфигурации с сервера конфигурации, свойства необходимо обновлять при их изменении. Для этого jasypt-spring-boot
регистрирует RefreshScopeRefreshedEventListener
, который по умолчанию прослушивает следующие события, чтобы очистить кеш зашифрованных свойств:
public static final List < String > EVENT_CLASS_NAMES = Arrays . asList (
"org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent" ,
"org.springframework.cloud.context.environment.EnvironmentChangeEvent" ,
"org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent"
);
Если вам необходимо зарегистрировать дополнительные события, которые вы хотели бы инициировать аннулирование зашифрованного кэша, вы можете добавить их, используя следующее свойство (через запятую, если требуется более одного):
jasypt.encryptor.refreshed-event-classes =org.springframework.boot.context.event.ApplicationStartedEvent
Плагин Maven снабжен рядом полезных утилит.
Чтобы использовать плагин, просто добавьте следующее в свой pom.xml:
< build >
< plugins >
< plugin >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-maven-plugin</ artifactId >
< version >3.0.5</ version >
</ plugin >
</ plugins >
</ build >
При использовании этого плагина самый простой способ указать пароль шифрования — через системное свойство, например -Djasypt.encryptor.password="пароль".
По умолчанию плагин будет учитывать конфигурацию шифрования в стандартных файлах конфигурации загрузки Spring в ./src/main/resources. Для предоставления этой конфигурации вы также можете использовать системные свойства или переменные среды.
Имейте в виду, что остальная часть кода и ресурсов вашего приложения недоступна для плагина, поскольку плагины Maven не используют общий путь к классам с проектами. Если ваше приложение предоставляет конфигурацию шифрования через компонент StringEncryptor, то это не будет принято.
В общем, рекомендуется просто полагаться на безопасную конфигурацию по умолчанию.
Чтобы зашифровать одно значение, выполните:
mvn jasypt:encrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " theValueYouWantToEncrypt "
Чтобы зашифровать заполнители в src/main/resources/application.properties
, просто оберните любую строку DEC(...)
. Например:
sensitive.password =DEC(secret value)
regular.property =example
Затем запустите:
mvn jasypt:encrypt -Djasypt.encryptor.password= " the password "
Это приведет к редактированию этого файла на месте, что приведет к:
sensitive.password =ENC(encrypted)
regular.property =example
Имя и местоположение файла можно настроить.
Чтобы расшифровать одно значение, выполните:
mvn jasypt:decrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " DbG1GppXOsFa2G69PnmADvQFI3esceEhJYbaEIKCcEO5C85JEqGAhfcjFMGnoRFf "
Чтобы расшифровать заполнители в src/main/resources/application.properties
, просто оберните любую строку ENC(...)
. Например:
sensitive.password =ENC(encrypted)
regular.property =example
Это можно расшифровать следующим образом:
mvn jasypt:decrypt -Djasypt.encryptor.password= " the password "
Что выведет расшифрованное содержимое на экран:
sensitive.password =DEC(decrypted)
regular.property =example
Обратите внимание, что вывод на экран, а не редактирование файла на месте, предназначен для уменьшения случайной передачи расшифрованных значений в систему контроля версий. При расшифровке вы, скорее всего, просто захотите проверить, какое значение было зашифровано, а не навсегда расшифровать это значение.
Изменение конфигурации существующих зашифрованных свойств немного неудобно при использовании целей шифрования/дешифрования. Вы должны запустить цель расшифровки, используя старую конфигурацию, затем скопировать расшифрованные выходные данные обратно в исходный файл, а затем запустить цель шифрования с новой конфигурацией.
Цель повторного шифрования упрощает эту задачу за счет повторного шифрования файла на месте. Необходимо предоставить 2 комплекта конфигурации. Новая конфигурация предоставляется так же, как и другие цели maven. Старая конфигурация предоставляется через системные свойства с префиксом «jasypt.plugin.old» вместо «jasypt.encryptor».
Например, чтобы повторно зашифровать файл application.properties, который ранее был зашифрован паролем СТАРЫЙ, а затем зашифровать новым паролем НОВЫЙ:
mvn jasypt:reencrypt -Djasypt.plugin.old.password=OLD -Djasypt.encryptor.password=NEW
Примечание. Вся старая конфигурация должна передаваться как системные свойства. Переменные среды и файлы конфигурации Spring Boot не поддерживаются.
Иногда конфигурация шифрования по умолчанию может меняться в зависимости от версии jasypt-spring-boot. Вы можете автоматически обновить зашифрованные свойства до новых значений по умолчанию с целью обновления. Это приведет к расшифровке вашего файла application.properties с использованием старой конфигурации по умолчанию и повторному шифрованию с использованием новой конфигурации по умолчанию.
mvn jasypt:upgrade -Djasypt.encryptor.password=EXAMPLE
Вы также можете передать системное свойство -Djasypt.plugin.old.major-version
чтобы указать версию, с которой вы обновляетесь. По умолчанию всегда будет использоваться последняя основная версия, в которой изменилась конфигурация. В настоящее время единственной основной версией, в которой изменены значения по умолчанию, является версия 2, поэтому нет необходимости задавать это свойство, но оно имеется для использования в будущем.
Вы также можете расшифровать файл свойств, загрузить все его свойства в память и сделать их доступными для Maven. Это полезно, если вы хотите сделать зашифрованные свойства доступными для других плагинов Maven.
Вы можете связать цели последующих плагинов сразу после этого. Например, с пролетным путем:
mvn jasypt:load flyway:migrate -Djasypt.encryptor.password= " the password "
Вы также можете указать префикс для каждого свойства с помощью -Djasypt.plugin.keyPrefix=example.
. Это помогает избежать потенциальных конфликтов с другими свойствами Maven.
Для всех вышеперечисленных утилит путь к файлу, который вы шифруете/дешифруете, по умолчанию равен file:src/main/resources/application.properties
.
Это можно изменить с помощью системного свойства -Djasypt.plugin.path
.
Вы можете зашифровать файл в каталоге тестовых ресурсов:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/test/application.properties " -Djasypt.encryptor.password= " the password "
Или с другим именем:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/flyway.properties " -Djasypt.encryptor.password= " the password "
Или с другим типом файла (плагин поддерживает любой текстовый формат файла, включая YAML):
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/application.yaml " -Djasypt.encryptor.password= " the password "
Обратите внимание, что цель загрузки поддерживает только файлы .property.
Вы можете переопределить любую конфигурацию Spring, которую вы поддерживаете в своем приложении, при запуске плагина, например, выбрав заданный профиль Spring:
mvn jasypt:encrypt -Dspring.profiles.active=cloud -Djasypt.encryptor.password= " the password "
Чтобы зашифровать/расшифровать свойства в многомодульных проектах, отключите рекурсию с помощью -N
или --non-recursive
в команде maven:
mvn jasypt:upgrade -Djasypt.plugin.path=file:server/src/test/resources/application-test.properties -Djasypt.encryptor.password=supersecret -N
jasypt-spring-boot:2.1.1
представляет новую функцию шифрования/дешифрования свойств с использованием асимметричного шифрования с парой частных/открытых ключей в форматах DER или PEM.
Ниже приведены свойства конфигурации, которые можно использовать для настройки асимметричного расшифрования свойств;
Ключ | Значение по умолчанию | Описание |
jasypt.encryptor.privateKeyString | нулевой | закрытый ключ для расшифровки в формате String |
jasypt.encryptor.privateKeyLocation | нулевой | расположение закрытого ключа для расшифровки в формате ресурса Spring |
jasypt.encryptor.privateKeyFormat | РЭД | Ключевой формат. ДЭР или ПЕМ |
Вам следует использовать либо privateKeyString
, либо privateKeyLocation
, формат String имеет приоритет, если он установлен. Чтобы указать закрытый ключ в формате DER с помощью privateKeyString
, закодируйте байты ключа в base64
.
Обратите внимание , что jasypt.encryptor.password
по-прежнему имеет приоритет для шифрования PBE над асимметричной конфигурацией.
jasypt :
encryptor :
privateKeyString: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtB/IYK8E52CYMZTpyIY9U0HqMewyKnRvSo6s+9VNIn/HSh9+MoBGiADa2MaPKvetS3CD3CgwGq/+LIQ1HQYGchRrSORizOcIp7KBx+Wc1riatV/tcpcuFLC1j6QJ7d2I+T7RA98Sx8X39orqlYFQVysTw/aTawX/yajx0UlTW3rNAY+ykeQ0CBHowtTxKM9nGcxLoQbvbYx1iG9JgAqye7TYejOpviOH+BpD8To2S8zcOSojIhixEfayay0gURv0IKJN2LP86wkpAuAbL+mohUq1qLeWdTEBrIRXjlnrWs1M66w0l/6JwaFnGOqEB6haMzE4JWZULYYpr2yKyoGCRAgMBAAECggEAQxURhs1v3D0wgx27ywO3zeoFmPEbq6G9Z6yMd5wk7cMUvcpvoNVuAKCUlY4pMjDvSvCM1znN78g/CnGF9FoxJb106Iu6R8HcxOQ4T/ehS+54kDvL999PSBIYhuOPUs62B/Jer9FfMJ2veuXb9sGh19EFCWlMwILEV/dX+MDyo1qQaNzbzyyyaXP8XDBRDsvPL6fPxL4r6YHywfcPdBfTc71/cEPksG8ts6um8uAVYbLIDYcsWopjVZY/nUwsz49xBCyRcyPnlEUJedyF8HANfVEO2zlSyRshn/F+rrjD6aKBV/yVWfTEyTSxZrBPl4I4Tv89EG5CwuuGaSagxfQpAQKBgQDXEe7FqXSaGk9xzuPazXy8okCX5pT6545EmqTP7/JtkMSBHh/xw8GPp+JfrEJEAJJl/ISbdsOAbU+9KAXuPmkicFKbodBtBa46wprGBQ8XkR4JQoBFj1SJf7Gj9ozmDycozO2Oy8a1QXKhHUPkbPQ0+w3efwoYdfE67ZodpFNhswKBgQDN9eaYrEL7YyD7951WiK0joq0BVBLK3rwO5+4g9IEEQjhP8jSo1DP+zS495t5ruuuuPsIeodA79jI8Ty+lpYqqCGJTE6muqLMJDiy7KlMpe0NZjXrdSh6edywSz3YMX1eAP5U31pLk0itMDTf2idGcZfrtxTLrpRffumowdJ5qqwKBgF+XZ+JRHDN2aEM0atAQr1WEZGNfqG4Qx4o0lfaaNs1+H+knw5kIohrAyvwtK1LgUjGkWChlVCXb8CoqBODMupwFAqKL/IDImpUhc/t5uiiGZqxE85B3UWK/7+vppNyIdaZL13a1mf9sNI/p2whHaQ+3WoW/P3R5z5uaifqM1EbDAoGAN584JnUnJcLwrnuBx1PkBmKxfFFbPeSHPzNNsSK3ERJdKOINbKbaX+7DlT4bRVbWvVj/jcw/c2Ia0QTFpmOdnivjefIuehffOgvU8rsMeIBsgOvfiZGx0TP3+CCFDfRVqjIBt3HAfAFyZfiP64nuzOERslL2XINafjZW5T0pZz8CgYAJ3UbEMbKdvIuK+uTl54R1Vt6FO9T5bgtHR4luPKoBv1ttvSC6BlalgxA0Ts/AQ9tCsUK2JxisUcVgMjxBVvG0lfq/EHpL0Wmn59SHvNwtHU2qx3Ne6M0nQtneCCfR78OcnqQ7+L+3YCMqYGJHNFSard+dewfKoPnWw0WyGFEWCg==
jasypt :
encryptor :
privateKeyLocation : classpath:private_key.der
jasypt :
encryptor :
privateKeyFormat : PEM
privateKeyString : |-
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtB/IYK8E52CYM
ZTpyIY9U0HqMewyKnRvSo6s+9VNIn/HSh9+MoBGiADa2MaPKvetS3CD3CgwGq/+L
IQ1HQYGchRrSORizOcIp7KBx+Wc1riatV/tcpcuFLC1j6QJ7d2I+T7RA98Sx8X39
orqlYFQVysTw/aTawX/yajx0UlTW3rNAY+ykeQ0CBHowtTxKM9nGcxLoQbvbYx1i
G9JgAqye7TYejOpviOH+BpD8To2S8zcOSojIhixEfayay0gURv0IKJN2LP86wkpA
uAbL+mohUq1qLeWdTEBrIRXjlnrWs1M66w0l/6JwaFnGOqEB6haMzE4JWZULYYpr
2yKyoGCRAgMBAAECggEAQxURhs1v3D0wgx27ywO3zeoFmPEbq6G9Z6yMd5wk7cMU
vcpvoNVuAKCUlY4pMjDvSvCM1znN78g/CnGF9FoxJb106Iu6R8HcxOQ4T/ehS+54
kDvL999PSBIYhuOPUs62B/Jer9FfMJ2veuXb9sGh19EFCWlMwILEV/dX+MDyo1qQ
aNzbzyyyaXP8XDBRDsvPL6fPxL4r6YHywfcPdBfTc71/cEPksG8ts6um8uAVYbLI
DYcsWopjVZY/nUwsz49xBCyRcyPnlEUJedyF8HANfVEO2zlSyRshn/F+rrjD6aKB
V/yVWfTEyTSxZrBPl4I4Tv89EG5CwuuGaSagxfQpAQKBgQDXEe7FqXSaGk9xzuPa
zXy8okCX5pT6545EmqTP7/JtkMSBHh/xw8GPp+JfrEJEAJJl/ISbdsOAbU+9KAXu
PmkicFKbodBtBa46wprGBQ8XkR4JQoBFj1SJf7Gj9ozmDycozO2Oy8a1QXKhHUPk
bPQ0+w3efwoYdfE67ZodpFNhswKBgQDN9eaYrEL7YyD7951WiK0joq0BVBLK3rwO
5+4g9IEEQjhP8jSo1DP+zS495t5ruuuuPsIeodA79jI8Ty+lpYqqCGJTE6muqLMJ
Diy7KlMpe0NZjXrdSh6edywSz3YMX1eAP5U31pLk0itMDTf2idGcZfrtxTLrpRff
umowdJ5qqwKBgF+XZ+JRHDN2aEM0atAQr1WEZGNfqG4Qx4o0lfaaNs1+H+knw5kI
ohrAyvwtK1LgUjGkWChlVCXb8CoqBODMupwFAqKL/IDImpUhc/t5uiiGZqxE85B3
UWK/7+vppNyIdaZL13a1mf9sNI/p2whHaQ+3WoW/P3R5z5uaifqM1EbDAoGAN584
JnUnJcLwrnuBx1PkBmKxfFFbPeSHPzNNsSK3ERJdKOINbKbaX+7DlT4bRVbWvVj/
jcw/c2Ia0QTFpmOdnivjefIuehffOgvU8rsMeIBsgOvfiZGx0TP3+CCFDfRVqjIB
t3HAfAFyZfiP64nuzOERslL2XINafjZW5T0pZz8CgYAJ3UbEMbKdvIuK+uTl54R1
Vt6FO9T5bgtHR4luPKoBv1ttvSC6BlalgxA0Ts/AQ9tCsUK2JxisUcVgMjxBVvG0
lfq/EHpL0Wmn59SHvNwtHU2qx3Ne6M0nQtneCCfR78OcnqQ7+L+3YCMqYGJHNFSa
rd+dewfKoPnWw0WyGFEWCg==
-----END PRIVATE KEY-----
jasypt :
encryptor :
privateKeyFormat : PEM
privateKeyLocation : classpath:private_key.pem
Не существует программы/команды для шифрования свойств с использованием асимметричных ключей, но вы можете использовать следующий фрагмент кода для шифрования своих свойств:
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricConfig ;
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricStringEncryptor ;
import org . jasypt . encryption . StringEncryptor ;
public class PropertyEncryptor {
public static void main ( String [] args ) {
SimpleAsymmetricConfig config = new SimpleAsymmetricConfig ();
config . setPublicKey ( "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQfyGCvBOdgmDGU6ciGPVNB6jHsMip0b0qOrPvVTSJ/x0offjKARogA2tjGjyr3rUtwg9woMBqv/iyENR0GBnIUa0jkYsznCKeygcflnNa4mrVf7XKXLhSwtY+kCe3diPk+0QPfEsfF9/aK6pWBUFcrE8P2k2sF/8mo8dFJU1t6zQGPspHkNAgR6MLU8SjPZxnMS6EG722MdYhvSYAKsnu02Hozqb4jh/gaQ/E6NkvM3DkqIyIYsRH2smstIFEb9CCiTdiz/OsJKQLgGy/pqIVKtai3lnUxAayEV45Z61rNTOusNJf+icGhZxjqhAeoWjMxOCVmVC2GKa9sisqBgkQIDAQAB" );
StringEncryptor encryptor = new SimpleAsymmetricStringEncryptor ( config );
String message = "chupacabras" ;
String encrypted = encryptor . encrypt ( message );
System . out . printf ( "Encrypted message %s n " , encrypted );
}
}
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricConfig ;
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricStringEncryptor ;
import org . jasypt . encryption . StringEncryptor ;
import static com . ulisesbocchio . jasyptspringboot . util . AsymmetricCryptography . KeyFormat . PEM ;
public class PropertyEncryptor {
public static void main ( String [] args ) {
SimpleAsymmetricConfig config = new SimpleAsymmetricConfig ();
config . setKeyFormat ( PEM );
config . setPublicKey ( "-----BEGIN PUBLIC KEY----- n " +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQfyGCvBOdgmDGU6ciGP n " +
"VNB6jHsMip0b0qOrPvVTSJ/x0offjKARogA2tjGjyr3rUtwg9woMBqv/iyENR0GB n " +
"nIUa0jkYsznCKeygcflnNa4mrVf7XKXLhSwtY+kCe3diPk+0QPfEsfF9/aK6pWBU n " +
"FcrE8P2k2sF/8mo8dFJU1t6zQGPspHkNAgR6MLU8SjPZxnMS6EG722MdYhvSYAKs n " +
"nu02Hozqb4jh/gaQ/E6NkvM3DkqIyIYsRH2smstIFEb9CCiTdiz/OsJKQLgGy/pq n " +
"IVKtai3lnUxAayEV45Z61rNTOusNJf+icGhZxjqhAeoWjMxOCVmVC2GKa9sisqBg n " +
"kQIDAQAB n " +
"-----END PUBLIC KEY----- n " );
StringEncryptor encryptor = new SimpleAsymmetricStringEncryptor ( config );
String message = "chupacabras" ;
String encrypted = encryptor . encrypt ( message );
System . out . printf ( "Encrypted message %s n " , encrypted );
}
}
Начиная с версии 3.0.5 поддерживается шифрование AES 256-GCM. Чтобы использовать этот тип шифрования, установите свойство jasypt.encryptor.gcm-secret-key-string
, jasypt.encryptor.gcm-secret-key-location
или jasypt.encryptor.gcm-secret-key-password
.
В качестве базового алгоритма используется AES/GCM/NoPadding
поэтому убедитесь, что он установлен в вашем JDK.
SimpleGCMByteEncryptor
использует IVGenerator
для шифрования свойств. Вы можете настроить это с помощью свойства jasypt.encryptor.iv-generator-classname
если не хотите использовать реализацию по умолчанию RandomIvGenerator
При использовании ключа через jasypt.encryptor.gcm-secret-key-string
или jasypt.encryptor.gcm-secret-key-location
убедитесь, что вы закодировали свой ключ в base64. Строковое значение base64 может быть установлено в jasypt.encryptor.gcm-secret-key-string
или просто сохранить его в файле и использовать локатор ресурсов Spring для этого файла в свойстве jasypt.encryptor.gcm-secret-key-location
. Например:
jasypt.encryptor.gcm-secret-key-string = " PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU= "
# OR
jasypt.encryptor.gcm-secret-key-location =classpath:secret_key.b64
# OR
jasypt.encryptor.gcm-secret-key-location =file:/full/path/secret_key.b64
# OR
jasypt.encryptor.gcm-secret-key-location =file:relative/path/secret_key.b64
При желании вы можете создать свой собственный компонент StringEncryptor
:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKey ( "PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU=" );
return new SimpleGCMStringEncryptor ( config );
}
Альтернативно вы можете использовать пароль для шифрования/дешифрования свойств с помощью AES 256-GCM. Пароль используется для генерации ключа при запуске, поэтому вам необходимо/можно установить несколько свойств, а именно:
jasypt.encryptor.gcm-secret-key-password = " chupacabras "
# Optional, defaults to "1000"
jasypt.encryptor.key-obtention-iterations = " 1000 "
# Optional, defaults to 0, no salt. If provided, specify the salt string in ba64 format
jasypt.encryptor.gcm-secret-key-salt = " HrqoFr44GtkAhhYN+jP8Ag== "
# Optional, defaults to PBKDF2WithHmacSHA256
jasypt.encryptor.gcm-secret-key-algorithm = " PBKDF2WithHmacSHA256 "
Убедитесь, что эти параметры одинаковы, если вы шифруете свои секреты с помощью внешних инструментов. При желании вы можете создать свой собственный компонент StringEncryptor
:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKeyPassword ( "chupacabras" );
config . setSecretKeyIterations ( 1000 );
config . setSecretKeySalt ( "HrqoFr44GtkAhhYN+jP8Ag==" );
config . setSecretKeyAlgorithm ( "PBKDF2WithHmacSHA256" );
return new SimpleGCMStringEncryptor ( config );
}
Вы можете использовать плагин Maven или следовать аналогичной стратегии, как описано в разделе «Свойства шифрования асимметричного шифрования».
Репозиторий jasypt-spring-boot-demo-samples содержит рабочие примеры приложений Spring Boot. Основное демонстрационное приложение jasypt-spring-boot-demo явно устанавливает для системного свойства пароль шифрования перед запуском приложения. Чтобы получить более реалистичный сценарий, попробуйте удалить строку, в которой установлено системное свойство, создайте приложение с помощью maven и запустите:
java -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password
И вы передадите пароль шифрования в качестве аргумента командной строки. Запустите это следующим образом:
java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar
И вы передадите пароль шифрования как системное свойство.
Если вам нужно передать это свойство как переменную среды, вы можете сделать это, создав application.properties или application.yml и добавив:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
или в YAML
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD:}
в основном это означает определение свойства jasypt.encryptor.password
, указывающего на другое свойство JASYPT_ENCRYPTOR_PASSWORD
, которое вы можете установить с помощью переменной среды, а также можете переопределить через свойства системы. Этот метод также можно использовать для перевода имени/значения свойств для любой другой необходимой вам библиотеки. Это также доступно в демо-приложении. Итак, вы можете запустить демо-приложение следующим образом:
JASYPT_ENCRYPTOR_PASSWORD=password java -jar target/jasypt-spring-boot-demo-1.5-SNAPSHOT.jar
Примечание. При использовании Gradle в качестве инструмента сборки задача ProcessResources завершается сбоем из-за символа «$». Чтобы решить эту проблему, вам просто нужно экранировать эту переменную, например, «$».
Хотя jasypt-spring-boot-demo — это комплексная демонстрация, демонстрирующая все возможные способы шифрования/дешифрования свойств, существуют и другие несколько демонстраций, демонстрирующих отдельные сценарии.