Druid | 實(shí)現(xiàn)數(shù)據(jù)庫(kù)密碼加密

背景

現(xiàn)在的開發(fā)習(xí)慣吓笙,無(wú)論是公司的項(xiàng)目還是個(gè)人的項(xiàng)目,都會(huì)選擇將源碼上傳到 Git 服務(wù)器(GitHub奢浑、Gitee 或是自建服務(wù)器)饮焦,但只要將源碼提交到公網(wǎng)服務(wù)器就會(huì)存在源碼泄漏的風(fēng)險(xiǎn),而數(shù)據(jù)庫(kù)配置信息作為源碼的一部分拒垃,一旦出現(xiàn)源碼泄漏停撞,那么數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)都會(huì)公之于眾,其產(chǎn)生的不良后果無(wú)法預(yù)期(比如某某酒店的信息)

于是為了避免這種問題的產(chǎn)生悼瓮,我們至少要對(duì)數(shù)據(jù)庫(kù)的密碼進(jìn)行加密操作戈毒,這樣即使得到了源碼,也不會(huì)造成數(shù)據(jù)的泄露横堡,也算保住了最后一塊遮羞布

如何加密

對(duì)于 Java 項(xiàng)目來(lái)說埋市,要想快速實(shí)現(xiàn)數(shù)據(jù)庫(kù)的加密,最簡(jiǎn)單可行的方案就是使用阿里巴巴提供的 Druid 來(lái)實(shí)現(xiàn)加密

什么是Druid

Druid(中文譯為“德魯伊”)是阿里巴巴開源的一款 Java 語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池
Druid 提供了強(qiáng)大的監(jiān)控和擴(kuò)展功能命贴,當(dāng)然也包含了數(shù)據(jù)庫(kù)的加密功能

功能

  • Druid 可以監(jiān)控?cái)?shù)據(jù)庫(kù)訪問性能道宅,Druid 內(nèi)置提供了一個(gè)功能強(qiáng)大的 StatFilter 插件,能夠詳細(xì)統(tǒng)計(jì) SQL 的執(zhí)行性能胸蛛,這對(duì)于線上分析數(shù)據(jù)庫(kù)訪問性能有幫助
  • 替換數(shù)據(jù)庫(kù)連接池 DBCP 和 C3P0污茵,Druid 提供了一個(gè)高效、功能強(qiáng)大葬项、可擴(kuò)展性好的數(shù)據(jù)庫(kù)連接池
  • 數(shù)據(jù)庫(kù)密碼加密泞当,直接把數(shù)據(jù)庫(kù)密碼寫在配置文件中,這是不好的行為玷室,容易導(dǎo)致安全問題零蓉。DruidDriver 和 DruidDataSource 都支持 PasswordCallback
  • SQL 執(zhí)行日志,Druid 提供了不同的 LogFilter穷缤,能夠支持 Common-Logging敌蜂、Log4j 和 JDKLog,你可以按需要選擇相應(yīng)的 LogFilter津肛,監(jiān)控你應(yīng)用的數(shù)據(jù)庫(kù)訪問情況
  • 擴(kuò)展 JDBC章喉,如果你要對(duì) JDBC 層有編程的需求,可以通過 Druid 提供的 Filter-Chain 機(jī)制,很方便編寫 JDBC 層的擴(kuò)展插件

加密執(zhí)行流程

在沒有進(jìn)行密碼加密之前秸脱,項(xiàng)目的交互流程是這樣的:

在使用了密碼加密之后落包,項(xiàng)目的交互流程就變成了這樣:

使用Druid實(shí)現(xiàn)加密

  1. 添加Druid依賴
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.5</version>
</dependency>
  1. 生成密文
    Druid 添加完成之后就可以借助 Druid 中提供的 ConfigTools 類來(lái)加密密碼了,實(shí)現(xiàn)代碼如下:
import com.alibaba.druid.filter.config.ConfigTools;

class MyTests {
    public static void main(String[] args) throws Exception {
        // 需要加密的明文命名
        String password = "youPassword"; // 【注意:這里要改為你自己的密碼】
        // 調(diào)用 druid 生成私鑰摊唇、公鑰咐蝇、密文
        ConfigTools.main(new String[]{password});
    }
}

以上代碼執(zhí)行的結(jié)果如下:

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

從上述結(jié)果可以看出,使用 ConfigTools 類會(huì)生成 3 部分的內(nèi)容:

  • privateKey:私鑰巷查,暫時(shí)不會(huì)用到有序,用于密碼的加密;
  • publicKey:公鑰岛请,用于密碼的解密旭寿;
  • password:加密之后的密碼。
  1. 添加配置
    完成了以上操作之后崇败,只需要將上一步生成的公鑰和密文添加到項(xiàng)目的配置文件 application.yml(或application.xml)中就實(shí)現(xiàn)了加密操作了盅称,具體配置信息如下:
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 對(duì)應(yīng)的是上一步生成的 password(密文),而 config.decrypt.key 對(duì)應(yīng)的是上一步生成的 publicKey(公鑰)后室,如下圖所示:

這里提供一個(gè)原始的配置文件缩膝,以便和加密后的配置文件進(jìn)行比對(duì):

  1. 注意事項(xiàng)-插著鑰匙的鎖

經(jīng)過前面 3 步的配置之后,我們的程序就可以正常運(yùn)行了咧擂,但這遠(yuǎn)沒有結(jié)束逞盆!

在第 3 步配置時(shí),我們將密文和公鑰都寫入配置文件松申,這就會(huì)造成當(dāng)有人拿到密文和公鑰之后,就可以使用 Druid 將加密的密碼還原出來(lái)了俯逾,這就好比一把插著鑰匙的鎖是極不安全的

因此我們正確的使用姿勢(shì):是將公鑰找一個(gè)安全的地方保存起來(lái)贸桶,每次在項(xiàng)目啟動(dòng)時(shí)動(dòng)態(tài)的將公鑰設(shè)置到項(xiàng)目中,這樣就可以有效的保證密碼的安全了

正確的配置文件

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}”了桌肴,這就相當(dāng)于使用占位符先把坑給占上皇筛,等項(xiàng)目啟動(dòng)時(shí)再更換上具體的值

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

開發(fā)環(huán)境替換公鑰

開發(fā)環(huán)境只需要在 Idea 的啟動(dòng)參數(shù)中配置公鑰的值即可坠七,如下圖所示:

當(dāng)我們輸入正確的公鑰值時(shí)程序可以正常運(yùn)行水醋,當(dāng)輸入一個(gè)錯(cuò)誤的公鑰值時(shí)就會(huì)提示解碼失敗,如下圖所示:

生產(chǎn)環(huán)境替換公鑰
生產(chǎn)環(huán)境在啟動(dòng) jar 包時(shí)只需要?jiǎng)討B(tài)設(shè)置公鑰的值即可彪置,參考以下命令:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拄踪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拳魁,更是在濱河造成了極大的恐慌惶桐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異姚糊,居然都是意外死亡贿衍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門救恨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贸辈,“玉大人,你說我怎么就攤上這事肠槽∪雇郑” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵署浩,是天一觀的道長(zhǎng)揉燃。 經(jīng)常有香客問我,道長(zhǎng)筋栋,這世上最難降的妖魔是什么炊汤? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮弊攘,結(jié)果婚禮上抢腐,老公的妹妹穿的比我還像新娘。我一直安慰自己襟交,他們只是感情好迈倍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捣域,像睡著了一般啼染。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焕梅,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天迹鹅,我揣著相機(jī)與錄音,去河邊找鬼贞言。 笑死斜棚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的该窗。 我是一名探鬼主播弟蚀,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酗失!你這毒婦竟也來(lái)了义钉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤级零,失蹤者是張志新(化名)和其女友劉穎断医,沒想到半個(gè)月后滞乙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鉴嗤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年斩启,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉锅。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兔簇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硬耍,到底是詐尸還是另有隱情垄琐,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布经柴,位于F島的核電站狸窘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坯认。R本人自食惡果不足惜翻擒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牛哺。 院中可真熱鬧陋气,春花似錦、人聲如沸引润。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淳附。三九已至议慰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燃观,已是汗流浹背褒脯。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缆毁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓到涂,卻偏偏與公主長(zhǎng)得像脊框,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子践啄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容