养猪场日志(五)——数据库配置文件加密


1.    前言

        呀,两周没有写博客了,罪过罪过!今天这一篇想写写数据库配置文件加密,也就是properties文件的加密。以前看别人写的数据库配置文件,关键参数都是使用了加密算法的,一直不知道怎么实现的,现在终于找到实现方法了,就写一下,防止以后忘记。

2.    为什么要加密

        配置文件使用加密,最直接的原因就是我不想让别人看到我的数据库连接参数,这样的话数据库就相对更加安全一点。之前我写数据库配置文件的时候,都是像下图所示的这样:

养猪场日志(五)——数据库配置文件加密

        像这样直接把数据库的地址,数据库名,用户密码直接明文暴露是很不安全的,别人一看啥都知道了。但是如果你的配置文件是下图所示的这样,别人看了是不是就一脸懵逼了。

养猪场日志(五)——数据库配置文件加密

3.    具体实现步骤

3.1     编写一个信息类

        新建一个DBProperties.java类,这个类是干什么的呢?因为有时候要加密不止一个配置文件中的内容,而且每个配置文件需要要加密好几个属性值,为了统一管理这些信息,方便以后维护修改,我就创建了这么一个类。具体代码如下图所示:

养猪场日志(五)——数据库配置文件加密

        这个类中没有任何自定义的方法,只有一些静态的属性,而这些属性主要分为三类,一类是一个加密算法的秘钥,这个完全可以自定义,但是具体位数要根据使用的加密算法要求定,不能随便写的;第二类是需要加密或者说有要加密的属性值存在的properties文件的名称;第三类是所有要加密的属性名称,也就是KEY值。

        需要注意的是在这个类中定义这些静态属性的时候,最好自已定义一个命名规则,这样有利于管理,也方便后面一些功能的实现。

3.2     编写一个加解密工具类

        对字符串加密的一般步骤是先用特定的加密算法将原字符串进行加密,然后再将加密后的二进制字符串转为十六进制的字符串。解密的步骤正好是加密步骤倒过来进行。我用的是AES加密算法,要注意的一点是AES加密算法要求KEY必须是16位的,刚开始我不知道,运行的时候报了一堆异常,后面上网查了资料才知道,所以为了避免走弯路,还是要说一下的。下面是我的加解密工具类AESCryptUtil.java的具体实现:

养猪场日志(五)——数据库配置文件加密

3.3     编写一个自定义的配置文件加载器

        常用的配置文件加载方式一般都是使用注解或者是<context:property-placeholderlocation="classpath:db.properties" />这种方式加载的。Spring默认的配置文件加载类是PropertyPlaceholderConfigurer.java,为了实现加密功能,我们需要自定义一个加载器,并继承这个类,重写其convertProperty方法。通过查看源码,我找到了PropertyPlaceholderConfigurer类继承自PropertiesLoaderSupport类的convertProperty方法的最终实现如下图所示:

养猪场日志(五)——数据库配置文件加密

        从源代码中可以看出,在这里没有对属性值做任何处理就返回了,因此我们需要在这里做点手脚。

        我的自定义配置文件加载器EncryptablePropertyPlaceholderConfigurer.java具体实现如下图所示:

养猪场日志(五)——数据库配置文件加密

        图中我已经对实现思路做了标注,这里我觉得要说两点内容。

        一是两种将DBProperties类中的静态加密KEY值属性添加到集合中的方法,一个是简单的通过集合的add方法一个一个手动去添加,但是如果在DBProperties类中添加或者去除了某一个加密项,那就要来修改这里的代码,这是很不方便的实现方式,我之前就是这么做的,后来发现这个问题后,就想到了用第二种方式,也就是通过Java的反射机制,逆向的去将DBProperties类中以“JDBC_”和“REDIS_”开头的属性值都加载并添加到集合中,这样只要我们在DBProperties类中添加属性的时候遵循一定的规则,就不用再来维护自定义的convertProperty方法中的代码了。

        另一个要说明的是这里的main方法功能。因为要对配置文件中的属性进行解密,首先配置文件中的属性是已经加密的,这就需要手动的将原来未加密的属性进行加密,然后将加密后的字符串copy配置文件中替换原来的属性值。这就是这个main方法的作用。

3.4     修改配置

        所有的类都编写好之后,我们需要将原来的xml文件中配置文件加载方式进行修改。修改后的内容如下图所示:

养猪场日志(五)——数据库配置文件加密

        这里要注意的是,如果在项目中,有两个.properties配置文件需要加载,其中一个是需要解密的,而另一个不需要解密,那也要将两个文件在同一个XML文件中用自定义的配置文件加载器一次全部加载上来。

        我之前就是一个文件在A.xml文件中用自定义的加载器加载,另一个文件在B.xml文件中用原有的加载方式加载的,结果运行的时候报异常说解析不了属性值,后来查了好久才明白。因为Spring加载properties文件只轮寻一次,也就是说在A.xml文件中Spring查找并加载过一次properties配置文件之后,在B.xml文件中即便是有加载配置文件有关的配置内容,Spring也不会再去查找加载这些配置文件了,所以必须要一次性全部加载上来才可以。

4.    总结

        刚开始自己实现数据库配置文件加密的时候走了不少弯路,也报了N多的异常,这里尽量把一些需要注意的内容都写出来了,可能语言表达能力没有那么强吧,一些东西描述的不是很清楚,但还是希望可以帮到有需求的人。后面写什么还没有想好,随缘吧。