一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 阿里巴巴Druid,輕松實現MySQL數據庫加密!

阿里巴巴Druid,輕松實現MySQL數據庫加密!

2021-03-02 23:36Java中文社群磊哥 Mysql

本文我們使用阿里巴巴開源的 Druid 實現了 MySQL 的密碼加密,Druid 的加密過程非常方便,無需編寫任何代碼,只需要添加 Druid 依賴,再通過 Druid 的工具類生成密文,最后將密文配置到 application.yml 文件即可。項目在運行時會通過攔

阿里巴巴Druid,輕松實現MySQL數據庫加密!

為什么要加密?

現在的開發習慣,無論是公司的項目還是個人的項目,都會選擇將源碼上傳到 Git 服務器(GitHub、Gitee 或是自建服務器),但只要將源碼提交到公網服務器就會存在源碼泄漏的風險,而數據庫配置信息作為源碼的一部分,一旦出現源碼泄漏,那么數據庫中的所有數據都會公之于眾,其產生的不良后果無法預期(比如某某酒店的信息)。

于是為了避免這種問題的產生,我們至少要對數據庫的密碼進行加密操作,這樣即使得到了源碼,也不會造成數據的泄露,也算保住了最后一塊遮羞布。

如何加密?

對于 Java 項目來說,要想快速實現數據庫的加密,最簡單可行的方案就是使用阿里巴巴提供的 Druid 來實現加密。

什么是Druid?

Druid(中文譯為“德魯伊”)是阿里巴巴開源的一款 Java 語言中最好的數據庫連接池。Druid 提供了強大的監控和擴展功能,當然也包含了數據庫的加密功能。

Druid 開源地址:https://github.com/alibaba/druid/

Druid可以做什么?

  1. Druid 可以監控數據庫訪問性能,Druid 內置提供了一個功能強大的 StatFilter 插件,能夠詳細統計 SQL 的執行性能,這對于線上分析數據庫訪問性能有幫助。
  2. 替換數據庫連接池 DBCP 和 C3P0,Druid 提供了一個高效、功能強大、可擴展性好的數據庫連接池。
  3. 數據庫密碼加密,直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。
  4. SQL 執行日志,Druid 提供了不同的 LogFilter,能夠支持 Common-Logging、Log4j 和 JdkLog,你可以按需要選擇相應的 LogFilter,監控你應用的數據庫訪問情況。
  5. 擴展 JDBC,如果你要對 JDBC 層有編程的需求,可以通過 Druid 提供的 Filter-Chain 機制,很方便編寫 JDBC 層的擴展插件。

對于本文來說,我們重點來看它的第 3 個特性,也就是使用 Druid 來實現數據庫密碼加密。

加密執行流程

在沒有進行密碼加密之前,項目的交互流程是這樣的:

阿里巴巴Druid,輕松實現MySQL數據庫加密!

在使用了密碼加密之后,項目的交互流程就變成了這樣:

阿里巴巴Druid,輕松實現MySQL數據庫加密!

使用Druid實現加密

本示例運行環境:

  1. Spring Boot 2.4.3  
  2.  
  3. MySQL 5.7  
  4.  
  5. Java 1.8  
  6.  
  7. Idea 2020.1.3 

1.添加Druid依賴

Maven 項目:

<dependency> 

   <groupId>com.alibaba</groupId> 

   <artifactId>druid-spring-boot-starter</artifactId> 

   <version>1.2.5</version> 

</dependency> 

Gradle 項目:

compile 'com.alibaba:druid-spring-boot-starter:1.2.5' 

獲取 Druid 最新版本:https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter

2.生成密文

Druid 添加完成之后就可以借助 Druid 中提供的 ConfigTools 類來加密密碼了,實現代碼如下:

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

 

class MyTests { 

    public static void main(String[] args) throws Exception { 

        // 需要加密的明文命名 

        String password = "youPassword"; // 【注意:這里要改為你自己的密碼】 

        // 調用 druid 生成私鑰、公鑰、密文 

        ConfigTools.main(new String[]{password}); 

    } 

以上代碼執行的結果如下:

privateKey:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEApOjcMWSDzJiKVGmtcBBoQPtM9tVW2H2cnS6xZK7NrbzQXYWLQD2zefIrrx9vMvqRIHEqkmAHTuUcUXHgCxu0cwIDAQABAkAlqo5ItdWo0Jqf5zdXJlg5p2yP4HCiqCYyfKzF+2s9KEmgWZJWTctZDsgQ0iYUohORR59I+J4nabhel1x5/INpAiEA6jwSyFqMUPOh1XlrzNFek+RthOQ5n4+ALPo+vULayO0CIQC0O7JM9sIq+tg+jCGv+ypk6vbuRKY9m5W2rSRXapGm3wIgRHul3jAjIDPrF/f1HaAFL+Y0Yws7Ebyp8/yCRWF7iA0CIALbe20q8FMcHPeI4zPWCIsHCpkmb3hEkjAOOKhGIT8DAiAqiUuz92NqKeyjmOfons1ka65EzVwA3NDhZ6+IQcnuig== publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ== password:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ== 

從上述結果可以看出,使用 ConfigTools 類會生成 3 部分的內容:

  1. privateKey:私鑰,暫時不會用到,用于密碼的加密;
  2. publicKey:公鑰,用于密碼的解密;
  3. password:加密之后的密碼。
  • PS:要實現數據庫的加密,主要使用的是 publicKey(公鑰)和 password(密文),這就把明文轉換成密文了。

3.添加配置

完成了以上操作之后,只需要將上一步生成的公鑰和密文添加到項目的配置文件 application.yml(或application.xml)中就實現了加密操作了,具體配置信息如下:

spring: 

  # MySQL 配置 

  datasource: 

    driver-class-name: com.mysql.cj.jdbc.Driver 

    type: com.alibaba.druid.pool.DruidDataSource 

    druid: 

      url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false 

      username: root 

      password: IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ== 

      # encrypt config 

      filters: config 

      connect-properties: 

        config.decrypt: true 

        config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ== 

其中 password 對應的是上一步生成的 password(密文),而 config.decrypt.key 對應的是上一步生成的 publicKey(公鑰),如下圖所示:

阿里巴巴Druid,輕松實現MySQL數據庫加密!

這里提供一個原始的配置文件,以便和加密后的配置文件進行比對:

阿里巴巴Druid,輕松實現MySQL數據庫加密!

4.注意事項-插著鑰匙的鎖

經過前面 3 步的配置之后,我們的程序就可以正常運行了,但這遠沒有結束!

在第 3 步配置時,我們將密文和公鑰都寫入配置文件,這就會造成當有人拿到密文和公鑰之后,就可以使用 Druid 將加密的密碼還原出來了,這就好比一把插著鑰匙的鎖是極不安全的。

因此我們正確的使用姿勢:是將公鑰找一個安全的地方保存起來,每次在項目啟動時動態的將公鑰設置到項目中,這樣就可以有效的保證密碼的安全了。

正確的配置文件

接下來我們將 Spring Boot 的公鑰設置為配置項,在項目運行時再替換為具體的值,最終的安全配置信息如下:

spring: 

  # MySQL 配置 

  datasource: 

    driver-class-name: com.mysql.cj.jdbc.Driver 

    type: com.alibaba.druid.pool.DruidDataSource 

    druid: 

      url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false 

      username: root 

      password: IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ== 

      # encrypt config 

      filters: config 

      connect-properties: 

        config.decrypt: true 

        config.decrypt.key: ${spring.datasource.druid.publickey} 

可以看出公鑰被修改成“${spring.datasource.druid.publickey}”了,這就相當于使用占位符先把坑給占上,等項目啟動時再更換上具體的值。

  • PS:“spring.datasource.druid.publickey”并非是固定不可變的 key,此 key 值用戶可自行定義。

開發環境替換公鑰

開發環境只需要在 Idea 的啟動參數中配置公鑰的值即可,如下圖所示:

 阿里巴巴Druid,輕松實現MySQL數據庫加密!

當我們輸入正確的公鑰值時程序可以正常運行,當輸入一個錯誤的公鑰值時就會提示解碼失敗,如下圖所示:

阿里巴巴Druid,輕松實現MySQL數據庫加密!

生產環境替換公鑰

生產環境在啟動 jar 包時只需要動態設置公鑰的值即可,參考以下命令:

java -jar xxx.jar --spring.datasource.druid.publickey=你的公鑰 

Druid運行原理經過上述步驟之后,我們就完成 MySQL 密碼的加密了,這樣當 Spring Boot 項目啟動時,Druid 的攔截器會使用密文和公鑰將密碼還原成真實的密碼以供項目使用,當然這一切都無需人工干預(無需編寫任何代碼),Druid 已經幫我封裝好了,我們只需要通過以上配置即可。

什么?你想知道 Druid 是如何通過密文和公鑰還原出真實的密碼的?

沒問題,滿足你,其實 ConfigTools 類中已經提供了相應實現,代碼如下:

// 密文 

String password = "VwH1mu2IUpqjfKTd+gSikiZgJTi+3Y5zFIFRfxYnH1UqHzm1K8TIHnMaV3TErBaGsVEaGV0e63pb0Ys3Wdm7Kg=="

// 公鑰 

String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALWIEp19IM04sB+vQXnEOH9gFNFdL5TFGSEhORgHj4MnfTfBSNaOoSgCaM8BOpjiHmwuEb7LpvmXI1x/ymUvNzECAwEAAQ=="

// 還原成真實的密碼 

String result = ConfigTools.decrypt(publicKey, password); 

System.out.println("最終結果:" + result); 

 總結

本文我們使用阿里巴巴開源的 Druid 實現了 MySQL 的密碼加密,Druid 的加密過程非常方便,無需編寫任何代碼,只需要添加 Druid 依賴,再通過 Druid 的工具類生成密文,最后將密文配置到 application.yml 文件即可。項目在運行時會通過攔截器將密文轉換成真正的密碼,從而實現了 MySQL 密碼的加密和解碼的過程。

 

原文地址:https://mp.weixin.qq.com/s/hm8CiN2ZqbEpeiya6T0a9A

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性欧美高清强烈性视频 | 久久综合老色鬼网站 | 日韩天堂视频 | 亚洲精品中文字幕久久久久久 | 日韩亚洲欧美一区二区三区 | 好湿好紧太硬了我太爽了h 好湿好滑好硬好爽好深视频 | 男人的天堂在线观看免费 | 狐媚小说 | 四虎成人免费 | 交换性关系中文字幕6 | 91噜噜噜噜色 | 亚州综合网 | 北海市副市长黄江老公 | 国产亚洲精品一区二区在线播放 | 欧美艳星julnaann | 午夜一区二区三区 | 国产成人精品曰本亚洲78 | 国内自拍网红在线综合 | 亚洲AV无码乱码国产麻豆穿越 | 免费毛片 | 欧美日韩国产一区二区三区欧 | 久久不卡免费视频 | www.毛片网站| 久久久免费观成人影院 | a级毛片毛片免费观看永久 a级黄色片免费 | 色综合久久综精品 | 国产精品一区二区久久 | 欧美在线一级片 | 亚洲人尿尿 | 欧美一级特黄刺激大片视频 | 国产综合亚洲欧美日韩一区二区 | 91国内在线国内在线播放 | 新新电影理论中文字幕 | 久久成人精品免费播放 | 久久99re8热在线播放 | evelynlin亚裔播放 | 2022国产麻豆剧传媒剧情 | 午夜DV内射一区区 | 国产成人91高清精品免费 | 欧美日韩国产一区二区三区在线观看 | 亚洲网站在线 |