druid加解密功能


對於線上環境和運維來說,都不希望數據庫密碼以明文的形式寫在配置文件中,druid支持對密碼使用RSA算法進行加密。

 

druid的加解密類是ConfigTools,這個類提供生成公鑰、私鑰、密文、加密、解密等一系列方法。

我們可以通過main方法對我們的密碼進行加密:

public class ConfigTools {

    private static final String DEFAULT_PRIVATE_KEY_STRING = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAocbCrurZGbC5GArEHKlAfDSZi7gFBnd4yxOt0rwTqKBFzGyhtQLu5PRKjEiOXVa95aeIIBJ6OhC2f8FjqFUpawIDAQABAkAPejKaBYHrwUqUEEOe8lpnB6lBAsQIUFnQI/vXU4MV+MhIzW0BLVZCiarIQqUXeOhThVWXKFt8GxCykrrUsQ6BAiEA4vMVxEHBovz1di3aozzFvSMdsjTcYRRo82hS5Ru2/OECIQC2fAPoXixVTVY7bNMeuxCP4954ZkXp7fEPDINCjcQDywIgcc8XLkkPcs3Jxk7uYofaXaPbg39wuJpEmzPIxi3k0OECIGubmdpOnin3HuCP/bbjbJLNNoUdGiEmFL5hDI4UdwAdAiEAtcAwbm08bKN7pwwvyqaCBC//VnEWaq39DCzxr+Z2EIk=";
    public static final String DEFAULT_PUBLIC_KEY_STRING = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKHGwq7q2RmwuRgKxBypQHw0mYu4BQZ3eMsTrdK8E6igRcxsobUC7uT0SoxIjl1WveWniCASejoQtn/BY6hVKWsCAwEAAQ==";

    public static void main(String[] args) throws Exception {
        String password = args[0];
        String[] arr = genKeyPair(512);
        System.out.println("privateKey:" + arr[0]);
        System.out.println("publicKey:" + arr[1]);
        System.out.println("password:" + encrypt(arr[0], password));
    }
  ...
}

我們運行這個main方法,傳入明文:

 

 運行之后在控制台會輸出公鑰、和私鑰以及加密后的密文

 

在生成我們需要的公、私鑰以及密文后,我們就可以使用加密后的密碼進行配置數據源。

    public static DataSource dataSource() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/ds0?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
//添加Configfilter,該filter初始化后主要實現對密文的解密 dataSource.setFilters(
"config");
//設置是否解密為true dataSource.setConnectionProperties(
"config.decrypt=true");
//使用公鑰解密 傳入公鑰串,如果沒有傳入公鑰,則會使用默認的公鑰 dataSource.setConnectionProperties(
"config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIq+sud+LQwa2kjdVJOWewaqX0Bw0m0eHaRSwifmc+W6o/CFYAthoAem33Xi3MYtXsHumskHr9eIcEFjNyxloq0CAwEAAQ=="); //加密后的密碼
dataSource.setPassword(
"e67LBYk981SvjeKbT/H6tYXjtoKDqOU2+s0+JAeUealvs64lJCCG8UgX6Z5yX6I8wtKdcjF4nUnwQPjXIMnhpg=="); return dataSource; }

 

這樣數據源就配置好了,在我們獲取連接的時候druid會自動使用公鑰解密該密碼。具體邏輯在ConfigFilter中。我們看一下:

在調用DruiddataSource.getConnection的時候會對druid連接池進行初始化,初始化的過程中會初始化Filter。

public void init(DataSourceProxy dataSourceProxy) {
        if (!(dataSourceProxy instanceof DruidDataSource)) {
            LOG.error("ConfigLoader only support DruidDataSource");
        }

        DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
        Properties connectionProperties = dataSource.getConnectProperties();

        Properties configFileProperties = loadPropertyFromConfigFile(connectionProperties);

        // 判斷是否需要解密,如果需要就進行解密行動
        boolean decrypt = isDecrypt(connectionProperties, configFileProperties);

        if (configFileProperties == null) {
            if (decrypt) {
                decrypt(dataSource, null);
            }
            return;
        }

        if (decrypt) {
            decrypt(dataSource, configFileProperties);
        }

        try {
            DruidDataSourceFactory.config(dataSource, configFileProperties);
        } catch (SQLException e) {
            throw new IllegalArgumentException("Config DataSource error.", e);
        }
    }

 

從代碼中可以看出來,初始化該Filter的時候密碼就已經被解密了,並且將明文密碼重新設置在數據源屬性中。

 


免責聲明!

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



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