Java--基于Java编写的数据库加解密工具包(附)GitHub源码
【摘要】 GitHub源码地址:https://github.com/JustinJava/pwd-encrypt-decrypt (图1)项目应用场景(图2)SHELL脚本应用场景一、背景介绍如上图1和图2标记部分所示,项目中数据库连接配置的密码密文和SHELL脚本中的动态密文,就是基于本工具包实现的~不知道你的项目数据库连接配置,是不是还在用明文密码或者SHELL脚本直接写死数据库连接密码?如果...
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路径从环境变量中获取,这样更加安全和规范一些。
#!/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
#!/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
原创不易,觉得有用的小伙伴来个三连(点赞+收藏+评论 )+关注
支持一下,非常感谢~
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)