在当今互联网时代, 数据库安全的重要性不言而喻。作为Java开发的主流框架,Spring Boot项目通常需要连接数据库,而数据库的 用户名和密码作为最敏感的信息之一,如果直接以明文形式存储在
application.properties或
application.yml配置文件中,将存在极大的安全隐患。特别是在项目代码需要上传到GitHub等开源平台或团队协作开发时,
明文数据库凭证可能会被恶意利用,导致数据泄露甚至被删除的风险。
因此,对Spring Boot项目中的数据库用户名和密码进行加密处理,是每个开发者都应该重视的安全实践。本文将从实际应用出发,详细介绍两种主流的数据源配置加密方案:Jasypt(通用性加密库)和Druid(自带加密功能的数据源),帮助你根据项目需求选择最适合的方案,全面提升应用安全性。
下面是一个快速对比,帮助你了解两种主要方案的特点:
| 特性 | Jasypt | Druid 数据源加密 |
|---|---|---|
| 加密方式 | 对配置值进行对称加密,使用 ENC(密文) 包裹 | 使用内置的 RSA 非对称加密工具对密码进行加密 |
| 集成度 | 与 Spring Boot 生态集成度高,配置简单 | 主要针对 Druid 数据源,配置稍复杂 |
| 工作原理 | 程序启动时自动识别并解密 ENC() 中的内容 | 通过配置 ConfigFilter 在连接池初始化时解密 |
| 依赖 | 需添加 jasypt-spring-boot-starter 依赖 | 需使用 druid 数据源 |
| 推荐场景 | 通用性强,适用于加密配置文件中的任何敏感信息 | 适用于专注于使用 Druid 数据源并提供额外安全的场景 |
一、使用 Jasypt 加密
Jasypt(Java Simplified Encryption)是一个简单易用的Java加密库,它与Spring Boot生态集成度高,可以非常方便地对配置文件中的任何敏感信息进行加密处理。其核心思想是对明文字段进行对称加密,然后将加密后的密文(用ENC()包裹)置于配置文件中。应用程序在启动时,Jasypt会自动识别并解密这些密文,获取真实的配置值。
步骤 1:添加依赖
在项目的 pom.xml 中添加 Jasypt 依赖。请注意版本兼容性,部分 Spring Boot 版本与较新的 Jasypt 版本可能存在兼容性问题,有资料推荐使用 2.1.2 或 3.0.4 等稳定版本。
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version> <!-- 请根据你的Spring Boot版本选择合适版本 -->
</dependency>
注意:如果后续启动应用时出现Failed to bind properties等错误,可能是版本不兼容所致,可以尝试降低Jasypt版本(例如使用2.1.2)。
步骤 2:获取加密密文
你需要使用 Jasypt 提供的工具对明文密码进行加密。
方法一:使用 JAR 包命令行加密(常用)
-
找到本地 Maven 仓库中的
jasypt-1.9.3.jar(版本号可能不同)。 -
在命令行中执行以下命令(请替换
your_secret_key为你的加密密钥,plain_text为你的明文密码):java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="plain_text" password="your_secret_key" algorithm="PBEWithMD5AndDES"命令输出中的 OUTPUT 就是加密后的密文。
方法二:在 Java 代码中加密
你也可以编写一个简单的工具类来加密:
import org.jasypt.util.text.BasicTextEncryptor;
public class JasyptEncryptor {
public static void main(String[] args) {
BasicTextEncryptor encryptor = new BasicTextEncryptor();
encryptor.setPassword("your_secret_key"); // 设置加密密钥
String encryptedPassword = encryptor.encrypt("your_db_password"); // 加密
System.out.println("Encrypted password: " + encryptedPassword);
// 如果需要解密验证
// String decryptedPassword = encryptor.decrypt(encryptedPassword);
// System.out.println("Decrypted password: " + decryptedPassword);
}
}
步骤 3:修改配置文件
将加密后的密文(例如:LPbn37xuIIAfCkaermp5cQ)用 ENC() 包裹,替换到 application.properties 或 application.yml 中,并配置加密密钥。
application.yml 示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database
username: ENC(加密后的用户名密文) # 如果用户名也加密了
password: ENC(LPbn37xuIIAfCkaermp5cQ) # 加密后的密码密文
jasypt:
encryptor:
password: your_secret_key # 此处是加密时使用的密钥
# algorithm: PBEWithMD5AndDES # 如需指定算法,默认可能已是更安全的算法
步骤 4:安全地传递加密密钥
绝不能将加密密钥(your_secret_key)直接写死在配置文件中。推荐通过环境变量或启动参数传递:
-
启动参数传递:
java -jar -Djasypt.encryptor.password=your_secret_key your-app.jar -
环境变量传递:
在应用启动前设置环境变量
JASYPT_ENCRYPTOR_PASSWORD。
注意事项
- 版本兼容性:Jasypt 新版本(如 3.0.3+)有时会更改默认加密算法,可能导致与旧版本不兼容而启动报错。若遇到
Failed to bind properties等相关错误,可尝试降低 Jasypt 版本(例如使用2.1.2)或检查算法配置是否匹配。 - 加密算法:早期版本默认使用
PBEWithMD5AndDES。对于更高安全需求,建议使用更强大的算法(如PBEWITHHMACSHA512ANDAES_256),但这可能需要安装 Java Cryptography Extension (JCE)。 - 启用加密功能:在某些旧版本或特定配置下,可能需要在主应用类上添加
@EnableEncryptableProperties注解。但许多较新版本的jasypt-spring-boot-starter会自动配置。 - 不仅仅是数据库密码:Jasypt 可用于加密配置文件中的任何敏感信息,如 Redis 密码、API 密钥等。
- 测试:配置完成后,务必启动测试,确保应用能成功解密并连接数据库。
二、使用Druid 数据源加密方案
如果你在项目中使用的是阿里巴巴开发的Druid数据源,那么它自身就提供了数据库密码加密的功能。Druid使用的是非对称的RSA加密方案,相较于Jasypt的对称加密,安全性更高。
Druid提供了命令行工具来生成加密后的密码和相应的公钥、私钥。
-
下载Druid的JAR包(例如
druid-1.2.6.jar)。 -
在命令行中执行以下命令:
java -cp druid-1.2.6.jar com.alibaba.druid.filter.config.ConfigTools your_db_password此命令会输出:
privateKey: 你的私钥 (必须妥善保管,用于解密)publicKey: 你的公钥 (可以配置在连接池中)password: 加密后的密码
如下图,在命令窗口执行上述命令后后会生成私钥(privateKey)、公钥(publicKey)和加密后的密码(password)

-
配置
application.yml:spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: url: jdbc:mysql://localhost:3306/your_database username: your_username # 若用户名也需要加密,则替换为加密后的用户名 password: ${encrypted_password} # 此处替换为加密后密码 filters: config connection-properties: config.decrypt=true;config.decrypt.key=${public_key} # 此处public_key需替换或通过环境变量注入 filter: config: enabled: true同样,公钥(
public_key)也应通过环境变量等安全方式注入,而非硬编码在配置文件中。 -
借助Druid中的ConfigTools工具类来加密数据库对应的密码:
public static void main(String[] args) throws Exception { String password = "123456"; ConfigTools.main(new String[]{password}); }
如需对用户名进行加密,可使用上述密码加密后生成的
privateKey进行用户名加密,代码如下:public static void main(String[] args) throws Exception { String username = "root"; String privateKey = ""; // 填充密码加密生成的privateKey String encrypt = ConfigTools.encrypt(pr, name); System.out.println(encrypt); // 如需解密验证,使用下面的方法 // String publicKey = ""; // 填充密码加密生成的publicKey // String decrypt = ConfigTools.decrypt(publicKey, encrypt); // System.out.println(decrypt); }
三、总结
为 Spring Boot 应用配置数据库密码加密是提升安全性的重要一步。
- 对于大多数项目,推荐使用 Jasypt,它通用且与 Spring Boot 集成简单。使用时请注意版本兼容性,并务必通过安全方式(如启动参数、环境变量)传递加密密钥,避免硬编码。
- 若项目已使用 Druid 数据源,且安全要求较高,可以考虑使用其自带的 RSA 加密方案。
2364

被折叠的 条评论
为什么被折叠?



