Sharding-JDBC在简化分库分表操作,读写分离,分布式事务方面做的很出色。网上有许多资料对其设计思想,实际应用等做了详细介绍。但数据库安全方面比较少,经过一段时间摸索,也有些收获。这次分享主要是Sharding-JDBC 数据源敏感配置数据的加解密。表字段脱敏Sharding-JDBC官方已有详细的介绍,就不再多说了,官网地址(http://shardingsphere.apache.org/index_zh.html)。此次介绍安全原因是因为安全跟系统业务一样有着同等重要地位,不可忽视。
看了很多关于Sharding-JDBC项目,很多数据源配置密码和账户名经常是这样如下图一,密码明文放在配置文件里,可能数据库账户权限比较小等其他一些原因。个人觉得像图一做些处理,系统安全就可再提升。
图一
怎样做才能更安全呢?有两种方法。第一种使用druid自带的加解密。第二种自定义加解密方法。
1 第一种使用druid自带的加解密步骤。
1.1 命令行进入到druid.jar所在路径
1.2 输入命令,按回车如图三
java -cp druid-1.1.23.jar com.alibaba.druid.filter.config.ConfigTools 个人密码
图三
1.3 命令执行结果如图四
图四
1.4 保存图四生成信息,复制出password和publicKey。
1.5 实际项目配置使用。如图五数据库连接池要使用Druid加解密才有效,红色箭头要注意。配置文件是yml,shardingsphere是spring的子项.
yml文件中的配置
shardingsphere:
datasource:
names: m1
m1:
type:
filters: config
connectionProperties:
driverClassName:
url:
username:
password:
图五
1.6 加解密生效原因
提取connectionProperties配置值,用";"进行分割。如图八请看源码。connectionProperties配置值后调用ConfigFilter进行使用1.2步骤公钥进行解密,图九是密文解密源码。更加深入了解可以去看源码
图八
图九
2 自定义加解密方法
2.0 使用自个的加密功能,为密码加密。
2.1 定义解密类继承,要导入Druid依赖包。setProperties方法就是解密操作。
public class DBPasswordCallback extends DruidPasswordCallback {
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
String pwd = (String)properties.get("password");
if (StringUtils.isNotBlank(pwd)) {
try {
//这里的password是将jdbc.properties配置得到的密码进行解密之后的值
//将密码进行解密
//TODO 将pwd进行自定义解密;
String password = RSAKeysUtil.decrypt( pwd , PRIVATE_KEY_STRING );
setPassword(password.toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.3 yml文件配置如图六。数据库连接池用Druid才能生效。
图六
2.4 加解密能生效原因是因为druid获取到了密码解密引用,调用setProperties函数传入密码密文,密码回调引用解密后把明文赋值上,然后数据收到后在校验。下面图七是源码执行操作。
图七
欢迎点赞关注留言转发,大家对安全还有其他见解请下方留言,共同探讨。希望分享对大家实际工作有帮助。