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
メインの Configuration クラスに追加して、Spring 環境全体で暗号化可能なプロパティを有効にします。jasypt-spring-boot
クラスパスに追加し、 @EncrytablePropertySource
を使用して個々の暗号化可能なプロパティ ソースを宣言する次の 3 つの方法のいずれかを使用します (上で簡単に説明しました)。
Spring Boot アプリケーションが@SpringBootApplication
または@EnableAutoConfiguration
使用している場合は、スターター jar の依存関係をプロジェクトに追加するだけで、暗号化可能なプロパティが 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
Auto Configuration アノテーションを使用しない場合は、この依存関係をプロジェクトに追加します。
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
次に、 @EnableEncryptableProperties
を Configuration クラスに追加します。例えば:
@ Configuration
@ EnableEncryptableProperties
public class MyApplication {
...
}
また、暗号化可能なプロパティは Spring 環境全体で有効になります (これは、システム プロパティ、環境プロパティ、コマンド ライン引数、application.properties、yaml プロパティ、およびその他のカスタム プロパティ ソースに暗号化されたプロパティを含めることができることを意味します)。
@SpringBootApplication
または@EnableAutoConfiguration
自動構成アノテーションを使用せず、Spring 環境全体で暗号化可能なプロパティを有効にしたくない場合は、3 番目のオプションがあります。まず、次の依存関係をプロジェクトに追加します。
< 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 では、いくつかの特殊な場合に備えて、暗号化可能なプロパティを有効にする 4 番目の方法が存在します。カスタムConfigurableEnvironment
クラスが提供されます。 EncryptableEnvironment
SpringApplicationBuilder
で次のようにカスタム環境を定義するために使用できるStandardEncryptableEnvironment
およびStandardEncryptableServletEnvironment
:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
この方法ではjasypt-spring-boot
の依存関係を使用するだけで済みます。スターター jar への依存関係は必要ありません。このメソッドは、ブートストラップで暗号化されたプロパティに早期にアクセスする場合に役立ちます。ほとんどのシナリオでは必須ではありませんが、Spring Boot の init 動作をカスタマイズしたり、ロギング構成などの非常に早い段階で構成された特定の機能と統合したりする場合に役立つ可能性があります。具体的な例として、暗号化可能なプロパティを有効にするこの方法は、 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 ()
これにより、基本的に次の 2 つのことを実行するいくつかの構成がロードされます。
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
を使用してプロパティを復号化します。 3 つのメソッドすべてについて、Spring コンテキストでカスタムStringEncryptor
(詳細については「カスタム エンクリプタ」セクションを参照) が見つからない場合は、次のプロパティ (システム、プロパティ ファイル、コマンド ライン引数、環境変数、等。):
鍵 | 必須 | デフォルト値 |
jasypt.encryptor.パスワード | 真実 | - |
jasypt.encryptor.algorithm | 間違い | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | 間違い | 1000 |
jasypt.encryptor.pool-size | 間違い | 1 |
jasypt.encryptor.プロバイダ名 | 間違い | SunJCE |
jasypt.encryptor.プロバイダクラス名 | 間違い | ヌル |
jasypt.encryptor.salt-generator-classname | 間違い | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-classname | 間違い | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | 間違い | Base64 |
jasypt.encryptor.proxy-property-sources | 間違い | 間違い |
jasypt.encryptor.skip-property-sources | 間違い | 空のリスト |
必要なプロパティは暗号化パスワードのみで、残りはデフォルト値を使用したままにすることができます。これらのプロパティはすべてプロパティ ファイルで宣言できますが、暗号化パスワードはプロパティ ファイルに保存する必要はなく、システム プロパティ、コマンド ライン引数、または環境変数として、その名前が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 ;
}
バージョン1.5
では、 jasypt-spring-boot
名前でカスタム文字列エンサイプターを検出するため、Bean 名が必要であることに注意してください。デフォルトの Bean 名は次のとおりです。
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
タイプの Bean に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
を提供するEncryptablePropertyResolver
タイプの Bean に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
に対するその他の設定またはオーバーライドは、デフォルトのリゾルバーが使用するものであるため機能しなくなります。そういったものはすべて自分で配線する必要があります。幸いなことに、ほとんどの場合、この Bean をオーバーライドする必要はなく、前のオプションで十分です。
ただし、実装でわかるように、暗号化されたプロパティの検出と復号化はMyEncryptablePropertyResolver
の内部で行われます。
jasypt-spring-boot:2.1.0
プロパティ フィルターを指定する新しい機能が導入されています。このフィルターはEncryptablePropertyResolver
API の一部であり、復号化のためにどのプロパティまたはプロパティ ソースを検討するかを決定できます。これは、実際のプロパティ値を調べて検索したり、解読を試みたりする前です。たとえば、デフォルトでは、名前がjasypt.encryptor
で始まるすべてのプロパティが検査から除外されます。これは、ライブラリ Bean が構成されているときのロード時の循環依存関係を回避するためです。
デフォルトでは、 DefaultPropertyResolver
DefaultPropertyFilter
を使用します。これにより、次の文字列パターン リストを指定できます。
EncryptablePropertyFilter
を提供するEncryptablePropertyFilter
タイプの Bean に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="パスワード") を使用することです。
デフォルトでは、プラグインは ./src/main/resources にある標準の Spring Boot 構成ファイル内の暗号化構成を考慮します。システム プロパティまたは環境変数を使用して、この構成を指定することもできます。
Maven プラグインはプロジェクトとクラスパスを共有しないため、残りのアプリケーション コードとリソースはプラグインでは利用できないことに注意してください。アプリケーションが StringEncryptor Bean 経由で暗号化構成を提供する場合、これは選択されません。
一般に、安全なデフォルト構成のみに依存することをお勧めします。
単一の値を暗号化するには、次のコマンドを実行します。
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 ファイルのみをサポートすることに注意してください
プラグインの実行時に、アプリケーションでサポートする Spring 構成をオーバーライドできます。たとえば、特定の Spring プロファイルを選択します。
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 | ヌル | 文字列形式の復号化用の秘密キー |
jasypt.encryptor.privateKeyLocation | ヌル | Springリソース形式の復号化用の秘密キーの場所 |
jasypt.encryptor.privateKeyFormat | DER | キーの形式。 DER または PEM |
privateKeyString
またはprivateKeyLocation
を使用する必要があります。設定されている場合は String 形式が優先されます。 privateKeyString
を使用して秘密鍵を DER 形式で指定するには、鍵バイトをbase64
にエンコードしてください。
PBE 暗号化では、 jasypt.encryptor.password
非対称構成よりも優先されることに注意してください。
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
のそのファイルに対する Spring リソース ロケーターを使用することもできます。例えば:
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 を作成できます。
@ 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 は、プロパティを暗号化/復号化するすべての可能な方法を紹介する包括的なデモですが、個別のシナリオをデモする他の複数のデモもあります。