SpringBoot对数据库用户名和密码进行加密的两种方案

 更新时间:2025年12月11日 09:10:53   作者:明有所思  
在当今互联网时代, 数据库安全的重要性不言而喻,作为Java开发的主流框架,Spring Boot项目通常需要连接数据库,而数据库的 用户名和密码作为最敏感的信息之一,所以本文给大家详细介绍两种主流的数据源配置加密方案,需要的朋友可以参考下

引言

在当今互联网时代, 数据库安全的重要性不言而喻。作为Java开发的主流框架,Spring Boot项目通常需要连接数据库,而数据库的 用户名和密码作为最敏感的信息之一,如果直接以明文形式存储在 application.properties或 application.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提供了命令行工具来生成加密后的密码和相应的公钥、私钥。

下载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 加密方案

以上就是SpringBoot对数据库用户名和密码进行加密的两种方案的详细内容,更多关于SpringBoot数据库用户名和密码加密的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot定制三种错误页面及错误数据方法示例

    SpringBoot定制三种错误页面及错误数据方法示例

    Spring Boot提供的默认异常处理机制通常并不一定适合我们实际的业务场景,因此,我们通常会根据自身的需要对Spring Boot全局异常进行统一定制,例如定制错误页面,定制错误数据等。本文主要介绍了SpringBoot三种自定义错误页面的实现,快来学习吧
    2021-12-12
  • Java中5种异步实现的方式详解

    Java中5种异步实现的方式详解

    同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现,需要的可以参考一下
    2022-09-09
  • Java中hashMap遍历的9种方式

    Java中hashMap遍历的9种方式

    hashMap是非常重要的容器类,本文主要介绍了Java中hashMap遍历的9种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 详解OAuth2 Token 一定要放在请求头中吗

    详解OAuth2 Token 一定要放在请求头中吗

    这篇文章主要介绍了详解OAuth2 Token 一定要放在请求头中吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java通过反射机制将对象封装成JSON和JsonArray格式

    Java通过反射机制将对象封装成JSON和JsonArray格式

    这篇文章主要介绍了Java通过反射机制将对象封装成JSON和JsonArray格式,JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法,需要的朋友可以参考下
    2023-10-10
  • Java服务实现开启Debug远程调试

    Java服务实现开启Debug远程调试

    文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率
    2025-09-09
  • 详解如何使用maven生成可以执行的jar

    详解如何使用maven生成可以执行的jar

    这篇文章主要介绍了详解如何使用maven生成可以执行的jar,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • JavaCV实现人脸检测功能

    JavaCV实现人脸检测功能

    这篇文章主要为大家详细介绍了JavaCV实现人脸检测功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Spring Cloud Alibaba和Dubbo融合实现

    Spring Cloud Alibaba和Dubbo融合实现

    这篇文章主要介绍了Spring Cloud Alibaba和Dubbo融合实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 对比Java设计模式编程中的状态模式和策略模式

    对比Java设计模式编程中的状态模式和策略模式

    这篇文章主要介绍了Java设计模式编程中的状态模式和策略模式对比,文中列举了两种模式的相似点和不同点,并都举了代码的实例作为参照,需要的朋友可以参考下
    2016-04-04

最新评论