Druid數據庫加密

參考 :Druid官網https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ConfigFilter的作用包括:

    從配置文件中讀取配置
    從遠程http文件中讀取配置
    爲數據庫密碼提供加密功能

1 配置ConfigFilter
1.1 配置文件從本地文件系統中讀取

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      init-method="init" destroy-method="close">
      <property name="filters" value="config" />
      <property name="connectionProperties" value="config.file=file:///home/admin/druid-pool.properties" />
  </bean>

1.2 配置文件從遠程http服務器中讀取

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      init-method="init" destroy-method="close">
      <property name="filters" value="config" />
      <property name="connectionProperties" value="config.file=http://127.0.0.1/druid-pool.properties" />
  </bean>

這種配置方式,使得一個應用集羣中,多個實例可以從同一個地方讀取配置,集中配置,集中修改,部署更簡單。
1.3 通過jvm啓動參數來使用ConfigFilter

DruidDataSource支持jvm啓動參數配置filters,所以你可以:

java -Ddruid.filters=config ....

2 數據庫密碼加密

數據庫密碼直接寫在配置中,對運維安全來說,是一個很大的挑戰。Druid爲此提供一種數據庫密碼加密的手段ConfigFilter。
2.1 執行命令加密數據庫密碼

在命令行中執行如下命令:

java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password

輸出

privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==

輸入你的數據庫密碼,輸出的是加密後的結果。
2.2 配置數據源,提示Druid數據源需要對數據庫密碼進行解密。

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      init-method="init" destroy-method="close">
      <property name="url" value="jdbc:derby:memory:spring-test;create=true" />
      <property name="username" value="sa" />
      <property name="password" value="${password}" />
      <property name="filters" value="config" />
      <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publickey}" />
  </bean>

2.3 配置參數,讓ConfigFilter解密密碼

有三種方式配置:
1) 可以在配置文件my.properties中指定config.decrypt=true
2) 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true

3) 也可以在jvm啓動參數中指定-Ddruid.config.decrypt=true

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

jar版本:druid-1.0.13.jar

1. 加密,用以下命令將用戶名和密碼加密

cmd命令行執行 java -cp D:/druid-1.0.13.jar com.alibaba.druid.filter.config.ConfigTools 用戶名/密碼

得到密文:

f0PSl0Lzxh6CxzuFIdEg+wVx045fSE2VtUP45G9HH2cjVQnmGGgcK5CLzNUJoR6tGwRO44h74OxrBWuDzWC8jg==

2.用戶名解密:

ackage com.heli.core.user.common;
import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;
/**
* 用來解密配置中的密文(重點配置,在這裏擴展用戶名的解密)
* setUsername(name) 方法對應xml中的一個property屬性,password默認加密不需要重寫,
* 還可以加密url 重寫setUrl(url) 
*/
@SuppressWarnings("all")
public class DecryptDruidSource extends DruidDataSource{
@Override
public void setUsername(String username) {
try {
username = ConfigTools.decrypt(username);
} catch (Exception e) {
e.printStackTrace();
}
super.setUsername(username);
}
}
3.spring-database.xml中數據庫連接的配置
<bean id="dataSource" class="com.heli.core.user.common.DecryptDruidSource">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
        <!-- config.decrypt=true -->
   <property name="filters" value="config" />
       <property name="connectionProperties" value="config.decrypt=true" />
      
<!-- 初始化連接大小 -->
<property name="initialSize" value="${initialSize}" />
<!-- 連接池最大使用連接數量 -->
<property name="maxActive" value="${maxActive}" />
<!-- 連接池最大空閒 這個參數已經被棄用 <property name="maxIdle" value="${maxIdle}"></property> -->
<!-- 連接池最小空閒 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 獲取連接最大等待時間 -->
<property name="maxWait" value="${maxWait}"></property>
         <property name="validationQuery" value="${validationQuery}" />
        <property name="testWhileIdle" value="${testWhileIdle}" />
        <property name="testOnBorrow" value="${testOnBorrow}" />
        <property name="testOnReturn" value="${testOnReturn}" />
 
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
 
        <!-- 關閉長時間不使用的連接 -->
        <!-- 打開removeAbandoned功能 -->
        <property name="removeAbandoned" value="${removeAbandoned}" />
        <!-- 1200秒,也就是20分鐘 -->
        <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
        <!-- 關閉abanded連接時輸出錯誤日誌 -->
        <property name="logAbandoned" value="${logAbandoned}" />
</bean>
4.數據庫配置文件:
3.user.properties中
#mysql
username=f0PSl0Lzxh6CxzuFIdEg+wVx045fSE2VtUP45G9HH2cjVQnmGGgcK5CLzNUJoR6tGwRO44h74OxrBWuDzWC8jg==
password=f0PSl0Lzxh6CxzuFIdEg+wVx045fSE2VtUP45G9HH2cjVQnmGGgcK5CLzNUJoR6tGwRO44h74OxrBWuDzWC8jg==
url=jdbc:mysql://192.168.1.194/user?characterEncoding=utf-8
driver=com.mysql.jdbc.Driver
initialSize=5
minIdle=5
maxActive=20
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=30000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=true
testOnReturn=true
filters=stat,log4j
removeAbandoned=true
removeAbandonedTimeout=1200
logAbandoned=true

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章