发布于2026-06-30 阅读(0)
扫一扫,手机访问
在Spring Boot项目中,数据库密码、API密钥这类敏感信息直接以明文形式写在application.yml里,有多危险?相当于把家门钥匙插在门锁上,路人随手就能掏走。大量安全事件表明,配置文件中的明文凭据已成为企业数据泄露的第二大来源。Jasypt(Ja va Simplified Encryption)是Spring Boot官方推荐的配置加密方案,接入成本极低,却能解决大问题。下面从环境配置、完整代码示例到多环境部署与常见坑点,系统梳理整个加密方案的全流程。

在application.yml中直接写入数据库密码,相当于把家门钥匙插在门锁上。大量安全事件表明,配置文件中的明文凭据已成为企业数据泄露的第二大来源。常见的安全风险包括:
git log找回。Jasypt所遵循的是一种“防御纵深”思想——即便代码仓库或配置文件被攻破,攻击者也拿不到可用的明文密码。
在pom.xml中添加Jasypt Spring Boot Starter依赖。注意该starter内置了兼容的jasypt-core,无需单独引入原生Jasypt库。
com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.5
| Spring Boot版本 | 推荐Jasypt版本 | 说明 |
|---|---|---|
| 2.4.x - 2.7.x | 3.0.5+ | 兼容JDK 11+ |
| 3.0.x - 3.5.x | 3.0.5+ 或 4.x | 3.0.5已兼容Spring Boot 3.x及Jakarta EE 9+ |
Jasypt 3.x版本配合Spring Boot 2.4+以上版本使用效果最佳,JDK 8及以上均无兼容问题。
JDK 8或更高版本均可支持,项目须使用Ma ven或Gradle构建工具。
在application.yml中添加以下配置,告诉Jasypt使用何种算法和密钥(用于生成密文):
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD:} # 从环境变量读取,留空则抛出异常
algorithm: PBEWITHHMACSHA512ANDAES_256 # 推荐的高级加密算法
iv-generator-classname: org.jasypt.iv.RandomIvGenerator # 为强算法配置随机IV生成器
重要:jasypt.encryptor.password绝不应以明文写入配置文件中并提交到版本控制。上述写法从环境变量JASYPT_ENCRYPTOR_PASSWORD中读取密钥值,是最安全的生产部署方式。
如果使用的是旧版(PBEWithMD5AndDES)或遇到解密失败,可能还需补充iv-generator-classname: org.jasypt.iv.NoIvGenerator。
下载Jasypt JAR包后执行以下命令生成密文:
ja va -cp jasypt-3.0.5.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="数据库明文密码" password="你的主密钥" algorithm=PBEWITHHMACSHA512ANDAES_256
输出结果如BLC3UQBxshlcA9tnMyJL7w==,之后以ENC(密文)的形式放入配置文件中。
编写一个Jasypt工具类,一次性生成密文备用:
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
public class JasyptUtil {
public static void main(String[] args) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();
// 加密算法必须与配置文件中保持一致
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setPassword("YOUR_MASTER_SECRET_KEY");
encryptor.setConfig(config);
String plainText = "123456";
String cipherText = encryptor.encrypt(plainText);
System.out.println("密文:" + cipherText);
System.out.println("解密验证:" + encryptor.decrypt(cipherText));
}
}
说明:Jasypt每次调用encrypt()生成的密文不同,但解密后均能得到相同的明文,这是其内部使用了随机盐值(salt)的正常行为。
拿到密文后,将其放入数据源的密码字段中:
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
username: root
password: ENC(wDk3zX2h1f9pRq8yLmNk5vJb=) # 加密后的密文
框架在启动时会自动识别ENC(…)格式并调用Jasypt解密,无须在业务代码中做任何额外处理。如果使用的是Druid连接池,请确保加解密作用于 spring.datasource.password,而非spring.datasource.druid.password,后者可能存在兼容性问题。
生产环境中,密钥与密文必须严格分离存储。以下是推荐的安全注入方式:
Linux/macOS(~/.bashrc或~/.zshrc):
export JASYPT_ENCRYPTOR_PASSWORD=你的强密钥
Windows:通过“系统属性 → 环境变量”添加JASYPT_ENCRYPTOR_PASSWORD。
ja va -Djasypt.encryptor.password=你的强密钥 -jar your-app.jar
docker run -e JASYPT_ENCRYPTOR_PASSWORD="你的强密钥" your-image
或在docker-compose.yml中定义环境变量块。
apiVersion: v1 kind: Secret metadata: name: jasypt-secret type: Opaque data: password:--- apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - env: - name: JASYPT_ENCRYPTOR_PASSWORD valueFrom: secretKeyRef: name: jasypt-secret key: password
IDE默认不继承系统环境变量,需在Run/Debug Configuration → Environment variables中手动添加JASYPT_ENCRYPTOR_PASSWORD=你的密钥。
Jasypt支持以下PBE类加密算法:
| 算法 | 安全性 | 推荐度 |
|---|---|---|
PBEWITHHMACSHA512ANDAES_256 | 强加密 | ⭐⭐⭐ 推荐(生产首选) |
PBEWITHHMACSHA256ANDAES_128 | 中等 | ⭐⭐(性能均衡) |
PBEWithMD5AndDES | 弱加密 | ⭐ 不推荐(JDK 17+已禁用) |
版本差异:Jasypt 3.x版本后默认加密方式已从PBEWithMD5AndDES切换为PBEWITHHMACSHA512ANDAES_256,对应也需指定RandomIvGenerator。
在Ja va代码中执行以下脚本,快速列出所有可用算法:
import ja va.security.Security;
public class AlgorithmList {
public static void main(String[] args) {
for (ja va.security.Provider provider : Security.getProviders()) {
for (Object key : provider.keySet()) {
String str = (String) key;
if (str.toLowerCase().contains("pbewith")) {
System.out.println(str);
}
}
}
}
}
开发阶段仍建议使用环境变量注入,与生产保持一致,避免环境差异导致的加解密失败。
严格将密钥存放于环境变量或K8s Secret中,配置文件中绝不出现明文密钥。关键安全建议:
原因:jasypt.encryptor.password未正确注入,或加密/解密时使用的算法、密钥不一致。
解决方法:
PBEWithMD5AndDES,需显式指定iv-generator-classname: org.jasypt.iv.NoIvGenerator。原因:Druid连接池场景下,加解密作用于Druid专用属性路径被遗漏。
解决方法:将密码统一放置在spring.datasource.password中,Druid配置可通过引用此值解决,而非使用spring.datasource.druid.password。
排查步骤:
mvn spring-boot:run启动,Ma ven进程默认不继承父终端变量,改用ja va -jar方式。原因:依赖版本不匹配或引入了错误的库。
解决方法:确保使用的是jasypt-spring-boot-starter而非原生jasypt库,且版本与Spring Boot版本兼容。
PBEWITHHMACSHA512ANDAES_256,避开旧版PBEWithMD5AndDES;spring.datasource.password中,规避自定义路径无法解密的问题;通过以上系统化的配置和密钥管理,即可在Spring Boot项目中实现“配置文件零明文”的安全目标,让数据库密码等敏感信息真正穿上“防弹衣”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8