这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub
上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小。
说起这个我是比较有感触的,之前删库的经历,到现在想起来心里还难受,我也是把数据库账号明文密码误提交到GitHub
,然后被哪个大宝贝给我测试库删了,后边我长记性了把配置文件内容都加密了,数据安全问题真的不容小觑,不管工作汇还是生活,敏感数据一定要做脱敏处理。
接下来分享工作中两个比较常见的脱敏场景。
配置脱敏
实现配置的脱敏我使用了Java
的一个加解密工具Jasypt
,它提供了单密钥对称加密
和非对称加密
两种脱敏方式。
单密钥对称加密:一个密钥加盐,可以同时用作内容的加密和解密依据;
非对称加密:使用公钥和私钥两个密钥,才可以对内容加密和解密;
以上两种加密方式使用都非常简单,咱们以springboot
集成单密钥对称加密方式做示例。
首先引入jasypt-spring-boot-starter
jar
<!--配置文件加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
复制代码
配置文件加入秘钥配置项jasypt.encryptor.password
,并将需要脱敏的value
值替换成预先经过加密的内容ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)
。
这个格式我们是可以随意定义的,比如想要abc[mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l]
格式,只要配置前缀和后缀即可。
jasypt:
encryptor:
property:
prefix: "abc["
suffix: "]"
复制代码
ENC(XXX)格式主要为了便于识别该值是否需要解密,如不按照该格式配置,在加载配置项的时候jasypt
将保持原值,不进行解密。
spring:
datasource:
url: jdbc:mysql://1.2.3.4:3306/xiaofu?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&ze oDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: xiaofu
password: ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)
# 秘钥
jasypt:
encryptor:
password: 程序员内点事(然而不支持中文)
复制代码
秘钥是个安全性要求比较高的属性,所以一般不建议直接放在项目内,可以通过启动时-D
参数注入,或者放在配置中心,避免泄露。
java -jar -Djasypt.encryptor.password=1123 springboot-jasypt-2.3.3.RELEASE.jar
复制代码
预先生成的加密值,可以通过代码内调用API生成
@Autowired
private StringEncryptor stringEncryptor;
public void encrypt(String content) {
String encryptStr = stringEncryptor.encrypt(content);
System.out.println("加密后的内容:" + encryptStr);
}
复制代码
或者通过如下Java命令生成,几个参数D:\maven_lib\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar
为jasypt核心jar包,input
待加密文本,password