druid 對於數據源加密的兩種方式


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

按回車鍵運行,將運行結果復制到記事本中。

將公鑰和密碼配置到你的配置文件當中。 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM