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"; //数据库IPprivate 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.propertiesapplication.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{@Overridepublic 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
EOFthenecho "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

原创不易,觉得有用的小伙伴来个三连(点赞+收藏+评论 )+关注支持一下,非常感谢~

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

  1. JAVA:实现XXTea加解密算法(附完整源码)

    JAVA:实现XXTea加解密算法 public class XXTEAprivate XXTEA() {}public static byte[] encrypt(byte[] data, byte

  2. python:实现DES和3DES加解密算法(附完整源码)

    python:实现DES和3DES加解密算法 import sys _pythonMajorVersion = sys.version_info[0]# Modes of crypting / cyp ...

  3. C#:实现SM2加解密算法(附完整源码)

    C#:实现SM2加解密算法 public class SM2CryptoUtil {public SM2CryptoUtil(byte[] pubkey, byte[] privkey, Mode m ...

  4. 计算机毕业设计JAVA基于Bootstrap框架的读书网站设计与实现mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA基于Bootstrap框架的读书网站设计与实现mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA基于Bootstrap框架的读书网站设计与实现mybati ...

  5. 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调 ...

  6. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  7. 【安全算法之base64】base64加解密的C语言源码实现

    最近,有项目中需要用到base64的加解密,所以用C语言实现了一遍,测试效果还不错,代码量和RAM消耗都比较低,可以提供给大家参考下. #include <stdbool.h> #incl ...

  8. java基于springboot同学校友录捐赠信息网站ssm-maven项目源码

    本系统提供各种相关大学生的信息,实现了对信息数据的浏览.查询.编辑和删除等基本数据库操作,采用了模块化设计方法,实现了前台功能模块和后台功能模块. 在本校系统中,主要是为了实现以下的基本功能,首先就是 ...

  9. 拍卖系统源码 java,基于B2C的网上拍卖系统_秒杀与竞价 - WEB源码|JSP源码/Java|源代码 - 源码中国...

    文件名大小更新时间 a014基于B2C的网上拍卖系统_秒杀与竞价02019-08-15 a014基于B2C的网上拍卖系统_秒杀与竞价\截图02020-05-29 a014基于B2C的网上拍卖系统_秒杀 ...

  10. java邮件客户端源代码,JAVA基于B/S模式下的电子邮件客户端软件,源码分享

    今天将为大家分析一个电子邮件客户端软件(随着计算机网络的高速发展,人与人之间信息传输量越来越大,传输时间也越来越短.在这计算机技术和Internet广泛普及的时代,电子邮件扮演了一个非常重要的角色.通 ...

最新文章

  1. CentOS内核优化提示:cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录...
  2. Tensorflow:tf.contrib.rnn.DropoutWrapper函数(谷歌已经为Dropout申请了专利!)、MultiRNNCell函数的解读与理解
  3. Tengine怎么去安装第三方模块、以及安装源码中的模块
  4. 【PAT乙级】1031 查验身份证 (15 分)
  5. flume数据采集:js埋点
  6. VTK:PolyData之DijkstraGraphGeodesicPath
  7. 大数据WEB阶段 (六)MySql详解(一)
  8. Hibernate的拦截器和监听器 .
  9. leetcode 787. Cheapest Flights Within K Stops | 787. K 站中转内最便宜的航班(BFS)
  10. 基于verilog贪吃蛇游戏设计
  11. [css] 举例说明与打印有关的属性有哪些?
  12. [LeetCode]Integer to Roman
  13. python列表的小东西_小谈python里 列表 的几种常用用法
  14. Ubuntu环境搭建零:安装Linux虚拟机
  15. opencv-python API 官网文档
  16. 企业网站建设要点和推广方法有哪些?
  17. Linux架设代理服务器
  18. 逻辑回归(神经网络Sigmod激活函数,计量logit模型)
  19. Redmi K20 Pro如何编译内核
  20. 太极图(JAVA实现)

热门文章

  1. java der decode_支付宝进行签名时爆DER input, Integer tag error异常
  2. pb公共变量怎么找_pb 实用方法
  3. 小程序实现文字竖排展示
  4. VS2010 旗舰版序列号
  5. Mac键盘部分数字键和字母键失灵,无法使用怎么办?
  6. COSCon'21 大数据(D)论坛介绍
  7. java数字签名实现简单的动态秘钥
  8. 如何将live stream发布到Youtube
  9. 2018年10月7日虚拟机出现无法连接MKS错误提示和docx, rtf类型文件简介
  10. flutter实战!一个Android应届生从上海离职,深度好文