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類的全路徑(包名+類名)
<!-- 基于tomcat jdbc連接池的資料源 -->
<bean id="dataSource" class="com.justin.datasource.TomcatDataSource" init-method="createPool">
<!-- 基于dbcp連接池的資料源
<bean id="dataSource" class="com.justin.datasource.DbcpDataSource" destroy-method="close"> -->
<!-- 基于阿里druid連接池的資料源
<bean id="dataSource" class="com.justin.datasource.DruidDataSource" destroy-method="close"> -->
<property name="driverClassName" value="${app-data-source.driverClassName}" />
<property name="url" value="${app-data-source.url}" />
<property name="username" value="${app-data-source.username}" />
<property name="password" value="${app-data-source.password}" />
<!-- 初始化連接大小 -->
<property name="initialSize" value="${app-data-source.initialSize}" />
<!-- 連接池最大數量 -->
<property name="maxActive" value="${app-data-source.maxActive}" />
<!-- 連接池最大空閑 -->
<property name="maxIdle" value="${app-data-source.maxIdle}" />
<!-- 連接池最小空閑 -->
<property name="minIdle" value="${app-data-source.minIdle}" />
<!-- 獲取連接最大等待時間 -->
<property name="maxWait" value="${app-data-source.maxWait}" />
</bean>
工具包整合到專案中完成,重啟應用驗證是否正常~~
三、快速上手(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=$1
dbUser=$2
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=$1
dbUser=$2
$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 <<EOF
exit
EOF
then
echo "Connect to db $DB_NAME is fail!!!"
exit 1
fi
echo "Connect to db $DB_NAME success."
mysql -h$DB_IP -u$DB_USER -p$DB_PASSWD <<EOF
select * from test.demo_info;
exit
EOF
exit 0
- 執行腳本
sh selectDemoInfo.sh
如下圖所示,表示查詢MySQL資料庫資料表成功!!!

附錄(資源)
SHELL腳本應用場景測驗用到相關檔案如下圖:

網盤下載鏈接:https://pan.baidu.com/s/1szqZN7CwijyBU3g58QRrvQ
提取碼:pxwx
覺得有用的小伙伴點個贊,歡迎評論區留言~
跪求上GitHub點個Star~
https://github.com/JustinJava/pwd-encrypt-decrypt

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290642.html
標籤:java
