在SpringBoot Project中,會將一些敏感資訊配置到application.yml/application.properties配置檔案中(同樣適用於Spring Cloud的各個微服務其實(微服務例項)本質就是一個SpringBoot
),例如資料庫的使用者名稱和密碼、Redis的密碼等。為了保證敏感資訊的安全,我們需要將此類資料進行加密配置。
Jasypt方案
官網 http://www.jasypt.org/
以下實踐在JDK21、SpringBoot3.3.0下成功驗證,若你的JDK和SpringBoot版本有所差異,可能需要調整一些細節
pom.xml
引入依賴
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
加密你的敏感資訊
public class TmpUtil {
public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的秘鑰(salt),解密敏感資訊仍舊需要改值
textEncryptor.setPassword("ashe");
//要加密的敏感資訊
String url = textEncryptor.encrypt("jdbc:mysql://${host}/${port}?serverTimezone=Asia/Shanghai");
String username = textEncryptor.encrypt("username");
String password = textEncryptor.encrypt("password");
String driver = textEncryptor.encrypt("com.mysql.cj.jdbc.Driver");
System.out.println("ENC("+url+")");
System.out.println("ENC("+username+")");
System.out.println("ENC("+password+")");
System.out.println("ENC("+driver+")");
System.out.println(textEncryptor.decrypt(username));
System.out.println(textEncryptor.decrypt(password));
}
}
application.yml填寫加密後的密文
spring:
datasource:
url: ENC(xxxx)
username: ENC(xxxx)
password: ENC(xxxx)
driver-class-name: ENC(xxxx)
#jasypt:
# encryptor:
# password: ashe # 替換為你自己的金鑰
# iv-generator-classname: org.jasypt.iv.NoIvGenerator
# algorithm: PBEWithMD5AndDES
Jasypt庫所使用的預設加密演算法為PBEWithMD5AndDES,其需要解密的內容需要用ENC()包裹(你可以自定義選擇其他加密演算法),如果在配置檔案中直接展示你的秘鑰,那麼密文將很容易被解密出原文,因此一般不建議在配置檔案中展示,而是透過啟動指令碼的方式來告訴Jasypt秘鑰值,用以解密密文。
IDEA中本地啟動設定VM Options
-Djasypt.encryptor.password=ashe -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator -Djasypt.encryptor.algorithm=PBEWithMD5AndDES
-Djasypt.encryptor.password=ashe -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator -Djasypt.encryptor.algorithm=PBEWithMD5AndDES
Linux中的啟動指令碼
#!/bin/bash
# Start the application with the Jasypt encryptor password (replace with your actual start command)
java -Djasypt.encryptor.password=ashe -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator -Djasypt.encryptor.algorithm=PBEWithMD5AndDES -jar your-application.jar
較低版本的jasypt似乎不需要顯式指定iv-generator-classname和algorithm
Druid方案
略