一、使用步驟介紹
使用Jasypt(Java Simplified Encryption)進行數據加密和解密主要涉及幾個步驟,包括引入依賴、配置加密密碼、加密敏感信息、將加密信息存儲到配置文件中,以及應用程序啟動時自動解密。以下是詳細的使用說明:
1. 引入依賴
首先,你需要在你的項目中引入Jasypt的依賴。如果你是使用Maven構建項目,可以在pom.xml
文件中添加如下依賴(注意版本號可能隨時間更新,請參考最新版本):
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>
可根據需要替換成最新的版本號。
2. 配置加密密碼
Jasypt需要一個密碼來進行加密和解密操作。你可以通過以下幾種方式配置這個密碼:
-
在配置文件中指定:在你的
application.properties
或application.yml
配置文件中,添加jasypt.encryptor.password
配置項,并設置你的密碼。例如:# application.properties jasypt.encryptor.password=your_encryption_password
或者,在
application.yml
中:jasypt:encryptor:password: your_encryption_password
然而,將密碼直接寫在配置文件中可能存在安全風險。因此,更推薦的做法是通過啟動參數或環境變量來傳遞這個密碼。
-
通過啟動參數指定:在啟動應用程序時,可以通過
-Djasypt.encryptor.password=your_encryption_password
參數來指定加密密碼。 -
使用環境變量:在某些情況下,使用環境變量來存儲敏感信息(如加密密碼)可能更為安全。具體方法取決于你的應用程序部署環境。
3. 加密敏感信息
在配置加密密碼后,你可以使用Jasypt提供的工具或API來加密你的敏感信息。加密后的信息將以密文形式存儲。
-
使用Jasypt CLI工具:Jasypt提供了一個命令行界面(CLI)工具,允許你在命令行中加密和解密字符串。你需要下載Jasypt的jar包,并在命令行中運行相應的命令。
-
使用Jasypt API:在你的Java應用程序中,你可以通過注入
StringEncryptor
接口的實現類來編程方式加密和解密字符串。這通常在你的Spring Boot應用程序中通過自動裝配完成。
4. 將加密信息存儲到配置文件中
加密敏感信息后,你需要將這些加密后的信息存儲到配置文件中。在Jasypt中,加密后的信息通常以ENC(...)
的形式出現,括號內是加密后的密文。例如:
# application.properties
datasource.password=ENC(加密后的密碼)
5. 應用程序啟動時自動解密
當你的Spring Boot應用程序啟動時,Jasypt會自動檢測配置文件中的ENC(...)
字符串,并使用你配置的加密密碼來解密這些字符串。解密后的明文將用于應用程序的配置中。
注意事項
- 安全性:確保你的加密密碼足夠復雜且安全存儲,避免將密碼直接寫在配置文件中。
- 版本兼容性:注意你使用的Jasypt版本與其他庫或框架的兼容性。
- 算法選擇:Jasypt支持多種加密算法,你可以根據需要在配置文件中指定加密算法。
通過以上步驟,你可以在你的Spring Boot應用程序中使用Jasypt來加密和解密配置文件中的敏感信息。
二、使用示例代碼
1、通過工具類生成密文
在application.properties 中增加配置,或者通過-Djasypt.encryptor.password=123456
參數來指定加密密碼
# 用于加密的密碼
jasypt.encryptor.password=123456
使用 stringEncryptor.encrypt()
生成密文
public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);}
}
2、在application.properties 中增加配置密文
# 加密后的密文,包裹在ENC() 中
datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)
# 用于加密的密碼
jasypt.encryptor.password=123456
3、使用 @Value()
獲取明文,也可以通過stringEncryptor.decrypt(encrypt)
手動解密
@SpringBootTest
public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);// 解密,輸入獲取的加密字符串進行解密String decrypt = stringEncryptor.decrypt(encrypt);System.out.println("decrypt = " + decrypt);}@Testpublic void show(){System.out.println("password = " + password);}
}
原理說明
SpringBoot項目在啟動過程中,會自動注入beanStringEncryptor
,用于根據不同的加密算法初始化不同的加解密實現類,通過StringEncryptorBuilder.build()
初始化不同的加密算法
BeanNamePlaceholderRegistryPostProcessor
@Bean(name = ENCRYPTOR_BEAN_NAME)
public StringEncryptor stringEncryptor(final EnvCopy envCopy,final BeanFactory bf) {final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf);
}
通過EncryptableMapPropertySourceWrapper重寫了getProperty()方法,在獲取配置值的時候,再做解密返回明文
DefaultPropertyResolver
@Override
public String resolvePropertyValue(String value) {return Optional.ofNullable(value).map(environment::resolvePlaceholders).filter(detector::isEncrypted).map(resolvedValue -> {try {// 獲取密文String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);// 執行解密操作return encryptor.decrypt(resolvedProperty);} catch (EncryptionOperationNotPossibleException e) {throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed, make sure encryption/decryption " +"passwords match", e);}}).orElse(value);
}
三、Jasypt配置項
Jasypt支持多種配置參數以進行密碼、Digest認證、文本和對象的加密。以下是Jasypt支持的一些常見配置參數:
配置參數 | 描述 | 示例 |
---|---|---|
jasypt.encryptor.password | 加密器的密碼,用于解密屬性 | jasypt.encryptor.password=mySecretPassword |
jasypt.encryptor.algorithm | 加密算法的名稱 | jasypt.encryptor.algorithm=PBEWithMD5AndDES |
jasypt.encryptor.keyObtentionIterations | 獲取密鑰時使用的迭代次數 | jasypt.encryptor.keyObtentionIterations=1000 |
jasypt.encryptor.poolSize | 加密池的大小(如果使用了池化加密器) | jasypt.encryptor.poolSize=1 |
jasypt.encryptor.providerName | 加密提供者的名稱(如JCE提供者) | jasypt.encryptor.providerName=SunJCE |
jasypt.encryptor.saltGeneratorClassName | 鹽生成器的類名 | jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.ivGeneratorClassName | 初始化向量生成器的類名 | jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator |
jasypt.encryptor.stringOutputType | 加密字符串的輸出類型(如base64) | jasypt.encryptor.stringOutputType=base64 |
jasypt.encryptor.property.prefix | 加密屬性前綴,用于識別加密屬性 | jasypt.encryptor.property.prefix=ENC( |
jasypt.encryptor.property.suffix | 加密屬性后綴,用于識別加密屬性 | jasypt.encryptor.property.suffix=) |
jasypt.encryptor.proxyPropertySources | 是否通過代理截取屬性值以進行解密 | jasypt.encryptor.proxyPropertySources=true |
注意:
- 這些參數主要用于配置Jasypt加密器(
StringEncryptor
)的行為。 - 在實際使用中,特別是生產環境中,
jasypt.encryptor.password
等敏感信息不應該硬編碼在配置文件中,而是通過環境變量、命令行參數或外部配置文件等方式安全地傳遞。 - Jasypt支持多種加密算法,如PBEWithMD5AndDES、PBEWithHMACSHA512ANDAES_256等,具體選擇哪種算法取決于安全需求和環境配置。
- 上述表格中的示例配置參數值僅為演示用途,實際使用時需要根據項目需求和安全策略進行配置。
四、支持的加密算法
Jasypt支持多種加密算法以保護敏感數據。以下是Jasypt支持的一些常見加密算法:
加密算法名稱 | 描述 |
---|---|
PBEWithMD5AndDES | 基于密碼的加密(PBE),使用MD5作為散列函數和DES作為加密算法。這是一種較舊的加密算法,但在某些舊系統中可能仍在使用 |
PBEWithMD5AndTripleDES | 與PBEWithMD5AndDES類似,但使用TripleDES作為加密算法,提供了更強的安全性。 |
PBEWithHMACSHA512ANDAES_256 | 使用HMAC-SHA-512散列函數和AES-256加密算法的組合,提供了非常高的安全性。這是Jasypt較新版本中推薦的加密算法之一(默認值) |
AES | 高級加密標準(AES),是一種廣泛使用的對稱加密算法。Jasypt支持不同長度的AES密鑰,如AES-128、AES-192和AES-256 |
RSA | Rivest-Shamir-Adleman(RSA)算法,是一種非對稱加密算法。它使用一對密鑰:公鑰和私鑰。公鑰用于加密數據,私鑰用于解密數據 |
參考資料
- https://github.com/ulisesbocchio/jasypt-spring-boot