Java--基于Java编写的数据库加解密工具包(附)GitHub源码

网友投稿 752 2022-05-25

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、工具包(测试)

生成密码密文文件(测试)

Java--基于Java编写的数据库加解密工具包(附)GitHub源码

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 <

执行脚本 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小时内删除侵权内容。

上一篇:程序员的520花式绘制爱心代码大全
下一篇:【Free Style】云储存靠不靠谱?云储存靠不靠谱?
相关文章