Druid连接池实现自定义数据库密码加解密功能详解
Druid连接池实现自定义数据库密码加解密功能详解
在企业级应用开发中,数据库密码的明文存储是一个显著的安全隐患。Druid作为阿里巴巴开源的高性能数据库连接池组件,提供了灵活的密码加密与解密功能,允许开发者通过自定义逻辑实现数据库密码的加密存储与动态解密。本文将详细介绍如何基于Druid连接池实现自定义的数据库密码加解密功能,并结合Spring Boot框架进行集成,帮助开发者提升系统的安全性。
一、背景与需求
1. 问题场景
在传统Spring Boot项目中,数据库密码通常以明文形式存储在application.yml
或application.properties
配置文件中。这种做法存在以下风险:
- 配置文件泄露:若配置文件被恶意获取,攻击者可直接读取数据库密码。
- 权限滥用:开发人员或运维人员在调试时可能误操作敏感信息。
- 合规性要求:部分行业标准(如GDPR)要求敏感数据必须加密存储。
2. Druid的解决方案
Druid通过以下机制支持密码加密:
- 内置加密工具:提供
ConfigTools
工具类,支持使用AES算法加密密码。 - 自定义回调逻辑:允许开发者通过继承
DruidPasswordCallback
或自定义DruidDataSource
实现密码解密逻辑。 - Spring Boot集成:通过配置
DruidDataSource
的passwordCallback
属性或自定义初始化器,实现密码的动态解密。
二、实现步骤
1. 生成加密密码
Druid提供了命令行工具ConfigTools
,用于生成加密后的密码和密钥。
步骤
- 准备Druid JAR包:确保本地已下载Druid的JAR文件(如
druid-1.2.18.jar
)。 - 执行加密命令:
执行后,输出包含加密后的密码、公钥(publicKey)和私钥(privateKey)。java -cp druid-1.2.18.jar com.alibaba.druid.filter.config.ConfigTools your_password
Encrypted Password: e9b7f4a5c0d6df71aefbacd7bb6434ea Public Key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIcJxWEMHcqBNY7FKX7RufzMNhll8NRG9GAdP6/QbQQQbT0QIgMol0lW57AUK9/Vzhr6VfgdqLQ1h2Zy8YTOXJ8ECAwEAAQ== Private Key: MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggFAMB8...
- 保存密钥与加密密码:
- 将加密后的密码替换到配置文件中的
spring.datasource.password
字段。 - 将私钥(privateKey)存储在安全的位置(如服务器环境变量或加密配置中心)。
- 将加密后的密码替换到配置文件中的
2. 自定义密码解密逻辑
方法一:通过DruidPasswordCallback
回调类
Druid允许通过实现DruidPasswordCallback
接口,在连接初始化时动态解密密码。
代码示例
-
创建回调类:
package com.example.druid;import com.alibaba.druid.util.DruidPasswordCallback; import java.util.Properties;public class CustomPasswordCallback extends DruidPasswordCallback {@Overridepublic void setProperties(Properties properties) {super.setProperties(properties);String encryptedPassword = properties.getProperty("password");if (encryptedPassword != null) {// 调用自定义解密方法String decryptedPassword = decrypt(encryptedPassword);setPassword(decryptedPassword.toCharArray());}}private String decrypt(String encryptedPassword) {// 示例:使用AES解密String privateKey = "MIIBVgIBADANBgkqhkiG9w0BAQEFAASC...";return AESUtil.decrypt(encryptedPassword, privateKey);} }
-
配置Spring的
DruidDataSource
:<bean id="dbPasswordCallback" class="com.example.druid.CustomPasswordCallback" lazy-init="true"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="e9b7f4a5c0d6df71aefbacd7bb6434ea"/> <!-- 加密后的密码 --><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="passwordCallback" ref="dbPasswordCallback"/> </bean>
方法二:继承DruidDataSource
并重写setPassword
方法
在Spring Boot项目中,可通过自定义DruidDataSource
实现密码解密。
代码示例
-
自定义数据源类:
package com.example.druid;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.stereotype.Component;@Component public class CustomDruidDataSource extends DruidDataSource {@Overridepublic void setPassword(String password) {try {// 使用自定义解密方法String decryptedPassword = AESUtil.decrypt(password, "your-secret-key");super.setPassword(decryptedPassword);} catch (Exception e) {throw new RuntimeException("Password decryption failed", e);}} }
-
配置Spring Boot数据源:
spring:datasource:type: com.example.druid.CustomDruidDataSourceurl: jdbc:mysql://localhost:3306/mydbusername: rootpassword: e9b7f4a5c0d6df71aefbacd7bb6434ea # 加密后的密码
3. 加密算法实现
Druid默认使用AES算法进行加密,开发者可根据需求选择其他算法(如RSA)。
AES加密示例
public class AESUtil {public static String encrypt(String data, String key) throws Exception {Cipher cipher = Cipher.getInstance("AES");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));}public static String decrypt(String encryptedData, String key) throws Exception {Cipher cipher = Cipher.getInstance("AES");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(decryptedBytes);}
}
三、注意事项
1. 密钥管理
- 安全存储:私钥应存储在服务器环境变量、加密配置中心(如Nacos)或专用密钥管理服务(如AWS KMS)中,避免硬编码在代码中。
- 定期更新:定期更换加密密钥,并重新生成加密密码,降低长期密钥泄露风险。
2. 配置文件保护
- 限制访问权限:确保配置文件的存储目录权限仅限于必要人员访问。
- 使用加密配置中心:在Spring Cloud生态中,可通过Spring Cloud Config或Nacos实现配置文件的动态加密与解密。
3. 测试与验证
- 单元测试:编写单元测试验证加密与解密逻辑的正确性。
- 集成测试:启动应用后,通过数据库连接测试(如执行简单查询)确认密码解密功能生效。
四、总结
通过Druid连接池的自定义密码加解密功能,开发者可以有效规避数据库密码明文存储的风险。本文介绍了两种常见的实现方式:
- 基于
DruidPasswordCallback
的回调机制:适用于传统Spring项目,通过继承回调类实现动态解密。 - 自定义
DruidDataSource
:适合Spring Boot项目,通过重写方法集成加密逻辑。
在实际应用中,需结合项目需求选择合适的实现方案,并严格遵循密钥管理规范,确保系统的安全性与稳定性。通过合理配置,开发者可在不牺牲性能的前提下,显著提升数据库连接的安全性。
参考资源:
- Druid官方文档
- Spring Boot与Druid集成指南
相关文章:
Druid连接池实现自定义数据库密码加解密功能详解
Druid连接池实现自定义数据库密码加解密功能详解 在企业级应用开发中,数据库密码的明文存储是一个显著的安全隐患。Druid作为阿里巴巴开源的高性能数据库连接池组件,提供了灵活的密码加密与解密功能,允许开发者通过自定义逻辑实现数据库密码…...

OS11.【Linux】vim文本编辑器
目录 1.四种模式 命令模式 几个命令 插入模式 底行模式 一图展示三种模式之间的关系 2.分屏(多文件操作) 3.配置vim的原理 4.脚本一键配置vim CentOS 7 x86_64 其他发行版 5.NeoVim(推荐) vim文本编辑器是一个多模式的编辑器,因此先介绍它的四种模式 附vim的官网:…...

基于SFC的windows系统损坏修复程序
前言 在平时使用Windows操作系统时会遇到很多因为系统文件损坏而出现的错误 例如:系统应用无法打开 系统窗口(例如开始菜单)无法使用 电脑蓝屏或者卡死 是如果想要修复很多人只能想到重装系统。但其实Windows有一个内置的系统文件检查器可以修复此类错误。 原理 SFC命令…...
强化学习基础概念图文版笔记
📘 强化学习基础概念图文版笔记 1️⃣ 基本框架:Agent 与 Environment 🧠 核心角色: Agent(智能体):做出决策的“大脑”,根据当前状态选择动作。Environment(环境&…...
k8s下离线搭建elasticsearch
前提 已经完成k8s安装 已经完成相关组件如helm的安装 下载es的chart包 如下地址 https://helm.elastic.co/helm/elasticsearch/elasticsearch-版本号.tgz 如6.8.10 https://helm.elastic.co/helm/elasticsearch/elasticsearch-6.8.10.tgz 修改配置 修改value.yaml文件…...

WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验
一、WAF绕过文件上传漏洞 win7:10.0.0.168 思路:要想要绕过WAF,第一步是要根据上传的内容找出来被拦截的原因。对于文件上传有三个可以考虑的点:文件后缀名,文件内容,文件类型。 第二步是根据找出来的拦截原…...
Oracle杀进程注意事项
文章目录 一、哪些后台进程杀死会导致数据库重启二、杀死哪些后台进程会导致数据库关闭三、杀死哪些后台进程对数据库没有影响 一、哪些后台进程杀死会导致数据库重启 CKPT:检查点进程,checkpoint 检查点,检查点事件的责任是:标志…...

Vue 3 弹出式计算器组件(源码 + 教程)
🧮 Vue 3 弹出式计算器组件(源码 教程) 📌 建议收藏 点赞 关注,本组件支持加减乘除、双向绑定、计算过程展示,适用于表单辅助输入场景。 🔧 一、完整源码(复制即用) …...

监测预警系统重塑隧道安全新范式
在崇山峻岭的脉络间延伸的隧道,曾是交通安全的薄弱环节。智慧隧道监测预警系统的诞生,正在彻底改变这种被动防御格局,通过数字神经网络的构建,为地下交通动脉注入智能守护基因。 一、安全防控体系的质变升级 1.风险感知维度革命…...
solidity中sar和>>的区别
sar和>>都是右移操作,其区别简而言之前者保留符号位,后者不保留。要解释清楚这个问题,需要从有符号数和无符号数讲起: 有符号数和无符号数 打个比方int8和uint8 uint8(无符号 8 位整数) 取值范围:…...
ESP32与STM32
ESP32与STM32深度对比:物联网与嵌入式开发的王者之争 一、核心架构对比 1.1 ESP32 - 无线物联网霸主 // 典型双核架构配置 #include "freertos/FreeRTOS.h" #include "freertos/task.h"void app_main() {// 核心0执行无线通信任务xTaskCreat…...
vue在打包的时候能不能固定assets里的js和css文件名称
在 Vue 项目中(特别是使用 Vue CLI 构建的项目),打包时生成的 assets 目录下的 .js 和 .css 文件默认会带有哈希值(如 app.123abc.js),这是为了缓存优化。但你可以配置固定名称,方法如下&#x…...
用设计模式重新思考(类FSM)验证:从混乱到优雅
在数字设计的世界里,Finite-State Machine(FSM)就像一个城市的交通信号系统。每个状态都有自己的规则,每个转换都需要精确的条件。而对于验证工程师来说,如何优雅地验证这些状态机,一直是个让人头疼的问题。…...

技巧小结:外部总线访问FPGA寄存器
概述 需求:stm32的fsmc总线挂载fpga,stm32需要访问fpga内部寄存器 1、分散加载文件将变量存放到指定地址即FPGA寄存器地址 sct文件指定变量存储地址,从而可以直接访问外设,(28335也可以,不过用的是cmd文件…...
Qt客户端技巧 -- 窗口美化 -- 圆角窗口
不解析,直接给代码例子 利用窗口重绘事件处理函数paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…...
Go语言爬虫系列教程5:HTML解析技术以及第三方库选择
Go语言爬虫系列教程5:HTML解析技术以及第三方库选择 在上一章中,我们使用正则表达式提取网页内容,但这种方法有局限性。对于复杂的HTML结构,我们需要使用专门的HTML解析库。在这一章中,我们将介绍HTML解析技术以及如何…...
理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
前言 在JavaScript面试中,map和parseInt的组合常常被用作考察候选人对这两个方法理解深度的题目。让我们通过一个简单的例子来深入探讨其中的原理。 问题现象 [1, 2, 3].map(parseInt) // 输出结果是什么?很多人可能会预期输出[1, 2, 3],但…...
文件上传漏洞深度解析:检测与绕过技术矩阵
文件上传漏洞深度解析:检测与绕过技术矩阵 引言:无处不在的文件上传风险 在当今的Web应用生态系统中,文件上传功能几乎无处不在。从社交媒体分享图片到企业文档管理系统,用户上传文件已成为现代Web应用的核心功能之一。然而&…...
3.2 HarmonyOS NEXT跨设备任务调度与协同实战:算力分配、音视频协同与智能家居联动
HarmonyOS NEXT跨设备任务调度与协同实战:算力分配、音视频协同与智能家居联动 在万物互联的全场景时代,设备间的高效协同是释放分布式系统潜力的关键。HarmonyOS NEXT通过分布式任务调度技术,实现了跨设备算力动态分配与任务无缝流转&#…...
Elasticsearch 海量数据写入与高效文本检索实践指南
Elasticsearch 海量数据写入与高效文本检索实践指南 一、引言 在大数据时代,企业和组织面临着海量数据的存储与检索需求。Elasticsearch(以下简称 ES)作为一款基于 Lucene 的分布式搜索和分析引擎,凭借其高可扩展性、实时搜索和…...

jenkins集成gitlab发布到远程服务器
jenkins集成gitlab发布到远程服务器 前面我们讲了通过创建maven项目部署在jenkins本地服务器,这次实验我们将部署在远程服务器,再以nginx作为前端项目做一个小小的举例 1、部署nginx服务 [rootweb ~]# docker pull nginx [rootweb ~]# docker images …...
AI问答-vue3+ts+vite:http://www.abc.com:3022/m-abc-pc/#/snow 这样的项目 在服务器怎么部署
为什么记录有子路径项目的部署,因为,通过子路径可以区分项目,那么也就可以实现微前端架构,并且具有独特优势,每个项目都是绝对隔离的。 要将 Vue3 项目(如路径为 http://www.abc.com:3022/m-saas-pc/#/sno…...

当主观认知遇上机器逻辑:减少大模型工程化中的“主观性”模糊
一、人类与机器的认知差异 当自动驾驶汽车遇到紧急情况需要做出选择时,人类的决策往往充满矛盾:有人会优先保护儿童和老人,有人坚持"不主动变道"的操作原则。这种差异背后,体现着人类特有的情感判断与价值选择。而机器的…...

会计 - 金融负债和权益工具
一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…...
.net Span类型和Memory类型
.NET 中 Span 类型和 Memory 类型的深度剖析 在 .NET 编程的世界里,高效处理内存是提升程序性能的关键。Span<T> 和 Memory<T> 类型的出现,为开发者提供了强大而灵活的工具,用于高效地访问和操作连续内存区域。今天,…...

Dify工具插件开发和智能体开发全流程
想象一下,你正在开发一个 AI 聊天机器人,想让它能实时搜索 Google、生成图像,甚至自动规划任务,但手动集成这些功能耗时又复杂。Dify 来了!这个开源的 AI 应用平台让你轻松开发工具插件和智能体策略插件,快…...
ES6——对象扩展之Set对象
在ES6(ECMAScript 2015)中,Set 对象允许存储任何类型的唯一值,无论是原始值还是对象引用。Set 对象有一些有用的方法,可以操作集合中的数据。以下是一些常用的 Set 对象方法: 方法描述 add 向 Set 对象添加…...

AI书签管理工具开发全记录(十三):TUI基本框架搭建
文章目录 AI书签管理工具开发全记录(十三):TUI基本框架搭建前言 📝1.TUI介绍 🔍2. 框架选择 ⚙️3. 功能梳理 🎯4. 基础框架搭建⚙️4.1 安装4.2 参数设计4.3 绘制ui4.3.1 设计结构体4.3.2 创建头部4.3.3 创…...
<2>-MySQL库的操作
目录 一,创建数据库 二,查看字符集和校验规则 三,修改数据库 四,删除数据库 五,备份和恢复数据库 六,查看连接 一,创建数据库 创建一个名为bin_db的数据库,并设置字符集为utf8…...
Apache DolphinScheduler 和 Apache Airflow 对比
Apache DolphinScheduler 和 Apache Airflow 都是开源的工作流调度平台,用于管理和编排复杂的数据处理任务和管道。以下是对两者在功能、架构、使用场景等方面的对比,用中文清晰说明: 1. 概述 Apache DolphinScheduler: 一个分布…...