我们用java链接数据库,不管是web项目还是小程序,都需要把数据库密码写在配置文件中(当然你要写死在程序里也没有办法),或者数据库中,通常源代码漏洞扫描都会告诉你不能有明文密码,那么有什么办法可以变为密文呢?
一、思路如下
写一个非对称加密的工具类,用私钥加密明文,然后把公钥和得到的密文放在配置文件中,代码中读取密码的时候就把公钥和密文读取进来解密后给程序用。
很简单吧!
二、一个实现
这里就举一个实现的例子,直接借用druid提供的工具类来,毕竟我现在的项目数据库连接池都是用阿里的Druid.
1、在pom.xml加入如下依赖
<!-- 阿里druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
当然可能老项目的话没有用maven就直接添加如下jar即可;
druid-1.1.9.jar
2、写一个如下工具类
/**
* druid数据库连接池中的密码进行非对称加密,使用方式
* 1、在cmd中执行:java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 要加密的串
* 2、获取公钥和加密串放到配置文件中(cmd获取方法右键标记,左键选取,按enter就复制到粘贴板了)
* 3、使用的时候,获取公钥和加密串后调用下面的decrypt方法进行解密
* @author lwh
*
*/
public class DruidEncryptDecrypt {
public static String decrypt(String publicKey,String encryptPassword) {
try {
return ConfigTools.decrypt(publicKey,encryptPassword);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
}
当然,你也可以直接使用ConfigTools就可以了,不过我这个方便写秘钥生成步骤,你也可以直接用默认的秘钥但是不建议。
2、按工具类中的步骤生成公钥和KEY,如下图所示
获取到publicKey和passwd替换配置文件中的明文密码.
3、修改以前的数据库连接信息读取类,对密码调用DruidEncryptDecrypt进行解密,如下所示:
public String getPassword() {
//这里直接返回解密数据
return DruidEncryptDecrypt.decrypt(publicKey, password);
}
这一步骤可能有人会问了,我在哪里加这个代码,我用spring都是直接在application.xml中加上去的,调用不了java代码啊?
亲,这里有两种办法解决
办法1、如果你是springboot项目,那么你可以百度下springboot整合druid密码加密,那里有集成的,这个不多说。
办法2、你看application.xml中其实就是一个dataSource的bean,你直接抽取出来写成一个配置类即可,可以参考如下我的博文:
SpringBoot2.0整合C3P0、Druid数据库连接池
当然,办法二是很通用的,所以我这里一般选择办法2.
搞定~
感想:要是被别人知道了配置文件也就是知道了密文和公钥,那也是很容易知道真实密码的,所以这个其实在我认为是自欺欺人罢了,还不如把公钥或者明文密码在程序启动的时候参数输入。