Springboot 如何加密数据库连接相关配置信息
DruidDataSource 加密机制深度解析与对比
在现代应用开发中,保障数据库连接相关配置信息的安全性至关重要。DruidDataSource
作为一款广泛应用的数据库连接池,提供了有效的加密机制来保护敏感信息,例如通过配置 <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${public_key}" />
来实现加密和解密功能。同时,在 Spring Boot
项目中,还可以借助 jasypt-spring-boot-starter
插件实现配置加密。
一、DruidDataSource 原生加密机制
(一)加密机制概述
DruidDataSource
的原生加密功能旨在确保数据库连接配置中的关键信息(尤其是数据库密码)不以明文形式存在于配置文件中,从而增强系统的安全性。上述提到的配置属性 connectionProperties
是启动加密解密流程的关键配置项,其中 config.decrypt=true
明确告知 DruidDataSource
要对相关配置进行解密,而 config.decrypt.key=${public_key}
则指定了解密所依赖的密钥,这里的 ${public_key}
通常会在运行时通过合适的方式(如环境变量、系统属性)被替换为真实的密钥内容。
(二)加密与解密原理
- 加密过程:
Druid 采用对称加密算法对敏感信息进行加密。开发者可利用com.alibaba.druid.filter.config.ConfigTools
类提供的方法来生成加密后的密码。
/*** 加密方法* @param encryptKey 加密密钥* @param plainText 待加密的明文* @return 加密后的字符串* @throws Exception 加密过程中可能出现的异常*/
public static String encrypt(String encryptKey, String plainText) throws Exception {if (encryptKey == null || encryptKey.isEmpty()) {throw new IllegalArgumentException("加密密钥不能为空");}if (plainText == null || plainText.isEmpty()) {throw new IllegalArgumentException("待加密的内容不能为空");}return ConfigTools.encrypt(encryptKey, plainText);
}
- 解密过程:
当DruidDataSource
启动并读取配置文件时,检测到connectionProperties
中的解密配置开启后,会获取对应的密钥(即替换${public_key}
后的真实值),再运用相同的对称加密算法进行逆向操作,把加密后的密码还原为原始的明文密码,进而以此密码去建立与数据库的连接。在代码层面,也能通过ConfigTools
类的解密方法手动实现解密,示例如下:
import com.alibaba.druid.filter.config.ConfigTools;/*** 解密方法* @param decryptKey 解密密钥(与加密密钥相同)* @param encryptedValue 待解密的加密字符串* @return 解密后的明文* @throws Exception 解密过程中可能出现的异常*/public static String decrypt(String decryptKey, String encryptedValue) throws Exception {if (decryptKey == null || decryptKey.isEmpty()) {throw new IllegalArgumentException("解密密钥不能为空");}if (encryptedValue == null || encryptedValue.isEmpty()) {throw new IllegalArgumentException("待解密的内容不能为空");}return ConfigTools.decrypt(decryptKey, encryptedValue);}
(三)application.yml 中的配置示例
在 Spring Boot
项目中,若使用 DruidDataSource
原生加密方式,application.yml
配置文件示例如下:
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: ${jdbc.url}username: ${jdbc.username}password: 加密后的字符串 # 通过ConfigTools加密后的密码driver-class-name: com.mysql.cj.jdbc.Driverdruid:connection-properties: config.decrypt=true;config.decrypt.key=${public_key