Java基础——数据库连接信息使用密文

背景

数据库连接配置文件一般都是使用明文,这会带来数据库泄露的安全问题。例如jdbc.properties配置文件中,数据库连接地址、用户名、密码都是明文,如何使配置文件中的数据库连接信息避免明文显示是本文重点内容,即如何使配置信息使用密文就可以达到跟明文一样的效果。

分析

假如数据库连接密码使用了密文。

  • 修改连接池源码

顾名思义,修改dbcp、c3p0、Druid连接池的源码,先对加密的密码解密,然后再创建连接。改完源码后重新打包发布。不建议采用修改源码的方式。

  • 拦截数据库连接属性信息

不修改源码,又想使用密文密码连接,有没有这么好的事呢?答案是有的。利用spring的加载顺序,在加载dbcp、c3p0、Druid连接池之前拦截数据库连接对象,对密码密文解密后,注入到数据库连接对象的password属性中,这样在创建连接池的时候,用的密码就是明文密码了。

相关技术

数据库连接池:Druid、dbcp、c3p0等

JDBC

AES加解密算法

Spring

实操

假如数据库连接密码使用了密文。

针对拦截数据库对象属性信息这一实现方法做实际操作与测试。

Druid

Jdbc.properties

Java基础——数据库连接信息使用密文

上图中的连接密码已进行了AES加密。

spring.xml

Java基础——数据库连接信息使用密文

上图表示将id="dbPwdProperties"的bean的属性赋给Druid数据源连接对象bean。

org.jeecgframework.core.util.DbPwdEncryptBean这一实体bean用来解密密文,解密后的密文重新赋给”password”这一属性。如下图:

Java基础——数据库连接信息使用密文

Java基础——数据库连接信息使用密文

AES加解密算法本文不在赘述。

经实操测试后,项目可正常启用。暂未发现不靠谱现象。

C3P0

与druid实操基本相同,只是部分差异,如下:

Java基础——数据库连接信息使用密文

上图中除了class需要改成”com.mchange.v2.c3p0.ComboPooledDataSource”c3p0连接池对象外(改成c3p0连接池配置),上图红框中也应改成properties,因为c3p0连接池底层源码设置属性的的属性名使用的”properties”,如下图:

Java基础——数据库连接信息使用密文

而Druid连接池底层源码设置属性的的属性名使用的”connectProperties”,如下图:

Java基础——数据库连接信息使用密文

DBCP

除了class改成”org.apache.commons.dbcp.BasicDataSource”dbcp连接池对象外(改成DBCP连接池配置),其它同Druid。