Spring Boot 结合 Jasypt 实现敏感信息加密(含 Nacos 配置关联思路)
一、核心需求
在 Spring Boot 项目中,对配置文件内的敏感信息(如数据库用户名/密码、Redis 密码等,暂不依赖配置中心场景)进行加密,防止明文泄露,保障数据安全。
二、详细操作步骤
2.1 添加 Jasypt 依赖
采用 jasypt-spring-boot-starter
实现加密,选择 2.1.2 版本 (避免 3.0.5 等新版本因算法变更导致的启动报错),在项目 pom.xml
中添加依赖:
xml
<!-- 数据库密码等敏感信息加密依赖 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
2.2 生成加密密文
2.2.1 找到 Jasypt 依赖包
依赖下载后,进入本地 Maven 仓库路径 org/jasypt/jasypt/1.9.3
,找到 jasypt-1.9.3.jar
(该 Jar 包包含加密命令工具)。
2.2.2 执行加密命令
通过命令行(Windows 输入 cmd
进入,Mac 用 Terminal)执行加密,核心命令格式:
bash
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="待加密内容" password=加密盐 algorithm=PBEWithMD5AndDES
- 参数说明 :
input
:需加密的敏感信息(如数据库用户名、密码);password
:加密使用的"盐"(自定义字符串,解密需同盐,需妥善保管);algorithm
:加密算法(默认可选PBEWithMD5AndDES
,非必填)。
2.2.3 示例:加密数据库账号密码
-
加密用户名
root
:bashjava -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=helloWorld algorithm=PBEWithMD5AndDES
输出结果(密文,示例):
1vAgkftBPnIYh/gjCokbFA==
-
加密密码
123
:bashjava -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123" password=helloWorld algorithm=PBEWithMD5AndDES
输出结果(密文,示例):
LPbn37xuIIAfCkaermp5cQ==
2.3 修改 Spring Boot 数据库配置
将加密后的密文用 ENC(密文)
包裹,替换配置文件中明文的用户名/密码,示例:
yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true
username: ENC(1vAgkftBPnIYh/gjCokbFA==) # 加密后的用户名
password: ENC(LPbn37xuIIAfCkaermp5cQ==) # 加密后的密码
2.4 配置"加密盐"(解密关键)
需在项目中配置加密时使用的"盐",让程序能解密密文,但需注意 配置盐的安全性:
2.4.1 本地开发场景(临时方案)
直接在配置文件中配置(仅用于本地开发,生产环境禁用):
yaml
jasypt:
encryptor:
password: helloWorld # 与加密时的"盐"一致
或通过 IDEA 虚拟机参数配置(避免写在配置文件):
-Djasypt.encryptor.password=helloWorld
2.4.2 生产环境场景(安全方案)
通过 应用启动参数 配置盐,避免盐明文存储,示例启动命令:
bash
java -jar -Djasypt.encryptor.password=helloWorld 项目.jar
三、解密操作(验证/应急场景)
若需验证密文对应明文,或应急解密,执行以下命令(需同加密盐和算法):
bash
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="加密后的密文" password=加密盐 algorithm=PBEWithMD5AndDES
示例(解密密码密文 LPbn37xuIIAfCkaermp5cQ==
):
bash
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="LPbn37xuIIAfCkaermp5cQ==" password=helloWorld algorithm=PBEWithMD5AndDES
输出结果(明文):123
四、常见问题与解决方案
4.1 版本选择问题:为何不用 3.0.5 等新版本?
- 问题:使用 3.0.5 版本时,项目启动报错
Failed to bind properties under 'spring.datasource.xxx.password' to java.lang.String
; - 原因:新版本变更了加密算法逻辑,与旧配置不兼容;
- 解决方案:降低版本至 2.1.2 即可正常运行。
4.2 启动报错:未配置加密盐
- 问题:使用 2.1.2 版本,但未配置
jasypt.encryptor.password
,报上述绑定属性错误; - 解决方案:按 2.4 节配置加密盐(本地用配置文件/虚拟机参数,生产用启动参数)。
五、Nacos 配置中心关联思路(扩展)
若后续接入 Nacos 配置中心,敏感信息加密逻辑可复用:
- 在 Nacos 控制台配置加密后的敏感信息(格式仍为
ENC(密文)
); - 项目启动时,通过启动参数
"-Djasypt.encryptor.password=加密盐"
传入盐,避免盐存储在 Nacos 或本地配置文件,进一步提升安全性。