在开发过程中,许多开发者可能都习惯性地将数据库密码、API密钥等敏感信息直接以明文形式写在 application.yml 或 application.properties 配置文件中。这种做法实际上为系统留下了巨大的安全隐患,一旦配置文件因版本管理疏忽或服务器入侵而泄露,核心业务数据将面临被盗取的风险。之前就有团队因明文存储密码导致用户信息泄露,造成了严重的财产和声誉损失。
因此,保护配置文件中的敏感信息,是每位开发者必须重视的基础安全实践。而 Jasypt 正是一款专为此场景设计的轻量级Java加密库,它与 Spring Boot 框架集成简单,能够在不改动核心业务代码的前提下,轻松地将配置项从明文转为密文,显著提升应用的安全性。
集成 Jasypt,开启加密之旅
前期准备工作
前提条件是你已经拥有一个可运行的 Spring Boot 项目。以 Maven 项目为例,需要在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
添加依赖后,刷新 Maven 项目以下载相关库,即可进行后续配置。
配置加密密钥
加密密钥是整个加密体系的核心,绝对禁止将其硬编码在代码或配置文件中。以下是三种推荐的生产环境配置方式,按优先级排序:
方式 1:环境变量配置(最常用)
在 Linux/macOS 系统中,可以在终端临时设置环境变量(重启终端后失效):
export JASYPT_ENCRYPTOR_PASSWORD=your_secret_key
在 Windows 系统中,可以通过“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”,在系统变量中新建变量 JASYPT_ENCRYPTOR_PASSWORD 并设置密钥值。
方式 2:启动命令传参(适合容器化部署)
将应用打包为 JAR 后,在启动命令中通过 --jasypt.encryptor.password 参数指定密钥:
java -jar your_app.jar --jasypt.encryptor.password=your_secret_key
方式 3:配置中心集成(分布式项目推荐)
对于使用 Nacos、Apollo 等配置中心的项目,可以将密钥作为一条配置项存储在配置中心。例如,在 Nacos 中添加配置 jasypt.encryptor.password=your_secret_key,这样密钥就不会在应用服务器本地落地,安全性更高。
加密敏感信息
配置好密钥后,就可以对需要加密的敏感信息(如数据库密码)进行加密了。这里提供两种加密方式。
方式 1:命令行加密(适合快速测试)
- 从 Jasypt 官网下载 CLI 工具包。
- 解压后进入
lib 目录,执行以下命令(请替换 your_secret_key 和 待加密信息):
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=待加密信息 password=your_secret_key algorithm=PBEWithHMACSHA256AndAES_128 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
方式 2:Java 代码加密(适合集成到工具类中)
你可以编写一个简单的工具类来执行加密操作,方便批量处理:
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
public class JasyptEncryptorDemo {
public static void main(String[] args) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("your_secret_key");
config.setAlgorithm("PBEWithHMACSHA256AndAES_128");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
String encryptedText = encryptor.encrypt("your_sensitive_data");
System.out.println(encryptedText);
}
}
运行 main 方法,控制台输出的即为加密后的密文。
在配置文件中使用加密数据
获取密文后,只需用 ENC() 包裹密文,即可替换掉原来的明文配置。
示例 1:application.yml 配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/ry-config?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: ENC(sGZOfFJcX91YKppKfMellHbeaDB1iFMjXmNnmqYqUjKFgkOliGPweBOCyr+DLO8L)
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
示例 2:application.properties 配置
spring.datasource.username=root
spring.datasource.password=ENC(U2FsdGVkX1+...)
spring.cloud.alicloud.access-key=ENC(xxx...)
Spring Boot 应用启动时,Jasypt 会自动识别并解密 ENC() 包裹的内容,对业务代码完全透明。
解密验证,确保万无一失
配置 Jasypt 解密器
为了让 Spring Boot 在启动时能正确解密,建议在配置文件中明确指定解密算法(需与加密时使用的算法一致):
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD} # 这里引用环境变量或直接写密钥
algorithm: PBEWithHMACSHA256AndAES_128
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
编写解密验证代码
可以创建一个简单的控制器来验证解密是否成功:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DecryptionController {
// 直接注入解密后的密码
@Value("${spring.datasource.password}")
private String decryptedPassword;
// 接口测试解密结果
@GetMapping("/decrypted-password")
public String getDecryptedPassword() {
return "解密后的数据库密码:" + decryptedPassword;
}
}
验证步骤:
- 启动应用(确保已通过环境变量或命令行参数提供了正确的加密密钥)。
- 访问
http://localhost:8080/decrypted-password,页面应显示解密后的明文密码。

加密算法大揭秘
常见加密算法介绍
Jasypt 支持多种加密算法,了解其特点有助于做出合适选择:
- PBEWithMD5AndDES:基于口令的加密,使用 MD5 和 DES 算法。这是较旧的算法,MD5 和 DES 都存在已知的安全弱点,不推荐在新项目中使用。
- PBEWithMD5AndTripleDES:使用 TripleDES 替代 DES,安全性较前者有所提升,但加解密速度较慢。
- PBEWithHMACSHA512AndAES_256:结合了 HMAC-SHA-512 消息认证和 AES-256 加密,安全性极高,适用于金融等对安全要求极端苛刻的场景。
- AES(高级加密标准):目前广泛使用的对称加密算法,高效且安全。支持 128、192、256 位密钥长度,密钥越长安全性越高,在各类系统中都有良好支持。在 安全/渗透/逆向 领域,AES 是基础且重要的加密标准。
如何选择合适的算法
选择算法应综合考虑以下因素:
- 安全性:对于极度敏感的数据(如支付信息),应优先选择 AES-256 或
PBEWithHMACSHA512AndAES_256 这类高强度算法。
- 性能:对于性能敏感或数据敏感度一般的场景(如内部日志加密),AES-128 在安全与效率之间取得了良好平衡。在物联网等资源受限设备上,还需考虑算法的计算开销。
- 合规性:某些行业(如金融、医疗)有强制性的加密标准(如 PCI-DSS、HIPAA),必须选择符合相关规定的算法。
安全注意事项不能忘
加密密钥管理
密钥管理是加密方案中最关键的一环:
- 严禁硬编码:切勿将密钥直接写在代码或配置文件中。
- 安全存储:优先使用环境变量、启动参数或配置中心来传递密钥。
- 专业服务:在复杂的企业环境中,推荐使用专业的密钥管理服务(如 HashiCorp Vault, AWS Secrets Manager),它们提供密钥的生成、轮转、访问审计等高级功能。
生产环境安全建议
除了加密配置,生产环境还应采取多层防御措施:
- 访问控制:严格限制访问应用和数据库/中间件服务器的来源 IP。例如,可以通过防火墙规则只允许特定的 IP 段访问数据库端口。
- 最小权限原则:为应用访问数据库分配仅满足其功能所需的最低权限账户,避免使用 root 或 sa 等高权限账户。
- 定期更新:及时更新服务器操作系统、Java 运行时环境以及项目依赖库(包括 Jasypt 本身),以修复已知安全漏洞。
总结
数据安全体现在开发的每一个细节之中。为 Spring Boot 项目集成 Jasypt 来实现配置加密,是一个成本低、收益高的安全实践。整个过程清晰明了:引入依赖、安全配置密钥、加密敏感信息、用密文替换明文配置。通过这几个步骤,就能有效消除配置文件泄露带来的风险,为应用筑牢一道基础安全防线。希望这篇指南能帮助你更安全地管理应用配置。更多关于 后端 & 架构 的实践讨论,欢迎在 云栈社区 交流分享。