Spring boot 2.x 및 3.0.0을 위한 Jasypt 통합
Jasypt Spring Boot는 Spring Boot 애플리케이션의 속성 소스에 대한 암호화 지원을 제공합니다.
프로젝트에 jasypt-spring-boot
통합하는 방법에는 3가지가 있습니다.
@SpringBootApplication
또는 @EnableAutoConfiguration
사용하는 경우 간단히 스타터 jar jasypt-spring-boot-starter
클래스 경로에 추가하면 전체 Spring 환경에서 암호화 가능한 속성이 활성화됩니다.jasypt-spring-boot
추가하고 기본 구성 클래스에 @EnableEncryptableProperties
추가하여 전체 Spring 환경에서 암호화 가능한 속성을 활성화합니다.jasypt-spring-boot
추가하고 @EncrytablePropertySource
사용하여 암호화 가능한 개별 속성 소스 선언 다음 3가지 방법 중 하나를 사용하십시오(위에서 간략하게 설명).
Spring Boot 애플리케이션이 @SpringBootApplication
또는 @EnableAutoConfiguration
사용하고 암호화 가능한 속성이 전체 Spring 환경에서 활성화되는 경우 프로젝트에 스타터 jar 종속성을 추가하기만 하면 됩니다. 이는 모든 시스템 속성, 환경 속성, 명령줄 인수, 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
주석을 추가하세요. Spring의 @PropertySource
주석과 마찬가지로. 예를 들어:
@ Configuration
@ EncryptablePropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
편리하게도 다음과 같이 @EncryptablePropertySource
유형의 주석을 그룹화하는 데 사용할 수 있는 @EncryptablePropertySources
주석도 있습니다.
@ Configuration
@ EncryptablePropertySources ({ @ EncryptablePropertySource ( "classpath:encrypted.properties" ),
@ EncryptablePropertySource ( "classpath:encrypted2.properties" )})
public class MyApplication {
...
}
또한 버전 1.8부터 @EncryptablePropertySource
YAML 파일을 지원합니다.
버전 기준 1.7 1.15에는 일부 특수한 경우에 암호화 가능한 속성을 활성화하는 네 번째 방법이 있습니다. 사용자 정의 ConfigurableEnvironment
클래스가 제공됩니다. EncryptableEnvironment
SpringApplicationBuilder
와 함께 사용하여 사용자 정의 환경을 다음과 같이 정의할 수 있는 StandardEncryptableEnvironment
및 StandardEncryptableServletEnvironment
:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
이 방법에서는 jasypt-spring-boot
에 대한 종속성을 사용해야 합니다. 스타터 jar 종속성은 필요하지 않습니다. 이 방법은 부트스트랩에서 암호화된 속성에 조기에 액세스하는 데 유용합니다. 대부분의 시나리오에서는 필요하지 않지만 Spring Boot의 초기화 동작을 사용자 정의하거나 로깅 구성과 같이 매우 초기에 구성된 특정 기능과 통합할 때 유용할 수 있습니다. 구체적인 예를 들어, 암호화 가능한 속성을 활성화하는 이 방법은 springProperty
태그를 사용하여 logback-spring.xml
파일에서 Spring 속성 교체와 함께 작동하는 유일한 방법입니다. 예를 들어:
< 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 >
이 메커니즘은 예를 들어 (표시된 대로) 중요한 자격 증명을 전달해야 하는 Database Logging 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 {
...
}
암호화된.properties 파일은 다음과 같습니다.
secret.property =ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
이제 environment.getProperty("secret.property")
수행하거나 @Value("${secret.property}")
사용하면 secret.property
의 해독된 버전을 얻게 됩니다.
방법 3( @EncryptablePropertySource
)을 사용하면 동일한 방식으로 암호화된 속성에 액세스할 수 있습니다. 유일한 차이점은 속성을 올바르게 해독할 수 있도록 @EncryptablePropertySource
주석 내에 선언된 리소스에 속성을 넣어야 한다는 것입니다.
Jasypt는 StringEncryptor
를 사용하여 속성을 해독합니다. 세 가지 방법 모두에 대해 사용자 정의 StringEncryptor
(자세한 내용은 사용자 정의 암호화 섹션 참조)가 Spring 컨텍스트에서 발견되지 않으면 다음 속성(시스템, 속성 파일, 명령줄 인수, 환경 변수, 등.):
열쇠 | 필수의 | 기본값 |
jasypt.encryptor.비밀번호 | 진실 | - |
jasypt.encryptor.알고리즘 | 거짓 | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | 거짓 | 1000 |
jasypt.encryptor.pool-크기 | 거짓 | 1 |
jasypt.encryptor.provider-이름 | 거짓 | SunJCE |
jasypt.encryptor.provider-클래스-이름 | 거짓 | null |
jasypt.encryptor.salt-generator-classname | 거짓 | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-클래스 이름 | 거짓 | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | 거짓 | 베이스64 |
jasypt.encryptor.proxy-속성-소스 | 거짓 | 거짓 |
jasypt.encryptor.skip-속성-소스 | 거짓 | 빈 목록 |
필요한 유일한 속성은 암호화 비밀번호이며, 나머지는 기본값을 사용하도록 남겨둘 수 있습니다. 이 모든 속성은 속성 파일에서 선언될 수 있지만 암호화기 비밀번호는 속성 파일에 저장되어서는 안 되며 이름이 jasypt.encryptor.password
인 한 시스템 속성, 명령줄 인수 또는 환경 변수로 전달되어야 합니다. jasypt.encryptor.password
작동할 겁니다.
마지막 속성인 jasypt.encryptor.proxyPropertySources
암호 해독을 위해 속성 값을 가로채는 방법을 jasyp-spring-boot
나타내는 데 사용됩니다. 기본값인 false
PropertySource
, EnumerablePropertySource
및 MapPropertySource
의 사용자 정의 래퍼 구현을 사용합니다. 이 속성에 대해 true
지정되면 차단 메커니즘은 각 특정 PropertySource
구현에서 CGLib 프록시를 사용합니다. 이는 원래 PropertySource
의 유형을 유지해야 하는 일부 시나리오에서 유용할 수 있습니다.
암호화기의 사용자 정의 구성과 암호화기 비밀번호 소스의 경우 항상 Spring 컨텍스트에서 자체 StringEncryptor Bean을 정의할 수 있으며 기본 암호화기는 무시됩니다. 예를 들어:
@ 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
제공 encryptablePropertyDetector
라는 이름의 EncryptablePropertyDetector
유형의 Bean을 제공하여 기본 구현을 재정의할 수 있습니다. 또는 자신만의 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
제공 encryptablePropertyResolver
라는 이름의 EncryptablePropertyResolver
유형의 Bean을 제공하여 기본 구현을 재정의할 수 있습니다. 또는 자신만의 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
속성 필터를 지정하는 새로운 기능이 도입되었습니다. 필터는 EncryptablePropertyResolver
API의 일부이며 암호 해독을 위해 고려할 속성 또는 속성 소스를 결정할 수 있습니다. 이는 실제 속성 값을 검사하여 검색하거나 암호 해독을 시도하기 전입니다. 예를 들어, 기본적으로 이름이 jasypt.encryptor
로 시작하는 모든 속성은 검사에서 제외됩니다. 이는 라이브러리 Bean이 구성될 때 로드 시 순환 종속성을 피하기 위한 것입니다.
기본적으로 DefaultPropertyResolver
다음 문자열 패턴 목록을 지정할 수 있는 DefaultPropertyFilter
사용합니다.
EncryptablePropertyFilter
제공 encryptablePropertyFilter
라는 이름을 가진 EncryptablePropertyFilter
유형의 Bean을 제공하여 기본 구현을 재정의할 수 있습니다. 또는 자신만의 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="thepassword")을 사용하는 것입니다.
기본적으로 플러그인은 ./src/main/resources 아래의 표준 Spring 부팅 구성 파일에서 암호화 구성을 고려합니다. 시스템 속성이나 환경 변수를 사용하여 이 구성을 제공할 수도 있습니다.
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.encryptor" 대신 "jasypt.plugin.old" 접두어가 붙은 시스템 속성을 통해 제공됩니다.
예를 들어 이전에 OLD 비밀번호로 암호화된 application.properties를 다시 암호화한 다음 새 비밀번호 NEW로 암호화하려면 다음을 수행합니다.
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 파일만 지원합니다.
예를 들어 특정 스프링 프로필을 선택하는 등 플러그인을 실행할 때 애플리케이션에서 지원하는 모든 스프링 구성을 재정의할 수 있습니다.
mvn jasypt:encrypt -Dspring.profiles.active=cloud -Djasypt.encryptor.password= " the password "
다중 모듈 프로젝트의 속성을 암호화/해독하려면 maven 명령에서 -N
또는 --non-recursive
사용하여 재귀를 비활성화합니다.
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 | null | 문자열 형식의 복호화용 개인 키 |
jasypt.encryptor.privateKeyLocation | null | 스프링 리소스 형식의 암호 해독을 위한 개인 키의 위치 |
jasypt.encryptor.privateKeyFormat | DER | 키 형식. DER 또는 PEM |
privateKeyString
또는 privateKeyLocation
사용해야 합니다. 설정된 경우 문자열 형식이 우선 적용됩니다. privateKeyString
사용하여 DER 형식의 개인 키를 지정하려면 키 바이트를 base64
로 인코딩하세요.
jasypt.encryptor.password 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
사용하여 속성을 암호화합니다. 기본 구현인 RandomIvGenerator
사용하지 않으려면 jasypt.encryptor.iv-generator-classname
속성을 사용하여 이를 구성할 수 있습니다.
jasypt.encryptor.gcm-secret-key-string
또는 jasypt.encryptor.gcm-secret-key-location
통해 키를 사용하는 경우 base64에서 키를 인코딩해야 합니다. base64 문자열 값은 jasypt.encryptor.gcm-secret-key-string
으로 설정하거나 파일에 저장하고 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을 생성할 수 있습니다.
@ 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는 속성을 암호화/해독하는 가능한 모든 방법을 보여주는 포괄적인 데모이지만, 격리된 시나리오를 시연하는 다른 여러 데모도 있습니다.