Java--基于Java編寫的數據庫加解密工具包(附)GitHub源碼
GitHub源碼地址:https://github.com/JustinJava/pwd-encrypt-decrypt
(圖1)項目應用場景
(圖2)SHELL腳本應用場景
一、背景介紹
如上圖1和圖2標記部分所示,項目中數據庫連接配置的密碼密文和SHELL腳本中的動態密文,就是基于本工具包實現的~
不知道你的項目數據庫連接配置,是不是還在用明文密碼或者SHELL腳本直接寫死數據庫連接密碼?
如果是的話,那不妨試試來了解了解下這個工具包,簡單、使用、安全~
關于工具包介紹和說明,可以看下我GitHub上的README.md文檔
本博文主要介紹如何使用該基于Java編寫的加解密工具包及一些應用場景~
僅供學習和參考,個人能力有限,有不足的地方,歡迎多多糾正和建議~
最后如果覺得有用的話,幫忙點個贊,Thanks?(?ω?)?
二、快速上手(項目應用場景)
2.1、下載源碼
git clone https://github.com/JustinJava/pwd-encrypt-decrypt.git
2.2、明文加密
將下載好的pwd-encrypt-decrypt工程導入idea或eclipse,按實際更新MainTest.java測試類中的IP、用戶、密碼數據庫信息,并運行測試類。
MainTest.java測試類
package com.justin; /** * 密碼加解密測試類 */ public class MainTest { private final static String HOST="127.0.0.1"; //數據庫IP private final static String USER = "root"; //數據庫用戶 private final static String PASSWORD = "abc@123456"; //數據庫密碼 public static void main(String[] args) { //初始化加密需要的參數 args = encryptInitParam(args); //初始化解密需要的參數 //args = decryptInitParam(args); //加解密的主入口 Main.main(args); } /** * 初始化加密需要的參數 * @param args * @return */ private static String[] encryptInitParam(String[] args) { args = new String[3]; args[0] = HOST; args[1] = USER; args[2] = PASSWORD; return args; } /** * 初始化解密需要的參數 * @param args * @return */ private static String[] decryptInitParam(String[] args) { args = new String[2]; args[0] = HOST; args[1] = USER; return args; } }
生成的密碼解密文件為encrypt.pass,默認生成在編譯目錄下
2.3、密文解密
測試解密,將encrypt.pass加密文件中的整行密文字符串,拷貝到DecryptTest.java類中進行測試。
DecryptTest.java測試類
/** * @program: DataStructures * @description: 數據庫密文解密測試類 * @author: JustinQin * @create: 2021/7/18 20:07 * @version: v1.0.0 **/ public class DecryptTest { public static void main(String[] args) { String dePass = "127.0.0.1:root:C33D583B7575AF82FFDCE895C9F5E8FA:E5DBAC8F8FFF3EA5DC670221DAF820B3:DC9AB9C2382A04F2A479891CF9B411C9"; IDecrypt decrypt = new Decrypt(); String password = null; try { password = decrypt.getDepass(dePass); } catch (Exception e) { throw new RuntimeException("數據庫密文解密失敗:" + e.getMessage()); } System.out.print(password); } }
如下圖所示,表示解密成功
2.4、生成工具包
完成了明文加密、密文解密說明對源碼的驗證完成了,可以將工程pwd-encrypt-decrypt導出為一個jar包,可根據實際需要自行命名架包,這里我命名為pwd.jar
2.5、導入工具包
將生成的工具包pwd.jar手動依賴到自己的項目中,不知道的小伙伴可自行百度搜索下idea或eclipse中Java項目如何手動導入jar包~
2.6、配置jdbc.properties或yml
修改項目數據庫配置文件jdbc.properties或application.yml(springboot工程)文件中的app-data-source.password = ***數據庫密碼為encrypt.pass加密文件中得到的密文
配置如下:
#數據庫連接驅動 app-data-source.driverClassName=com.mysql.jdbc.Driver #數據庫連接url app-data-source.url=jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=UTF-8 #數據庫用戶 app-data-source.username=root #數據庫用戶密碼(加密) app-data-source.password=127.0.0.1:root:C33D583B7575AF82FFDCE895C9F5E8FA:E5DBAC8F8FFF3EA5DC670221DAF820B3:DC9AB9C2382A04F2A479891CF9B411C9 #連接池初始化大小 app-data-source.initialSize=10 #連接池最大數量 app-data-source.maxActive=50 #連接池最大空閑 app-data-source.maxIdle=20 #連接池最小空閑 app-data-source.minIdle=5 #獲取連接最大等待時間 app-data-source.maxWait=30000
2.7、自定義數據源
自定義DataSource數據源類,主要用于將配置中讀取到的數據庫密碼密文進行解密
常用的數據源有基于tomcat jdbc連接池的數據源、基于dbcp連接池的數據源、基于阿里druid連接池的數據源等,這里以基于tomcat jdbc連接池的數據源為例:
TomcatDataSource自定義數據源類
package com.justin.datasource; import org.apache.tomcat.jdbc.pool.DataSource; import com.justin.pass.IDecryptPass; import com.justin.pass.impl.DecryptPass; /** * Desc: decrypt the tomcat pool's db password * @author JustinQin * */ public class TomcatDataSource extends DataSource{ @Override public void setPassword(String password) { IDecryptPass decryptPass = new DecryptPass(); String decryptStr; try { decryptStr = decryptPass.getDepass(password); this.poolProperties.setPassword(decryptStr); this.poolProperties.getDbProperties().setProperty("password", this.poolProperties.getPassword()); super.setPassword(decryptStr); } catch (Exception e) { e.printStackTrace(); } } }
2.8、修改配置mybatis.xml
將數據源聲明部分的class指向自定義的數據源TomcatDataSource類的全路徑(包名+類名)
工具包整合到項目中完成,重啟應用驗證是否正常~~
三、快速上手(SHELL腳本應用場景)
2.1、上傳工具包
將上傳工具包pwd.jar到服務器,shell腳本一般都是放在Linux服務器多一些,例如這里存放路徑為:
/home/tomcat/password/pwd.jar
2.2、工具包(測試)
生成密碼密文文件(測試)
cd /home/tomcat/password $JAVA_HOME/bin/java -jar pwd.jar 127.0.0.1 root abc@123456
執行以上命令,看到提示如下圖所示,表示生成encrypt.pass密文文件成功
對密鑰文件進行解密(測試)
cd /home/tomcat/password $JAVA_HOME/bin/java -jar pwd.jar 127.0.0.1 root | tail -n 1
執行以上命令,看到如下圖所示,表示解密成功~
這里需要注意的是tail -n 1表示取輸出結果的最后一行,因為pwd.jar工具包前面會輸出一些其他的日志,明文密碼在最后一行
2.3、工具包(規范)
前面的工具包(測試),直接將密碼寫在命令行了,JDK路徑和工具包路徑也是寫死的,實際生產這樣使用的話不太規范,這里需要寫個加解密腳本,將密碼寫在文件中,JDK路徑從環境變量中獲取,這樣更加安全和規范一些。
加密腳本setPass.sh
#!/bin/sh filePath=/home/tomcat/password/pwd.jar dbHost= dbUser= dbPassword=abc@123456 $JAVA_HOME/bin/java -jar $filePath $dbHost $dbUser $dbPassword
加密命令(密碼根據實際在setPass.sh中配置):sh /home/tomcat/password/setPass.sh 127.0.0.1 root
解密腳本getPass.sh
#!/bin/sh filePath=/home/tomcat/password/pwd.jar dbHost= dbUser= $JAVA_HOME/bin/java -jar $filePath $dbHost $dbUser | tail -n 1
解密命令:sh /home/tomcat/password/getPass.sh 127.0.0.1 root
2.4、實際使用
按工具包(規范)進行配置完成后,當需要在shell腳本中使用數據庫密碼連接數據庫時,不再將數據庫明文密碼直接在shell腳本中,而是直接通過命令sh /home/tomcat/password/getPass.sh 127.0.0.1 root獲取到動態密文,實際就是對密文進行解密得到密碼明文
SHELL腳本示例(查詢MySQL數據庫數據表數據):
重點關注DECRYPT_PASSWD **這一行動態密文的解密方式~
selectDemoInfo.sh
#!/bin/sh #說明: 該腳本主要是測試通過解密加密密文方式是否能正常連接到MySQL,并查詢數據庫test數據表demo_info的數據 DB_IP="127.0.0.1" DB_NAME="test" DB_USER="root" DECRYPT_PASSWD=`sh /home/tomcat/password/getPass.sh 127.0.0.1 root` DB_PASSWD="$DECRYPT_PASSWD" if ! mysql -h$DB_IP -u$DB_USER -p$DB_PASSWD < 執行腳本 sh selectDemoInfo.sh 如下圖所示,表示查詢MySQL數據庫數據表成功!!! 附錄(資源) SHELL腳本應用場景測試用到相關文件如下圖: 網盤下載鏈接:https://pan.baidu.com/s/1szqZN7CwijyBU3g58QRrvQ 提取碼:pxwx 覺得有用的小伙伴點個贊,歡迎評論區留言~ 跪求上GitHub點個Star~ https://github.com/JustinJava/pwd-encrypt-decrypt 原創不易,覺得有用的小伙伴來個三連(++評論 )+關注支持一下,非常感謝~ Git Java 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。