Spring Boot数据库用户名和密码加密:Jasypt与Druid加密方案详解


在当今互联网时代, 数据库安全的重要性不言而喻。作为Java开发的主流框架,Spring Boot项目通常需要连接数据库,而数据库的 用户名和密码作为最敏感的信息之一,如果直接以明文形式存储在 application.propertiesapplication.yml配置文件中,将存在极大的安全隐患。特别是在项目代码需要上传到GitHub等开源平台或团队协作开发时, 明文数据库凭证可能会被恶意利用,导致数据泄露甚至被删除的风险。

因此,对Spring Boot项目中的数据库用户名和密码进行加密处理,是每个开发者都应该重视的安全实践。本文将从实际应用出发,详细介绍两种主流的数据源配置加密方案:Jasypt(通用性加密库)和Druid(自带加密功能的数据源),帮助你根据项目需求选择最适合的方案,全面提升应用安全性。

下面是一个快速对比,帮助你了解两种主要方案的特点:

特性JasyptDruid 数据源加密
加密方式对配置值进行对称加密,使用 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.23.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 包命令行加密(常用)

  1. 找到本地 Maven 仓库中的 jasypt-1.9.3.jar(版本号可能不同)。

  2. 在命令行中执行以下命令(请替换 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.propertiesapplication.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

注意事项
  1. 版本兼容性:Jasypt 新版本(如 3.0.3+)有时会更改默认加密算法,可能导致与旧版本不兼容而启动报错。若遇到 Failed to bind properties 等相关错误,可尝试降低 Jasypt 版本(例如使用 2.1.2)或检查算法配置是否匹配。
  2. 加密算法:早期版本默认使用 PBEWithMD5AndDES。对于更高安全需求,建议使用更强大的算法(如 PBEWITHHMACSHA512ANDAES_256),但这可能需要安装 Java Cryptography Extension (JCE)。
  3. 启用加密功能:在某些旧版本或特定配置下,可能需要在主应用类上添加 @EnableEncryptableProperties 注解。但许多较新版本的 jasypt-spring-boot-starter 会自动配置。
  4. 不仅仅是数据库密码:Jasypt 可用于加密配置文件中的任何敏感信息,如 Redis 密码、API 密钥等。
  5. 测试:配置完成后,务必启动测试,确保应用能成功解密并连接数据库。

二、使用Druid 数据源加密方案

如果你在项目中使用的是阿里巴巴开发的Druid数据源,那么它自身就提供了数据库密码加密的功能。Druid使用的是非对称的RSA加密方案,相较于Jasypt的对称加密,安全性更高。

Druid提供了命令行工具来生成加密后的密码和相应的公钥、私钥。

  1. 下载Druid的JAR包(例如druid-1.2.6.jar)。

  2. 在命令行中执行以下命令:

    java -cp druid-1.2.6.jar com.alibaba.druid.filter.config.ConfigTools your_db_password
    

    此命令会输出:

    • privateKey: 你的私钥 (必须妥善保管,用于解密)
    • publicKey: 你的公钥 (可以配置在连接池中)
    • password: 加密后的密码

    如下图,在命令窗口执行上述命令后后会生成私钥(privateKey)、公钥(publicKey)和加密后的密码(password)

    在这里插入图片描述

  3. 配置 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)也应通过环境变量等安全方式注入,而非硬编码在配置文件中。

  4. 借助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 加密方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值