Druid 数据库密码加密
一、Druid密码加密原理
Druid使用RSA非对称加密算法进行密码加密。RSA算法通过生成一对公钥和私钥来实现加密和解密操作。公钥用于加密数据,而私钥则用于解密数据。在Druid中,原始密码使用私钥进行加密,生成密文,密文可以保存在配置文件或数据库中。当需要验证密码时,可以使用公钥对密文进行解密,还原成原始密码进行比较。
二、Druid密码加密步骤
-
生成密钥对:
Druid的ConfigTools工具类可以生成RSA公钥和私钥对。这对密钥用于后续的加密和解密操作。 -
加密密码:
使用私钥对原始密码进行加密,生成加密后的密码(密文)。这个加密过程可以通过执行ConfigTools工具类提供的加密方法来实现,或者通过Druid提供的命令行工具来执行。 -
配置加密后的密码:
将加密后的密码(密文)和公钥配置在数据库连接池的配置文件中。这样,当数据库连接池需要连接数据库时,就可以使用公钥来解密加密后的密码,从而获取到明文密码进行数据库连接。
三、具体实现方式
1. 使用ConfigTools工具类
Druid的ConfigTools工具类提供了加密和解密的方法。你可以通过编写Java代码来调用这些方法,也可以使用Druid提供的命令行工具来执行加密操作。
命令行加密示例:
java -cp druid-xxx.jar com.alibaba.druid.filter.config.ConfigTools your_password
这里druid-xxx.jar是Druid的jar包路径,your_password是你要加密的原始密码。执行命令后,会在控制台输出加密后的密码(密文)和公钥。
2. 配置加密后的密码和公钥
在数据库连接池的配置文件中(如application.yml或application.properties),将加密后的密码和公钥配置到相应的位置。例如:
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/your_database
username: root
password: 加密后的密码
publicKey: 公钥
connection-properties: config.decrypt=true;config.decrypt.key=${publicKey}
filter:
config:
enabled: true
publicKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
注意:在配置文件中,password字段应填写加密后的密码,publicKey字段应填写生成的公钥。同时,需要配置connection-properties属性来启用加密功能,并指定解密密钥为公钥。
四、注意事项
保护私钥安全:私钥是解密加密密码的关键,必须妥善保管,防止泄露。
定期更换密钥:为了增强安全性,建议定期更换公钥和私钥对。
配置正确:在配置文件中正确配置加密后的密码和公钥,确保数据库连接池能够正确解密密码并连接到数据库。
示例代码
常用方法
String[] keyPair = ConfigTools.genKeyPair(int keySize);
生成两个字符串,可分别当作公钥与私钥ConfigTools.encrypt(String privateKey, String plainText )
加密ConfigTools.decrypt(String publicKey, String plainText)
解密
/**
* 数据库加密
*/
public class DruidEncryptUtil {
private static String publicKey; //公钥
private static String privateKey; //私钥
static {
try {
String[] keyPair = ConfigTools.genKeyPair(1024);
privateKey = keyPair[0];
System.out.println("privateKey:" + privateKey);
publicKey = keyPair[1];
System.out.println("publicKey:" + publicKey);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
}
//加密 -- 返回加密后密码
public static String encrypt(String str) throws Exception {
String encrypt = ConfigTools.encrypt(privateKey,str);
System.out.println("encrypt : " + encrypt);
return encrypt;
}
//解密
public static String decrypt(String str) throws Exception {
String decrypt = ConfigTools.decrypt(publicKey,str);
System.out.println("decrypt : " + decrypt);
return decrypt;
}
/**
* 在启动时传递参数
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//encrypt(args[0]);
encrypt("20021207");
}
}
该文件的作用只是为了得到 公钥,私钥 以及根据私钥加密后的密码,传递的字符串为 原始密码==解密后的密码。
公钥是用来解密的,私钥是用来加密的
得到之后这个文件就可以删除了,保存这些密钥即可。
解密过程在Druid内部进行,因为有依赖的存在,不需要手动解密。
最主要的是进行配置
扩展
同样,可以使用一样的思路对用户名,IP地址等加密
RSA密钥
Druid本身作为一个数据库连接池,并不直接提供生成RSA密钥的功能。但是,Druid的ConfigTools工具类可以与RSA加密结合使用,来加密数据库密码。生成RSA密钥通常需要使用Java的加密库(如java.security包下的类)
以下是生成RSA密钥的方法,这些方法可以与Druid的ConfigTools工具类结合使用来加密数据库密码:
使用Java代码生成RSA密钥
导入必要的包:
需要导入java.security包下的相关类,如KeyPairGeneratorr等。
生成密钥对:
使用 KeyPairGenerator 类生成RSA密钥对。可以指定密钥的长度(如2048位)。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
public class RSAKeyPairGenerator {
//keySize -- 指定密钥长度
public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException, NoSuchProviderException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(keySize);
return keyPairGenerator.generateKeyPair();
}
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException {
KeyPair keyPair = generateKeyPair(2048);
// 这里可以打印出公钥和私钥,或者保存到文件中
}
}
提取公钥和私钥:
从生成的KeyPair对象中提取公钥和私钥,并保存为字符串或文件。
常用方法
KeyPairGenerator 生成密钥
KeyPairGenerator类是Java加密架构(Java Cryptography Architecture, JCA)中的一个重要组成部分,它用于生成公钥和私钥对。这个类提供了多个方法和功能,以下是KeyPairGenerator类的一些常用方法和描述:
常用方法
-
getInstance(String algorithm)
描述:此方法用于获取指定算法的KeyPairGenerator实例。算法名称是一个字符串,它指定了要使用的密钥对生成算法,如"RSA"、"DSA"等。
参数:algorithm - 密钥对生成算法的名称。
返回值:返回指定算法的KeyPairGenerator实例。
异常:如果找不到指定算法的KeyPairGenerator实现,将抛出NoSuchAlgorithmException。 -
initialize(int keysize)
描述:此方法用于初始化密钥对生成器,以生成具有指定密钥大小的密钥对。密钥大小是一个整 数,它定义了密钥的强度。
参数:keysize - 密钥对中的密钥大小(以位为单位)。
注意:此方法的实现将使用默认的参数集合和提供程序(以最高优先级安装)的SecureRandom实现作为随机源。 -
generateKeyPair()
描述:此方法用于生成密钥对。在调用此方法之前,必须先通过调用initialize方法之一来初始化KeyPairGenerator。
返回值:返回一个KeyPair对象,该对象包含生成的公钥和私钥。 -
initialize(int keysize, SecureRandom random)
描述:此方法类似于initialize(int keysize),但它允许指定一个SecureRandom实例作为随机源,以便生成密钥对。
参数:keysize - 密钥对中的密钥大小(以位为单位);random - 用于生成密钥对的随机源。
注意:通过指定随机源,可以增加密钥生成的随机性和安全性。 -
initialize(AlgorithmParameterSpec params)
描述:此方法用于使用指定参数集合初始化密钥对生成器。这允许更细粒度的控制密钥对的生成过程。
参数:params - 密钥对生成所需的算法参数。
注意:此方法将使用提供程序(以最高优先级安装)的SecureRandom实现作为随机源。 -
initialize(AlgorithmParameterSpec params, SecureRandom random)
描述:此方法结合了initialize(AlgorithmParameterSpec params)和initialize(int keysize, SecureRandom random)的功能,允许同时指定算法参数和随机源。
参数:params - 密钥对生成所需的算法参数;random - 用于生成密钥对的随机源。
总结
KeyPairGenerator类提供了生成公钥和私钥对的功能,通过不同的getInstance方法可以选择不同的算法和提供者,通过initialize方法可以配置密钥大小和随机源等参数,最后通过generateKeyPair方法生成密钥对。
ConfigTools 加密与解密
-
读取配置文件
描述:ConfigTools能够读取多种格式的配置文件,如JSON、YAML、INI和TOML等。这使得开发者可以方便地根据项目需求选择合适的配置文件格式。 -
解析配置文件
描述:在读取配置文件后,ConfigTools会解析这些文件的内容,将其转换为程序可以理解的格式(如字典、对象等),以便进行后续的操作。 -
写入配置文件
描述:ConfigTools支持将配置信息写入到文件中,支持多种格式。这允许开发者在需要时修改配置文件,或者将配置信息保存到文件中以便后续使用。 -
配置合并
描述:ConfigTools可以将多个配置文件合并成一个,这对于模块化项目或者有层级结构的配置非常有用。它可以帮助开发者更好地组织和管理配置信息,避免配置文件的重复和混乱。 -
模板引擎集成
描述:内置了简单的模板引擎,允许动态生成配置。这提供了灵活性,允许开发者根据环境变量或运行时参数动态地生成配置信息。 -
安全操作
描述:在读写配置文件时,ConfigTools尊重权限,并提供了错误处理机制,确保操作的健壮性。这有助于防止因配置错误而导致的程序崩溃或安全问题。 -
开发环境支持
描述:ConfigTools可以快速初始化项目配置,根据环境自动加载不同的配置文件。这有助于开发者在开发环境中更快地启动和测试项目。 -
持续集成/持续部署(CI/CD)支持
描述:在自动化流程中,ConfigTools可以动态生成或更新配置,以适应不同阶段的需求。这有助于实现更高效的CI/CD流程。 -
微服务架构支持
描述:在微服务架构中,每个服务可以有自己的配置,通过ConfigTools进行集中管理和版本控制。这有助于保持服务间配置的一致性,并简化配置的更新和部署过程。 -
服务器配置管理
描述:ConfigTools可以批量更新或同步远程服务器的配置文件。这有助于维护大量服务器时的配置一致性,并减少手动操作的工作量。