Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
一、前言
Spring Boot 项目中,application.yml、application.properties 配置文件会存储大量敏感信息,包括数据库账号密码、Redis 密码、接口密钥、短信/OSS 秘钥等。
如果以明文存储,一旦代码仓库泄露、服务器文件被窃取,会造成核心数据安全事故。因此生产环境必须对配置文件敏感信息加密存储。
本文采用行业通用方案:Jasypt,无侵入、开箱即用,支持 Spring Boot 自动解密,适配所有配置项,是中小型项目首选安全方案。
二、Jasypt 方案优势
-
零业务代码侵入,仅修改配置文件
-
项目启动自动解密,业务层无需手动处理
-
支持 AES 高强度加密算法,安全性高
-
支持环境变量、启动参数传递密钥,避免密钥硬编码
-
兼容 yml、properties 所有配置文件
三、版本依赖引入
适配 Spring Boot2.x / 3.x,引入 Jasypt 官方启动器。
3.1 Maven 依赖(pom.xml)
xml
<!-- Spring Boot 配置文件加密 Jasypt -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
版本说明:3.0.5 兼容 Spring Boot 2.7+、3.x 全版本,稳定无兼容问题。
四、生成密文(核心步骤)
需要先将明文密码、密钥通过 Jasypt 算法加密为密文,提供三种常用生成方式,推荐代码工具类生成(最稳定)。
4.1 自定义工具类生成密文(推荐)
编写测试工具类,指定加密密钥和明文,生成可直接使用的密文。
java
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
/**
* Jasypt 加解密工具类
* 用于生成配置文件密文、测试解密
*/
public class JasyptUtil {
// 自定义加密密钥(生产环境务必更换复杂密钥)
private static final String SECRET_KEY = "SpringBoot@2026";
public static void main(String[] args) {
// 需要加密的明文(数据库密码、Redis密码等)
String plainText = "123456";
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();
config.setPassword(SECRET_KEY);
// 使用高强度AES加密算法
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
encryptor.setConfig(config);
// 加密
String cipherText = encryptor.encrypt(plainText);
// 解密(验证用)
String decryptText = encryptor.decrypt(cipherText);
System.out.println("明文:" + plainText);
System.out.println("密文:ENC(" + cipherText + ")");
System.out.println("解密验证:" + decryptText);
}
}
运行 main 方法,即可生成 ENC(密文) 格式字符串,直接放入配置文件即可。
4.2 IDEA 插件 / 在线工具(临时使用)
开发测试可使用 Jasypt 在线加解密工具,输入明文和自定义密钥,快速生成密文,生产环境禁止使用在线工具,避免密钥泄露。
五、配置文件改造(YML / Properties)
Jasypt 默认规则:所有被 ENC() 包裹的内容,项目启动时自动解密。
5.1 application.yml 配置
yaml
# Jasypt 加密配置
jasypt:
encryptor:
# 加密密钥(生产环境通过环境变量/启动参数注入,不硬编码)
password: ${JASYPT_ENCRYPTOR_PASSWORD:}
# 加密算法
algorithm: PBEWITHHMACSHA512ANDAES_256
iv-generator-class-name: org.jasypt.iv.RandomIvGenerator
# 数据库配置(敏感信息加密)
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf-8
username: ENC(xxxx密文xxxx)
password: ENC(xxxx密文xxxx)
# Redis 配置
redis:
password: ENC(xxxx密文xxxx)
5.2 application.properties 配置
properties
# Jasypt 配置
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.iv-generator-class-name=org.jasypt.iv.RandomIvGenerator
# 数据库配置
spring.datasource.username=ENC(xxxx密文xxxx)
spring.datasource.password=ENC(xxxx密文xxxx)
六、密钥安全注入(生产核心)
绝对禁止将加密密钥硬编码在配置文件中,否则加密无意义。生产环境提供两种安全注入方式。
6.1 启动参数传递(推荐)
项目启动时通过命令行传入密钥,密钥不落地、不提交代码库。
bash
java -jar your-project.jar --jasypt.encryptor.password=自定义复杂密钥
6.2 系统环境变量传递
服务器提前配置环境变量 JASYPT_ENCRYPTOR_PASSWORD,项目自动读取。
bash
# Linux 临时配置
export JASYPT_ENCRYPTOR_PASSWORD=自定义复杂密钥
# 启动项目
java -jar your-project.jar
七、解密验证测试
编写测试接口,验证配置是否正常解密,确保项目可正常读取明文配置。
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigTestController {
@Value("${spring.datasource.password}")
private String dbPassword;
@GetMapping("/config/test")
public String test() {
return "数据库密码解密后明文:" + dbPassword;
}
}
启动项目访问接口,能正常输出明文密码,说明加解密配置生效。
八、常见问题与避坑指南
8.1 启动报错:Invalid key size
原因:JDK 默认密钥长度受限,不支持 256 位 AES 加密
解决方案:使用 Jasypt 3.0+ 版本,自动兼容无限制密钥,无需手动替换 JCE 包。
8.2 密钥配置后解密失败
-
加密、解密必须使用同一个密钥、同一个算法
-
密文禁止手动修改、空格、换行
-
确认启动时成功注入密钥,无参数覆盖
8.3 代码提交安全问题
配置文件只提交密文,密钥通过启动参数/环境变量注入,彻底杜绝密钥泄露。
九、高级扩展(企业级优化)
9.1 自定义加密标识
默认使用 ENC(),可自定义前后缀,避免冲突。
yaml
jasypt:
encryptor:
prefix: CIPHER(
suffix: )
9.2 配合 Nacos / Apollo 配置中心
Jasypt 完全兼容分布式配置中心,配置中心存储密文,本地启动注入密钥,兼顾配置统一和数据安全。
十、总结
-
Jasypt 是 Spring Boot 配置加密最优轻量方案,零侵入、高安全、易落地;
-
核心规范:配置文件存密文,密钥动态注入,绝不硬编码;
-
所有数据库、中间件、接口秘钥必须加密存储,杜绝明文泄露风险;
-
生产环境必须使用启动参数/环境变量传递密钥,禁止写死在项目配置中。