1.情景展示
在web開發過程中,數據庫連接我們通常使用阿里的druid配置連接池。
通常會在application.yml或者application.properties文件當中配置數據源(數據庫地址、用戶名和密碼),由於這些都直接暴露在配置文件當中,具有安全隱患。
能不能對這些信息進行加密呢?
2.具體分析
加密的目的是:為了提高數據的安全性;
要想實現需要保證兩個流程:
第一,數據源需要配置加密結果(密文);
第二,Druid進行數據庫連接的時候需要先解密,拿到解密結果(明文)去進行數據庫連接。
3.解決方案
方式一:jasypt(推薦使用)
實現方式,見文末推薦。
可以對數據庫連接、用戶名和密碼同時加密,使用方便。
方式二:Druid自帶加密類
druid支持對數據源進行加密(但,默認只能對用戶的密碼進行解密)。
如果我們強行對用戶名進行加密,將會啟動不起來。
所用算法:RSA/ECB/PKCS1Padding,也就是RSA算法。
下面說說具體實現步驟:
Druid對數據源進行加密或者解密,調用的是:
druid.jar里com.alibaba.druid.filter.config包下的ConfigTools.class類。
第一步:創建一個類並繼承ConfigTools;
import com.alibaba.druid.filter.config.ConfigTools;
/**
* 阿里Druid密碼加密測試類
* @description:
* @author: Marydon
* @date: 2022-02-26 11:11
* @version: 1.0
* @email: marydon20170307@163.com
*/
public class DruidEncryptorTest extends ConfigTools {
public static void main(String[] args) throws Exception {
// 生成公鑰和私鑰
String[] arr = genKeyPair(512);
String privateKey = arr[0];
System.out.println("privateKey:" + privateKey);
String publicKeyText = arr[1];
System.out.println("publicKey:" + publicKeyText);
// 待加密信息
String password = "marydon";
// 加密結果
String cipherText = encrypt(privateKey, password);
System.out.println("加密結果:" + cipherText);
// 解密
System.out.println("解密結果:" + decrypt(publicKeyText, cipherText));
}
}
運行此類,拿到:公鑰和加密結果(每次運行,生成的公鑰和私鑰都不同,自然加密結果也不一樣)。
第二步:數據庫配置。
####spring配置####
####開發環境數據源配置
spring:
###數據庫配置
datasource:
##數據庫地址(默認端口號:3306)
url: jdbc:mysql://127.0.0.1:3306/mysql?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
##用戶名
username: scott
##密碼
password: KnXPGXrnmOLJ8A5srN5m0rfGmrseJu8+Fb4/f4LIMGVK6cHjp1k71NSUjO0U8rZM+YtigCyPZMudPpAwps5U3w==
##JDBC驅動程序的全稱
driver-class-name: com.mysql.cj.jdbc.Driver
##數據源解密公鑰(自定義屬性)
publickey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKAbVEPhUymXGfF0QO3YDcqKkwXOYj5FfxYGVgfX1MUEixgQeCtZm/LDXuqYi7zR26FJGJ5JFhEAwJ+DK+P3wzsCAwEAAQ==
###druid配置
druid:
#要想解密生效,必須得有config
#多個之間使用逗號隔開:config,stat,wall
filters: config
connection-properties: "config.decrypt=true;config.decrypt.key=${spring.datasource.publickey}"
說明:
第一:將密碼替換成加密后的密碼;
第二:publickey是自定義屬性,你可以放置配置文件當中任意位置,只要能確保到可以通過${}獲取的到;
第三:druid需要配置兩個屬性。
filter的值必須包含config,如果需要制定多個,使用逗號隔開即可。
connection-properties的值可以是:"config.decrypt=true;config.decrypt.key=${spring.datasource.publickey}"
也可以是:"config.decrypt=true;config.decrypt.key=publickey的值",此時,可以把上面的自定義屬性publickey刪掉。
4.其它
如果不想使用第一步的話,那就用調用jar包類的方式生成秘鑰。
首先,確保你的電腦上有java包,可以運行java命令。
其次,需要知道druidjar所在全路徑(絕對路徑)
語法:
java -cp 你的druid包全路徑 com.alibaba.druid.filter.config.ConfigTools 你要加密的密碼
java -cp D:\repository-maven\com\alibaba\druid\1.1.22\druid-1.1.22.jar com.alibaba.druid.filter.config.ConfigTools marydon
按回車鍵運行,將運行結果復制到記事本中。
將公鑰和密碼配置到你的配置文件當中。
寫在最后
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!