生成加密密碼
集成了druid鏈接池的,可以實現數據源密碼加密。加密方式如下
構建單元測試,并輸入密碼即可生成加密密碼以及加密公鑰
@Test
public void testPwd() throws Exception {String password = "123456";String[] arr = com.alibaba.druid.filter.config.ConfigTools.genKeyPair(512);System.out.println("privateKey:" + arr[0]);System.out.println("publicKey:" + arr[1]);System.out.println("password:" + com.alibaba.druid.filter.config.ConfigTools.encrypt(arr[0], password));
}
將生成的 password 和 publickey 記錄下來,后面配置中將要使用
springboot項目只需要配置yml文件
spring:datasource:url: ....username: user1password: ${password}type: com.alibaba.druid.pool.DruidDataSourcedruid:filters: config,stat,wall,log4j2connection-properties: config.decrypt=true;config.decrypt.key=${publicKey}...
配置說明:
- ${password}: 加密后的密碼
- ${publicKey}: 根據密碼生成的公鑰
- filters:config : 配置鏈接其過濾器 config,用于加密數據庫密碼
SSM框架項目修改配置文件 properties
spring.datasource.password = ${password}
spring.datasource.druid.filters = config,stat,wall,log4j2
spring.datasource.druid.connection-properties = config.decrypt=true;config.decrypt.key=${publicKey}
配置說明:
- ${password}: 加密后的密碼
- ${publicKey}: 根據密碼生成的公鑰
- filters:config : 配置鏈接其過濾器 config,用于加密數據庫密碼
驗證
直接啟動程序,訪問數據正常即可。
核心原理介紹
DruidDataSource 鏈接池在獲取鏈接時會調用一個初始化方法 init:
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {init(); if (filters.size() > 0) {FilterChainImpl filterChain = new FilterChainImpl(this);return filterChain.dataSource_connect(this, maxWaitMillis);} else {return getConnectionDirect(maxWaitMillis);}
}
init 方法遍歷 filters 列表,并逐個初始化。
在Druid中有一個 ConfigFilter,該 filter 用于對鏈接池加密、解密處理。
注意事項:filters加上wall配置會嚴格校驗sql格式,--這樣的注釋不通過會報錯