发布于2026-07-06 阅读(0)
扫一扫,手机访问
说实话,直接把数据库密码、Redis密码、API密钥这些敏感信息明文写在application.yml里,再甩手提交到Git仓库——这操作跟把家里钥匙挂在门口有啥区别?Jasypt(Java Simplified Encryption)这套工具就是专门来治这个毛病的:对敏感信息加密存储,应用启动时自动解密,谁也偷不走。

# ❌ 明文配置(危险!)
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: 123456 # ← 密码暴露在配置文件里
# ✅ 加密配置(安全!)
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: ENC(加密后的密文) # ← 别人看不懂
安全风险:
com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.5
jasypt:
encryptor:
password: mySecretKey # 加密密钥(不要写在配置里!)
algorithm: PBEWithMD5AndDES
重要: 这个 password 建议通过环境变量或启动参数传入,不要写在 yml 里:
java -jar app.jar --jasypt.encryptor.password=mySecretKey
或者设置在环境变量中:
# Windows 系统环境变量 set JASYPT_ENCRYPTOR_PASSWORD=mySecretKey # Linux export JASYPT_ENCRYPTOR_PASSWORD=mySecretKey
配置中使用环境变量的引用:
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}
# 下载 Jasypt 的 jar 包后,命令行加密 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123456" password=mySecretKey algorithm=PBEWithMD5AndDES # 输出: # ----OUTPUT---------------------- # O7v7T4H6zXkZp8V3YwA9Bw==
@SpringBootTest
class JasyptTest {
@Test
void testEncrypt() {
// 加密
StringEncryptor encryptor = new DefaultEncryptor();
String encrypted = encryptor.encrypt("123456");
System.out.println("加密后: " + encrypted);
// 输出: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
// 解密
String decrypted = encryptor.decrypt(encrypted);
System.out.println("解密后: " + decrypted);
// 输出: 123456
}
}
把生成的密文用 ENC() 包裹,替换 yml 中的明文:
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
redis:
host: localhost
password: ENC(XyZ8pQ3mN5vB2kL7)
# 自定义配置也可以加密
app:
api-key: ENC(H9jK2mN4pQ6rS8tU)
启动时 Jasypt 会自动解密 ENC(...) 包裹的内容。
加密密钥(jasypt.encryptor.password)是所有加密数据的钥匙——它本身不能加密,需要单独管理:
| 环境 | 推荐方案 |
|---|---|
| 本地开发 | 环境变量 |
| 测试服务器 | 环境变量 |
| 生产环境 | 配置中心 或 启动参数 |
生产环境推荐使用启动参数(安全最高):
# 从专门的密钥管理服务获取 # 或者在启动脚本中手动输入(不写入任何文件) java -jar app.jar --jasypt.encryptor.password=$(cat /etc/secrets/jasypt.key) --spring.profiles.active=prod
# 如果密码包含特殊字符(如 $、%、&),需要 URL 编码 password: ENC(abc%3Ddef) # %3D 是 = 的 URL 编码 # 或者在生成密文时指定 # 命令行生成时,用单引号包裹 java -cp jasypt.jar ... input='P@ssw0rd!' ...
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}
algorithm: PBEWITHHMACSHA512ANDAES_256 # 更强的算法
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
需要 Java 密码扩展包(JCE):
不同配置项使用不同密钥加密:
jasypt:
encryptor:
# 默认密钥
password: ${JASYPT_ENCRYPTOR_PASSWORD}
# 不同 Bean 使用不同密钥
bean:
- encryptorName: dbEncryptor
password: ${DB_ENCRYPTOR_PASSWORD}
- encryptorName: apiEncryptor
password: ${API_ENCRYPTOR_PASSWORD}
@Configuration
public class JasyptConfig {
@Bean("dbEncryptor")
public StringEncryptor dbEncryptor(
@Value("${jasypt.encryptor.bean[0].password}") String password) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPassword(password);
encryptor.setAlgorithm("PBEWithMD5AndDES");
return encryptor;
}
}
spring:
datasource:
password: ENC(xxx) # 使用默认密钥
app:
third-party-key: ENC(yyy) # 也使用默认密钥
# 原因:密钥不正确或密文被修改 # 解决:确认启动时传入的密钥和加密时使用的密钥一致 # 检查环境变量 echo $JASYPT_ENCRYPTOR_PASSWORD
# 原因:连接字符串中也包含密码信息 # 解决:整个 URL 加密不方便,只加密密码部分即可
# application-dev.yml(开发环境可以明文,方便调试)
spring:
datasource:
password: 123456
# application-prod.yml(生产环境加密)
spring:
datasource:
password: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
# 开发环境启动直接跑
java -jar app.jar --spring.profiles.active=dev
# 生产环境需要传入密钥
java -jar app.jar
--spring.profiles.active=prod
--jasypt.encryptor.password=${JASYPT_PASSWORD}
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8