背景
数据库连接配置文件一般都是使用明文,这会带来数据库泄露的安全问题。例如jdbc.properties配置文件中,数据库连接地址、用户名、密码都是明文,如何使配置文件中的数据库连接信息避免明文显示是本文重点内容,即如何使配置信息使用密文就可以达到跟明文一样的效果。
分析
假如数据库连接密码使用了密文。
- 修改连接池源码
顾名思义,修改dbcp、c3p0、Druid连接池的源码,先对加密的密码解密,然后再创建连接。改完源码后重新打包发布。不建议采用修改源码的方式。
- 拦截数据库连接属性信息
不修改源码,又想使用密文密码连接,有没有这么好的事呢?答案是有的。利用spring的加载顺序,在加载dbcp、c3p0、Druid连接池之前拦截数据库连接对象,对密码密文解密后,注入到数据库连接对象的password属性中,这样在创建连接池的时候,用的密码就是明文密码了。
相关技术
数据库连接池:Druid、dbcp、c3p0等
JDBC
AES加解密算法
Spring
实操
假如数据库连接密码使用了密文。
针对拦截数据库对象属性信息这一实现方法做实际操作与测试。
Druid
Jdbc.properties
上图中的连接密码已进行了AES加密。
spring.xml
上图表示将id="dbPwdProperties"的bean的属性赋给Druid数据源连接对象bean。
org.jeecgframework.core.util.DbPwdEncryptBean这一实体bean用来解密密文,解密后的密文重新赋给”password”这一属性。如下图:
AES加解密算法本文不在赘述。
经实操测试后,项目可正常启用。暂未发现不靠谱现象。
C3P0
与druid实操基本相同,只是部分差异,如下:
上图中除了class需要改成”com.mchange.v2.c3p0.ComboPooledDataSource”c3p0连接池对象外(改成c3p0连接池配置),上图红框中也应改成properties,因为c3p0连接池底层源码设置属性的的属性名使用的”properties”,如下图:
而Druid连接池底层源码设置属性的的属性名使用的”connectProperties”,如下图:
DBCP
除了class改成”org.apache.commons.dbcp.BasicDataSource”dbcp连接池对象外(改成DBCP连接池配置),其它同Druid。