1. 程式人生 > >資料庫連線使用者名稱和密碼加密

資料庫連線使用者名稱和密碼加密

1. 需求背景

我們在開發應用時,需要連線資料庫,一般把資料庫資訊放在一個屬性配置檔案中,比如jdbc.properties,具體的內容

#mysql的配置檔案
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=123456

裡面用明文的方式儲存著資料庫的敏感資訊使用者名稱username和密碼password,這是不好的行為,容易產生安全問題。那我們如何實現加密儲存呢?

2. 實現原理

實現原理其實很簡單,配置檔案儲存加密後的使用者名稱和密碼,重寫Druid資料來源的兩個方法setUsername(String username)和setPassword(String password)對資訊解密。

3. 實現方式

3.1 寫加密工具

首先得有一個加密工具,具有加解密功能,這裡為了方便直接使用Druid中的工具類com.alibaba.druid.filter.config.ConfigTools。使用其中的encrypt(String plainText)方法和decrypt(String cipherText)方法採用預設的公私玥加解密。

3.2 加密配置檔案
#MySql資料庫配置
connection.url=jdbc:mysql://127.0.0.1:3306/test
connection.username=*************加密後的使用者名稱********************
connection.password=*************加密後的密碼**********************
3.3 建立自己的資料來源

新建類SecurityDateSource繼承資料來源DruidDataSource並重寫其中設定使用者名稱和密碼的方法:

import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;

public class SecurityDateSource extends DruidDataSource{
    @Override
    public void setUsername(String username) {
        try {
            username = ConfigTools.decrypt(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.setUsername(username);
    }

    @Override
    public void setPassword(String password) {
        try {
            password = ConfigTools.decrypt(password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.setPassword(password);
    }

    public static void main(String[] args) throws Exception{
        String password = "123456";
        String username = "root";
        System.out.println("加密後的password = [" + ConfigTools.encrypt(password) + "]");
        System.out.println("加密後的username = [" + ConfigTools.encrypt(username) + "]");
    }
}
3.4 Spring檔案中配置資料來源

注意將class改為自己的新建的資料來源

<bean id="dataSource" class="com.wei.core.database.SecurityDateSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>


使用druid加密的第二種方法

修改資料庫配置,在配置資料來源處,新增此兩行程式碼

如圖

<!-- 開啟Druid的監控統計功能 -->

<property name="filters" value="config" />

<!-- 開啟資料庫密碼解密-->

<property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publickey}" />

3.配置檔案config.properties中,新增此行程式碼
如圖  publickey=${jdbc.mysql.publickey} 
主要作用是對應加密後的公鑰。
4.修改pom.xml檔案,新增此兩行程式碼。

如圖  新增  <jdbc.mysql.publickey></jdbc.mysql.publickey>

5.以上配置好後,使用durid的加密演算法生成加密密碼和公鑰。

首先要找到jar包所在位置,然後shift+右鍵,點選 在此處開啟命令視窗,然後輸入:

java -cp druid-1.0.18.jar com.alibaba.druid.filter.config.ConfigTools 1234567a
(druid-1.0.18.jar:對應的jar包名稱,12345678a:對應的資料庫密碼)
回車,生成一大堆東西:

如圖
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA3MAoIF9F/wDJneKskSBJ9VE8VFeeShJyAaHM9I7LphSDvf8xxLAv2LcP+t1LHMa/yElVDr4cyFv5azWxKOwjxwIDAQABAkEAwIpx9VpkKPk84ZM2RRbOq0QBxObvT1grTDUeGSj7g4y+ZH+I+DHnJdzHrYWWTJ2Hx3evesp+iVUy8Ni/dvkUEQIhAPGL+df7YqaiL5lSgFqNNkrnw0/8j6v4GxSkofG2jGMFAiEA6fWfyil8+aa5j+NgA0MZYWQfRRNa2jz3PTClttTV/VsCIELkFaN3TWGCBpZ6H2t0MbXaqt7qvUrNYYp88RAEEqqVAiBZ99yUr1Oh5V1iWbuoRXtTGl9z/rdnSR6CZ1yybDJGFQIgYkRZkoMq1sJ7b/Jlh4Prp7ntzzmmkpu9rogB4iE9p24=
privateKey:私鑰,用於生成密文密碼用,不用管
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANzAKCBfRf8AyZ3irJEgSfVRPFRXnkoScgGhzPSOy6YUg73/McSwL9i3D/rdSxzGv8hJVQ6+HMhb+Ws1sSjsI8cCAwEAAQ==
publicKey:就是步驟4中publickey中的值,用於解密密碼
password:HRDx+yN+mqk7hNAzZQ8M4wkV7hKgjE3XIAP1/gvjjwx8ZFrWmEvVfmDwQkyB3qasffxZhFrxOmUuDPIIVkFDnQ==
paasword:加密後的密碼
將生成publicKey和password分別放入步驟4中,password2和publickey中。
配置完成。
備註:
1.  每次使用jar包生成加密密碼時都會出現新的加密資訊,但是之前生成的加密資訊扔可用,所以每次只生成一次即可。
2.  將publickey和password都放在pom.xml中時,如果更改pom中配置的key時,需要重新使用maven命令clean後再打包,不然會連線失敗。
3.  或者修改配置,pom中只有加密後的password,不放publickey,將公鑰放入config.properties中,如圖