Spring boot自定义加密解密数据库连接配置示例代码

 更新时间:2026年05月06日 08:16:33   作者:小瓦码J码  
在Spring Boot项目中,为了保护数据库连接信息的安全,通常需要对敏感信息进行加密,这篇文章主要介绍了Spring boot自定义加密解密数据库连接配置的相关资料,需要的朋友可以参考下

前言

大家在日常工作中是否有对配置加密的要求呢?

可能你一下子就会想到,Jasypt作为标准的解决方案。不过,你有没有想过先手动搓一个呢?

本文我们先来看看,如何手动写一个加密解密配置的机制。

需求描述

对配置文件中的数据库连接配置,执行加密。确保上传到git仓库的配置以密文形式存在。

密钥不会写到配置文件,可以通过命令行参数或者环境变量的方式注入。保证安全性。

方案原理是:手动实现配置加解密+自定义DataSource Bean完成解密。

本场景针对数据库连接配置进行加密解密。当然,其他的加密配置项也适用。

准备

  1. 数据库实例,demo项目使用的是postgresql。
  2. 对称加密工具类,可以实现加密解密。
  3. 自定义DataSource Bean配置类,在此配置类中实现对用户名和密码的解密后,再构造DataSource对象。
/**
 * 自定义数据源配置类
 * 支持从命令行参数或环境变量读取解密密钥,解密数据库用户名和密码后构造 DataSource
 */
@Configuration
public class DataSourceSimpleConfig {

    private static final Logger logger = LoggerFactory.getLogger(DataSourceSimpleConfig.class);

    private static final String ENC_PREFIX = "{enc}";

    // 密钥获取优先级:命令行参数 > 环境变量
    @Value("${db.encrypt.key:#{systemEnvironment['ENCRYPT_KEY']}}")
    private String encryptKey;

    private final Environment environment;

    public DataSourceSimpleConfig(Environment environment) {
        this.environment = environment;
    }

    /**
     * 自定义 DataSource Bean
     * 解密数据库配置后构造 HikariDataSource
     */
    @Bean
    public DataSource dataSource() throws Exception {
        logger.info("========== 开始配置数据源 ==========");

        // 获取原始配置
        String url = environment.getProperty("spring.datasource.url");
        String encryptedUsername = environment.getProperty("spring.datasource.username");
        String encryptedPassword = environment.getProperty("spring.datasource.password");
        String driverClassName = environment.getProperty("spring.datasource.driver-class-name");

        // 检查是否需要解密
        String username;
        String password;

        if (encryptedUsername.startsWith(ENC_PREFIX)) {
            // 需要解密用户名
            logger.info("检测到加密的用户名,开始解密...");
            String encryptedUser = encryptedUsername.substring(ENC_PREFIX.length());
            username = decrypt(encryptedUser, encryptKey);
            logger.info("用户名解密成功");
        } else {
            username = encryptedUsername;
            logger.info("用户名未加密,直接使用");
        }

        if (encryptedPassword.startsWith(ENC_PREFIX)) {
            // 需要解密密码
            logger.info("检测到加密的密码,开始解密...");
            String encryptedPass = encryptedPassword.substring(ENC_PREFIX.length());
            password = decrypt(encryptedPass, encryptKey);
            logger.info("密码解密成功");
        } else {
            password = encryptedPassword;
            logger.info("密码未加密,直接使用");
        }

        // 创建 HikariConfig
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        
        if (driverClassName != null && !driverClassName.isEmpty()) {
            hikariConfig.setDriverClassName(driverClassName);
        }

        // 创建数据源
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        
        logger.info("✅ 数据源配置完成");
        logger.info("   JDBC URL: {}", url);
        logger.info("========== 数据源配置完成 ==========");

        return dataSource;
    }

    /**
     * 解密方法
     *
     * @param encryptedText 加密文本(Base64 编码)
     * @param key           解密密钥(Base64 编码)
     * @return 解密后的明文
     */
    private String decrypt(String encryptedText, String key) throws Exception {
        try {
            return AesUtil.decryptGCM(encryptedText, key);
        } catch (Exception e) {
            logger.error("❌ 解密失败!", e);
            logger.error("   错误信息: {}", e.getMessage());
            throw new RuntimeException("解密失败,请检查密钥是否正确", e);
        }
    }
}
  1. 准备密钥,可以随便写。密钥通过环境变量配置。

步骤

  1. 首先创建空白项目,配置完数据库连接后,启动项目并确认数据库连接正常。
  2. 根据生成的密钥,创建用户名密码的密文。并以特定的格式替换配置中原来的位置。
url: jdbc:postgresql://
username: "{enc}111111"
password: "{enc}222222"
  1. 添加上一节准备好的 DataSourceSimpleConfig类。
  2. 在启动配置中,添加密钥环境变量配置 ENCRYPT_KEY="333333"
  3. 启动测试,可以看到仍然实现了正常连接。并且,对用户名和密码的解密日志也打印出来了
========== 开始配置数据源 ==========
检测到加密的用户名,开始解密...
已获取解密密钥(长度 4)
用户名解密成功
检测到加密的密码,开始解密...
已获取解密密钥(长度 4)
密码解密成功

测试环境

  • JDK:17
  • Spring boot:4.0.6

版本仅供参考,无强制要求。

总结

怎么样,是不是很简单!

经过这么一番改造,上传到git中的只有加密后的字符串。密钥独立配置提升了安全性。

对于当前示例这个方案足够了。

但是,如果很多配置项都需要加密呢?这么一个一个写,岂不是要累死?

解决方案就是拿数据库当配置中心来用,将配置存储到数据库里就能避免传入git了。所以,本文首先拿数据库连接加密来试水。

下篇,我们来探讨,如何将数据库作为配置中心来使用,并在启动时自动加载数据库配置,敬请期待!

到此这篇关于Spring boot自定义加密解密数据库连接配置的文章就介绍到这了,更多相关Springboot配置加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现int、long、Integer、Long之间的相互转换

    Java实现int、long、Integer、Long之间的相互转换

    本文主要介绍了Java实现int、long、Integer、Long之间的相互转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 基于Apache组件分析对象池原理的实现案例分析

    基于Apache组件分析对象池原理的实现案例分析

    本文从对象池的一个简单案例切入,主要分析common-pool2组件关于:池、工厂、配置、对象管理几个角色的源码逻辑,并且参考其在Redis中的实践,对Apache组件分析对象池原理相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • Sentinel热点key限流的实现详解

    Sentinel热点key限流的实现详解

    这篇文章主要介绍了Sentinel热点key限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • spring+mybatis实现图书管理系统

    spring+mybatis实现图书管理系统

    这篇文章主要为大家详细介绍了spring+mybatis实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • IntelliJ IDEA修改内存大小,使得idea运行更流畅

    IntelliJ IDEA修改内存大小,使得idea运行更流畅

    今天小编就为大家分享一篇关于IntelliJ IDEA修改内存大小,使得idea运行更流畅的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • JSR-107缓存规范介绍

    JSR-107缓存规范介绍

    JSR是Java Specification Requests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧
    2025-05-05
  • Spring mvc是如何实现与数据库的前后端的连接操作的?

    Spring mvc是如何实现与数据库的前后端的连接操作的?

    今天给大家带来的是关于Spring mvc的相关知识,文章围绕着Spring mvc是如何实现与数据库的前后端的连接操作的展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java Lambda表达式的方法引用和构造器引用实例分析

    Java Lambda表达式的方法引用和构造器引用实例分析

    这篇文章主要介绍了Java Lambda表达式的方法引用和构造器引用,结合实例形式分析了Lambda表达式的方法引用和构造器引用相关原理、用法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • 详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)

    详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)

    这篇文章主要介绍了详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Spring元注解@HttpExchange声明式调用HTTP

    Spring元注解@HttpExchange声明式调用HTTP

    这篇文章主要介绍了Spring元注解@HttpExchange声明式调用HTTP,Spring Framework6和Spring Boot3引入了声明式HTTP客户端@HttpExchange,通过接口注解简化REST API调用,核心注解包括@GetExchange、@PostExchange等对应HTTP方法,支持路径参数和请求体,需要的朋友可以参考下
    2025-10-10

最新评论