MySQL连接配置文件密码加密以及解密

老生常谈的加密问题
这次是对数据库连接属性的加密
一开始接到这个任务感觉很迷茫,刚开始bing了如何登录加密,但是结果不对
后来发现是关键字没搜索对,改成了"数据库连接加密",了解到了加密的过程如下

过程


利用加密工具生成加密串
在指定数据库连接密码的属性文件中替换原来的明文密码
自定义一个数据库连接池,继承你原来明文的时候的连接池就行
在指定数据源的配置文件内把数据库连接池指定为自定的连接池
重写setPassword方法,方法内是加密工具类的解密方法,把传递的密码赋值为解密后的密码(此时数据库在连接池的帮助下可以读取明文密码)


遗留:


虽然写好了大体,数据库连接也成功了,但是有些残留问题:

指定字符集编码没有写
貌似访问时间加长了
自定义连接池放在哪个包下


总结:


要精准定位自己的问题,方便百度,问人
明确需求和流程之后再思考如何写代码

以上都参考以下链接:源链接

**

2018年12月10日11:09:50新增:
**
本来以为任务完成了,结果要进行JNDI的加密修改,在不能动jar包的情况下如何解决?
刚开始想到了新建一个相似的去弄,后来发现一篇文章写在对应模块(maven分模块开发)下也能实现,只需要在Tomcat的context.xml中的resource标签的factory属性指定值(就是重写的实现类,功能和basicDataSourcefactory一样,不过加了个解密功能)
感谢大佬(虽然乍一看没感觉出工厂模式)


参考链接

**

2018年12月14日16:40:52修改
**
今天终于搞定了全部问题,没有任何namingexception,不需要忽略解密异常.
而且满足了在不改动源码的情况下执行解密和重新赋值.

 

感受


重新从头到尾整理解决整个问题的过程:

接到任务,听到jndi很慌,大概了解需求,但是不知道该怎么加密
百度后知道了配置连接加密就是随便找个地方加密完然后放到配置文件中
百度解密,改动源码,继承basicDataSource,setpassWord方法中解密配置(带上对应解密工具类和jar包),然后打jar包,替换原始common.dbcp(或者Tomcat的dbcp2的dbcp)的jar包
涉及源码修改,牵扯甚大,此方法不适合使用.
再次百度,得知了把jar包里重写的那个类decryptbasicdatasource(名字自定义的,功能和basicDataSource一样)写到代码中也是可以的,但是要Tomcat的context.xml指定resource下的factory属性值为decryptbasicdatasource的全限定类名.
但是Tomcat服务器找不到这个类,仍然会报namingexception和classnotfoundexception
思考2日不得结果,后经过指点得知只需要添加几行代码就行,从中思考出或许可以从DataSource下手,作为接口没有太多方法,所以考虑到使用反射获取DataSource内的链接信息(这时候忽略了其子类basicDataSource),然而获得了password但是不能把解密后的设置回DataSource
后继续百度,终于发现子类basicdatasource的set get方法,一时心情激荡,终于完成了解密连接操作,然而(现在想来那时候的脑子真实瓦特了)DataSource是明文密码,后续再执行getconnection还是会自动解密,但是此时密码已经是明文,再执行解密操作会报错.(不知道为什么还是需要getconnection)
此时有两种办法,一个是把DataSource的password重新设置为明文,一个是判断是否已经解密(此时思维陷入死角,没有想到第一种简单办法,因此浪费两天时间).在今天下午,终于想到了第一个办法,在成功连接数据库后再次把DataSource内密码设置为加密串,此时originpassword还在使用后继续百度,终于发现子类BasicDataSource的set get方法,一时心情激荡,终于完成了解密连接操作
然而(现在想来那时候的脑子真实瓦特了)DataSource是明文密码,后续再执行getconnection还是会自动解密,但是此时密码已经是明文,再执行解密操作会报错.此时有两种办法,一个是把DataSource的password重新设置为明文,一个是判断是否已经解密(此时思维陷入死角,没有想到第一种简单办法,因此浪费两天时间).在今天下午,终于想到了第一个办法,在成功连接数据库后再次把DataSource内密码设置为加密串,这样就解决了问题
大概写下伪代码吧

initctx =new initialcontext();
ds =initctx.lookup获取数据源  //注意是Tomcat的basicDataSource , 而不是common.dbcp的
originpassword=ds.getpassword();
decryptpassword=解密工具解密得到明文密码
ds.setpassword(decryptpassword);
ds.getconnection();
ds.setpassword(originpassword)

最后…其实很想抽自己,浪费了那么多时间,脑回路稍微转一下就好了,庆幸的是最终解决了问题

最后的最后 再总结两点

父类方法不够的时候去找子类
思维阻塞的时候,脱离代码(因为代码的一些类会造成方向误导),通过脑图或者画图来明确解决思路
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章