MySQL連接配置文件密碼加密以及解密

老生常談的加密問題
這次是對數據庫連接屬性的加密
一開始接到這個任務感覺很迷茫,剛開始bing瞭如何登錄加密,但是結果不對
後來發現是關鍵字沒搜索對,改成了"數據庫連接加密",瞭解到了加密的過程如下

過程


利用加密工具生成加密串
在指定數據庫連接密碼的屬性文件中替換原來的明文密碼
自定義一個數據庫連接池,繼承你原來明文的時候的連接池就行
在指定數據源的配置文件內把數據庫連接池指定爲自定的連接池
重寫setPassword方法,方法內是加密工具類的解密方法,把傳遞的密碼賦值爲解密後的密碼(此時數據庫在連接池的幫助下可以讀取明文密碼)


遺留:


雖然寫好了大體,數據庫連接也成功了,但是有些殘留問題:

指定字符集編碼沒有寫
貌似訪問時間加長了
自定義連接池放在哪個包下


總結:


要精準定位自己的問題,方便百度,問人
明確需求和流程之後再思考如何寫代碼

以上都參考以下鏈接:源鏈接

**

2018年12月10日11:09:50新增:
**
本來以爲任務完成了,結果要進行JNDI的加密修改,在不能動jar包的情況下如何解決?
剛開始想到了新建一個相似的去弄,後來發現一篇文章寫在對應模塊(maven分模塊開發)下也能實現,只需要在Tomcat的context.xml中的resource標籤的factory屬性指定值(就是重寫的實現類,功能和basicDataSourcefactory一樣,不過加了個解密功能)
感謝大佬(雖然乍一看沒感覺出工廠模式)


參考鏈接

**

2018年12月14日16:40:52修改
**
今天終於搞定了全部問題,沒有任何namingexception,不需要忽略解密異常.
而且滿足了在不改動源碼的情況下執行解密和重新賦值.

 

感受


重新從頭到尾整理解決整個問題的過程:

接到任務,聽到jndi很慌,大概瞭解需求,但是不知道該怎麼加密
百度後知道了配置連接加密就是隨便找個地方加密完然後放到配置文件中
百度解密,改動源碼,繼承basicDataSource,setpassWord方法中解密配置(帶上對應解密工具類和jar包),然後打jar包,替換原始common.dbcp(或者Tomcat的dbcp2的dbcp)的jar包
涉及源碼修改,牽扯甚大,此方法不適合使用.
再次百度,得知了把jar包裏重寫的那個類decryptbasicdatasource(名字自定義的,功能和basicDataSource一樣)寫到代碼中也是可以的,但是要Tomcat的context.xml指定resource下的factory屬性值爲decryptbasicdatasource的全限定類名.
但是Tomcat服務器找不到這個類,仍然會報namingexception和classnotfoundexception
思考2日不得結果,後經過指點得知只需要添加幾行代碼就行,從中思考出或許可以從DataSource下手,作爲接口沒有太多方法,所以考慮到使用反射獲取DataSource內的鏈接信息(這時候忽略了其子類basicDataSource),然而獲得了password但是不能把解密後的設置回DataSource
後繼續百度,終於發現子類basicdatasource的set get方法,一時心情激盪,終於完成了解密連接操作,然而(現在想來那時候的腦子真實瓦特了)DataSource是明文密碼,後續再執行getconnection還是會自動解密,但是此時密碼已經是明文,再執行解密操作會報錯.(不知道爲什麼還是需要getconnection)
此時有兩種辦法,一個是把DataSource的password重新設置爲明文,一個是判斷是否已經解密(此時思維陷入死角,沒有想到第一種簡單辦法,因此浪費兩天時間).在今天下午,終於想到了第一個辦法,在成功連接數據庫後再次把DataSource內密碼設置爲加密串,此時originpassword還在使用後繼續百度,終於發現子類BasicDataSource的set get方法,一時心情激盪,終於完成了解密連接操作
然而(現在想來那時候的腦子真實瓦特了)DataSource是明文密碼,後續再執行getconnection還是會自動解密,但是此時密碼已經是明文,再執行解密操作會報錯.此時有兩種辦法,一個是把DataSource的password重新設置爲明文,一個是判斷是否已經解密(此時思維陷入死角,沒有想到第一種簡單辦法,因此浪費兩天時間).在今天下午,終於想到了第一個辦法,在成功連接數據庫後再次把DataSource內密碼設置爲加密串,這樣就解決了問題
大概寫下僞代碼吧

initctx =new initialcontext();
ds =initctx.lookup獲取數據源  //注意是Tomcat的basicDataSource , 而不是common.dbcp的
originpassword=ds.getpassword();
decryptpassword=解密工具解密得到明文密碼
ds.setpassword(decryptpassword);
ds.getconnection();
ds.setpassword(originpassword)

最後…其實很想抽自己,浪費了那麼多時間,腦回路稍微轉一下就好了,慶幸的是最終解決了問題

最後的最後 再總結兩點

父類方法不夠的時候去找子類
思維阻塞的時候,脫離代碼(因爲代碼的一些類會造成方向誤導),通過腦圖或者畫圖來明確解決思路
 

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