0%

springboot-durid密码加密

springboot 使用durid数据源设置数据库密码加密

前言

开发过程中,配置的数据库密码通常是明文形式,这样首先第一个安全性不好(相对来说),不符合一个开发规范(如项目中不能出现明文账号密码),其实就是当出现特殊需求时,比如要对非运维人员开方服务器部分权限,但是又涉及项目部署的目录时,容易泄漏数据库密码,虽然一般生产环境中,数据库往往放入内网,访问只能通过内网访问,但是不管怎么说账号密码直接让人知道总归不好,甚至有些项目需要部署到客户环境中,但是可能共用一个公共数据库(数据库只向指定服务器开放外网端口或组建内网环境),这样的情况下,如果数据库密码再以明文形式存在,就非常危险了

第一种:通过网络获取密码

这种是让密码通过接口获取,当然接口中可以做加密认证,但是如果是把获取地址和认证放在了配置文件中,那么稍微用心也能获取到密码,不过也可以跟第二种方法配合使用

第二种:密码加密

通过对密码加密,使得配置文件中配置的密码为密文,从而提升安全性,当然网络获取密码也可以获取加密后的密码,而国内常用的数据库连接池是Druid,所以此文主要是针对Druid的数据库密码加密方案,Druid默认再带了一个密码加密,所以Druid加密密码也有2种方案

第一种:自带加密

优点:简单快捷,配置方便,无需改动代码(只需要改动配置文件即可)

缺点:自欺欺人式加密,因为密码和公钥都需要配置到配置文件中,只要别人有了配置文件,看出来了你是用的Druid,就可以用druid进行解密

第二种:自行加解密

优点:相对更安全,可以自行实现加解密
缺点:需要改动源码,另外只要有对应源码和配置文件也能解密,所以如果团队中想要控制其他成员不能获取到生产环境中的数据库密码,那么成员就不能有生产环境中的配置文件

自行加解密实现

Druid原生支持自行实现加解密,只需要实现解密类,然后配置对应解密类即可,首先编写类继承DruidPasswordCallback,在setProperties方法中解密密码,我的解密代码如下(代码中有伪代码,不能直接复制使用,需要先替换伪代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 解密数据库密码回调
*/
@Slf4j
public class DBPasswordCallback extends DruidPasswordCallback {

@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
//获取配置文件中的已经加密的密码
String pwd = (String)properties.get("password");
if (StringUtil.isNotEmpty(pwd)) {
try {

//这里的代码是将密码进行解密,并设置
String password = (解密密码)
setPassword(password.toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
配置解密类

用了自行加解密之后,还需要在application.yml中配置解密的类,具体添加配置如下

1
2
3
4
5
spring: 
datasource:
druid:
connection-properties: password=${spring.datasource.druid.password}
password-callback-class-name: 对应包名.DBPasswordCallback

如果使用了多数据源就需要把 配置加到对应的数据源下
注意配置中有伪代码,也就是加2个配置,其中connection-properties是一个map结构的配置,用;分割,可以自行定义其中key和value的值,最终会封装成对象传入DBPasswordCallback 类的setProperties方法中,password-callback-class-name则是配置解密回调的类,也就是我们的DBPasswordCallback 类,需要跟包名一起设置,上面代码中报名用伪代码代替了,需要替换