Spring boot 2.x 和 3.0.0 的Jasypt集成
Jasypt Spring Boot 為 Spring Boot 應用程式中的屬性來源提供加密支援。
有 3 種方法可以將jasypt-spring-boot
整合到您的專案中:
@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、application -*.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 類別。例如:
@ 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 {
...
}
方便的是,還有一個@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
的依賴項。不需要啟動程序 jar 相依性。此方法對於引導程式上的加密屬性的早期存取很有用。雖然在大多數情況下不需要,但在自訂 Spring Boot 的 init 行為或與早期配置的某些功能(例如日誌配置)整合時可能會很有用。舉一個具體的例子,這種啟用可加密屬性的方法是唯一一種可以使用springProperty
標籤在logback-spring.xml
檔案中取代 Spring Properties 的方法。例如:
< 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 {
...
}
你的 crypto.properties 檔案看起來像這樣:
secret.property =ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
現在,當您執行environment.getProperty("secret.property")
或使用@Value("${secret.property}")
時,您得到的是secret.property
的解密版本。
當使用方法3( @EncryptablePropertySource
)時,您可以以相同的方式存取加密的屬性,唯一的區別是您必須將屬性放在@EncryptablePropertySource
註釋中聲明的資源中,以便可以正確解密屬性。
Jasypt 使用StringEncryptor
來解密屬性。對於所有 3 種方法,如果在 Spring 上下文中找不到自訂StringEncryptor
(詳細資訊請參閱自訂加密器部分),則會自動建立一個可以透過下列屬性(系統、屬性檔案、命令列參數、環境變量、 ETC。
鑰匙 | 必需的 | 預設值 |
jasypt.加密器.密碼 | 真的 | - |
jasypt.加密器.演算法 | 錯誤的 | PBEWITHHMACSHA512ANDAES_256 |
jasypt.cryptor.key-obtention-iterations | 錯誤的 | 1000 |
jasypt.加密器.池大小 | 錯誤的 | 1 |
jasypt.cryptor.provider-name | 錯誤的 | 太陽JCE |
jasypt.cryptor.provider-class-name | 錯誤的 | 無效的 |
jasypt.cryptor.salt-generator-classname | 錯誤的 | org.jasypt.salt.RandomSaltGenerator |
jasypt.cryptor.iv-生成器-類別名 | 錯誤的 | org.jasypt.iv.RandomIvGenerator |
jasypt.cryptor.字串輸出型 | 錯誤的 | 64位基數 |
jasypt.cryptor.proxy-property-sources | 錯誤的 | 錯誤的 |
jasypt.cryptor.skip-property-sources | 錯誤的 | 空列表 |
唯一需要的屬性是加密密碼,其餘的可以保留使用預設值。雖然所有這些屬性都可以在屬性檔案中聲明,但加密器密碼不應儲存在屬性檔案中,而應作為系統屬性、命令列參數或環境變數傳遞,並且只要其名稱為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 ;
}
請注意,bean 名稱是必需的,因為jasypt-spring-boot
從版本1.5
開始按名稱檢測自訂字串加密器。預設的 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
的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
進行的任何其他配置或覆寫都會停止工作,因為預設解析器是使用它們的。你必須自己接線所有這些東西。幸運的是,在大多數情況下您不必重寫此 bean,前面的選項就足夠了。
但正如您在實作中所看到的,加密屬性的偵測和解密是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 =「密碼」。
預設情況下,該外掛程式將考慮 ./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.plugin.old”而不是“jasypt.encryptor”的系統屬性提供的。
例如,要重新加密先前使用密碼 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.cryptor.privateKeyString | 無效的 | 用於解密的字串格式的私鑰 |
jasypt.cryptor.privateKeyLocation | 無效的 | spring 資源格式中用於解密的私鑰的位置 |
jasypt.cryptor.privateKeyFormat | 德 | 密鑰格式。 DER 或 PEM |
您應該使用privateKeyString
或privateKeyLocation
,如果設置,則字串格式優先。若要使用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 是一個全面的演示,展示了加密/解密屬性的所有可能方法,但還有其他多個演示單獨的場景。