思路:
- 簡要介紹Jasypt:一句話說明它的作用。
- 配置解析:分別解釋
password
和algorithm
的作用。 - 工作流程:說明如何加密敏感數據并在配置文件中使用。
- 安全提醒:強調密鑰管理的重要性。
最終回答:
Jasypt(Java Simplified Encryption)是一個Java加密庫,用于簡化敏感信息(如數據庫密碼)的加密和解密。在Spring Boot中,它允許你在配置文件中存儲加密的敏感數據,并在應用啟動時自動解密。
您提供的配置說明:
jasypt:encryptor:password: 123 # 加密/解密所需的密鑰algorithm: PBEWITHHMACSHA512ANDAES_256 # 指定加密算法
password: 123
- 這是加密和解密的核心密鑰。重要提示:絕對不要將密鑰明文寫在配置文件中! 正確做法是通過環境變量或啟動參數傳遞(例如:
-Djasypt.encryptor.password=123
)。
- 這是加密和解密的核心密鑰。重要提示:絕對不要將密鑰明文寫在配置文件中! 正確做法是通過環境變量或啟動參數傳遞(例如:
algorithm: PBEWITHHMACSHA512ANDAES_256
- 指定加密算法為基于密碼的AES-256加密,并使用HMAC-SHA512進行完整性驗證。這是目前Jasypt支持的高強度加密算法。
如何使用?
- 加密數據:
使用Jasypt工具(或代碼)加密原始數據(如數據庫密碼mysecret
):
輸出得到加密后的字符串(例如:# 示例命令(使用jasypt命令行工具)java -jar jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ input="mysecret" password=123 algorithm=PBEWITHHMACSHA512ANDAES_256
2t5g8G7z1k...
)。 - 替換配置文件中的明文:
將加密后的字符串用ENC()
包裹,寫入配置文件:spring: datasource: password: ENC(2t5g8G7z1k...)
- 應用啟動時自動解密:
Spring Boot通過Jasypt在加載配置時自動解密ENC(...)
包裹的值,業務代碼獲取到的datasource.password
將是原始值mysecret
。
安全提醒
- 密鑰必須保密:永遠不要將
jasypt.encryptor.password
寫入代碼或配置文件。應通過安全方式傳遞(如啟動參數、環境變量)。 - 算法安全性:
PBEWITHHMACSHA512ANDAES_256
是安全可靠的算法,但需確保你的Java環境已安裝JCE無限強度策略文件(否則AES-256可能無法使用)。 - 依賴版本:推薦使用
jasypt-spring-boot-starter
(最新版)以避免兼容性問題。
通過這種方式,你的敏感配置信息(如數據庫密碼)即使被泄露,也不會直接暴露明文,大幅提升系統安全性。 Jasypt 在 Java 中的作用 Jasypt(Java Simplified Encryption) 是一個 Java 加密庫,主要用于:
簡化敏感數據的加密/解密(如數據庫密碼、API 密鑰等)
與 Spring Boot 無縫集成,自動解密配置文件中的加密值
避免明文存儲敏感信息,提升配置安全性
您提供的配置解析 yaml 復制 下載 jasypt: encryptor: password: 123 # 加密/解密的核心密鑰 algorithm: PBEWITHHMACSHA512ANDAES_256 # 加密算法
- password: 123 核心作用:加解密的種子密鑰(Secret Key)
嚴重風險: ?? 明文硬編碼密鑰是高風險操作! 正確做法應通過環境變量或啟動參數傳遞:
bash 復制 下載
啟動時傳入密鑰(推薦)
java -jar app.jar --jasypt.encryptor.password=${SECRET_KEY} 2. algorithm: PBEWITHHMACSHA512ANDAES_256 算法組成:
PBE:基于密碼的加密(Password-Based Encryption)
HMACSHA512:用 SHA-512 生成消息認證碼,確保數據完整性
AES_256:256 位高級加密標準(需 Java 無限制強度策略文件)
強度:目前行業認可的高強度加密方案
工作流程示例 步驟 1:加密敏感數據 bash 復制 下載
使用 Jasypt 命令行工具加密
java -cp jasypt.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI
input="real_db_password"
password=123
algorithm=PBEWITHHMACSHA512ANDAES_256
輸出示例
----OUTPUT---------------------- d7KkF2eT9gGxYjW5tRfB+uJqLmNpOcV1 # 加密后的密文 步驟 2:在配置中使用加密值 yaml 復制 下載 spring: datasource: username: ENC(AbCdEfG123...) # 加密用戶名 password: ENC(d7KkF2eT9gGxYjW5tRfB) # 加密密碼 步驟 3:應用啟動時自動解密 https://via.placeholder.com/600x200?text=Spring+Boot+%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B
Jasypt 檢測 ENC(...) 包裹的配置項
使用配置的 password 和 algorithm 自動解密
業務代碼獲取到的是原始明文值
關鍵安全實踐 禁止硬編碼密鑰
bash 復制 下載
通過環境變量傳遞密鑰
export JASYPT_PASSWORD="myStrong!Pass123" java -jar app.jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} 算法依賴處理
下載 Java 無限制強度策略文件
替換 $JAVA_HOME/jre/lib/security/ 下的 local_policy.jar 和 US_export_policy.jar
加密內容格式 必須用 ENC(密文) 包裹加密值,Jasypt 才能識別
典型應用場景 場景 明文配置風險 Jasypt 解決方案 數據庫密碼 直接暴露核心數據 password: ENC(xxx) 第三方 API 密鑰 賬戶被盜用風險 api-key: ENC(yyy) 云服務憑據 導致未授權訪問 credentials: ENC(zzz) 加密通信證書密碼 中間人攻擊風險 keystore-pass: ENC(aaa) 📌 總結:此配置使 Jasypt 能自動解密 ENC(...) 包裹的敏感配置,但需立即修復密鑰硬編碼問題,否則會嚴重降低系統安全性。