資料庫連線使用者名稱和密碼加密
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中,如圖