1. 需求背景
    我们在开发应用时,需要连接数据库,一般把数据库信息放在一个属性配置文件中,比如jdbc.properties,具体的内容
    #mysql的配置文件
    jdbc.url=jdbc:mysql://127.0.0.1:3306/test
    jdbc.username=root
    jdbc.password=123456

里面用明文的方式存储着数据库的敏感信息用户名username和密码password,这是不好的行为,容易产生安全问题。那我们如何实现加密存储呢?

  1. 实现原理
    实现原理其实很简单,配置文件存储加密后的用户名和密码,重写Druid数据源的两个方法setUsername(String username)和setPassword(String password)对信息解密。
  2. 实现方式
    3.1 写加密工具
    首先得有一个加密工具,具有加解密功能,这里为了方便直接使用Druid中的工具类com.alibaba.druid.filter.config.ConfigTools。使用其中的encrypt(String plainText)方法和decrypt(String cipherText)方法采用默认的公私玥加解密。

3.2 加密配置文件
#MySql数据库配置
connection.url=jdbc:mysql://127.0.0.1:3306/test
connection.username=加密后的用户名*******
connection.password=加密后的密码*********
3.3 创建自己的数据源
新建类SecurityDateSource继承数据源DruidDataSource并重写其中设置用户名和密码的方法:

import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;
 
public class SecurityDateSource extends DruidDataSource{
    @Override
    public void setUsername(String username) {
        try {
            username = ConfigTools.decrypt(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.setUsername(username);
    }
 
    @Override
    public void setPassword(String password) {
        try {
            password = ConfigTools.decrypt(password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.setPassword(password);
    }
 
    public static void main(String[] args) throws Exception{
        String password = "123456";
        String username = "root";
        System.out.println("加密后的password = [" + ConfigTools.encrypt(password) + "]");
        System.out.println("加密后的username = [" + ConfigTools.encrypt(username) + "]");
    }
}

3.4 Spring文件中配置数据源
注意将class改为自己的新建的数据源

使用druid加密的第二种方法
修改数据库配置,在配置数据源处,添加此两行代码

MYSQL给数据库用户名和密码 mysql用户名密码加密_bc

如图

3.配置文件config.properties中,添加此行代码
如图
publickey=${jdbc.mysql.publickey}
主要作用是对应加密后的公钥。
4.修改pom.xml文件,添加此两行代码。

MYSQL给数据库用户名和密码 mysql用户名密码加密_bc_02


如图 添加

<jdbc.mysql.publickey></jdbc.mysql.publickey>

5.以上配置好后,使用durid的加密算法生成加密密码和公钥。

首先要找到jar包所在位置,然后shift+右键,点击 在此处打开命令窗口,然后输入:

java -cp druid-1.0.18.jar com.alibaba.druid.filter.config.ConfigTools 1234567a
(druid-1.0.18.jar:对应的jar包名称,12345678a:对应的数据库密码)
回车,
生成一大堆东西:

MYSQL给数据库用户名和密码 mysql用户名密码加密_MYSQL给数据库用户名和密码_03

如图
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA3MAoIF9F/wDJneKskSBJ9VE8VFeeShJyAaHM9I7LphSDvf8xxLAv2LcP+t1LHMa/yElVDr4cyFv5azWxKOwjxwIDAQABAkEAwIpx9VpkKPk84ZM2RRbOq0QBxObvT1grTDUeGSj7g4y+ZH+I+DHnJdzHrYWWTJ2Hx3evesp+iVUy8Ni/dvkUEQIhAPGL+df7YqaiL5lSgFqNNkrnw0/8j6v4GxSkofG2jGMFAiEA6fWfyil8+aa5j+NgA0MZYWQfRRNa2jz3PTClttTV/VsCIELkFaN3TWGCBpZ6H2t0MbXaqt7qvUrNYYp88RAEEqqVAiBZ99yUr1Oh5V1iWbuoRXtTGl9z/rdnSR6CZ1yybDJGFQIgYkRZkoMq1sJ7b/Jlh4Prp7ntzzmmkpu9rogB4iE9p24=
privateKey:私钥,用于生成密文密码用,不用管

publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANzAKCBfRf8AyZ3irJEgSfVRPFRXnkoScgGhzPSOy6YUg73/McSwL9i3D/rdSxzGv8hJVQ6+HMhb+Ws1sSjsI8cCAwEAAQ==
publicKey:就是步骤4中publickey中的值,用于解密密码

password:HRDx+yN+mqk7hNAzZQ8M4wkV7hKgjE3XIAP1/gvjjwx8ZFrWmEvVfmDwQkyB3qasffxZhFrxOmUuDPIIVkFDnQ==
paasword:加密后的密码

将生成publicKey和password分别放入步骤4中,password2和publickey中。
配置完成。

备注:

  1. 每次使用jar包生成加密密码时都会出现新的加密信息,但是之前生成的加密信息扔可用,所以每次只生成一次即可。
  2. 将publickey和password都放在pom.xml中时,如果更改pom中配置的key时,需要重新使用maven命令clean后再打包,不然会连接失败。
  3. 或者修改配置,pom中只有加密后的password,不放publickey,将公钥放入config.properties中,如图