数据库密码、SMTP 授权码这类配置,明文放在仓库里迟早会变成事故。项目使用 Jasypt 把敏感值加密成 ENC(xxx),启动时再通过环境变量或
JVM 参数注入密钥。
一、加密配置
公共配置使用同一组参数:
jasypt:
encryptor:
algorithm: PBEWithHMACSHA512AndAES_256
key-obtention-iterations: 100000
salt-generator-classname: org.jasypt.salt.RandomSaltGenerator
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64
显式写出算法、迭代次数、随机盐和随机 IV,可以避免依赖隐式默认值,也方便加密工具和运行时保持一致。
二、加密工具不引入新系统
service-common 里的 JasyptTest 提供交互式工具。运行前先传入密钥:
java -Djasypt.encryptor.password=your-secret-key ...
也可以使用环境变量:
JASYPT_ENCRYPTOR_PASSWORD=your-secret-key
工具会输出密文并回读解密验证,确认一致后再复制到配置里。
三、密钥才是真正的秘密
配置文件里可以有密文,但不能有密钥。密钥一旦提交,ENC(xxx) 只是把明文换了一种形状。更稳妥的做法是:
- 密钥只存在于部署环境或密钥管理系统。
- 不同环境使用不同密钥。
- 密钥泄露时重新加密所有敏感配置。
四、随机盐带来的现象
同一个明文每次加密出的密文都不同,这是正常的,也是安全的。排查启动失败时不要对比密文,应该确认密钥是否正确、算法配置是否一致。
五、经验总结
Jasypt 能降低仓库泄露带来的直接影响,但它不是访问控制。数据库仍要限制来源 IP,SMTP 授权码仍要支持独立撤销和更换。