1.引言
在开发项目的时候,总有一些敏感信息脱敏处理的需求,比如说
- 用户手机号
- 用户 email
- 银行账号
可能很多小伙伴日常开发,并不接触敏感信息脱敏处理,不是很熟!但是对数据源数据库连接池的配置,一定很熟悉,像这样
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/edu?serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
上面是数据源的配置,数据库连接地址、驱动、用户名称、密码。这里 password 是明文配置,它的值是 root。那么你发现这里有什么问题了吗?
没错,数据库连接的 password,怎么能使用明文呢!太不安全了!尤其要是项目组有年轻的小伙伴,万一不小心把项目代码托管到网上,比如 github,gitee。
因此,在项目中,我们建议像密码这样的敏感信息,它一定要是加密后的,比如说这样
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/edu?serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
username: root
password: abc[n52j7wwoeqOm6gsf6vDcTA==]
怎么实现呢?接下来我们来回答这个问题。
这里推荐一个脱敏神器 jasypt,使用非常简单方便。首先我们来准备一下环境
2.脱敏实践
导入依赖
<!--加解密依赖-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
jasypt 编写配置
#jasypt配置
jasypt:
encryptor:
property:
#标识前缀、后缀
prefix: "abc["
suffix: "]"
#加解密算法
algorithm: PBEWithMD5AndDES
#加解密秘钥
password: yhh123
获取密码加密后内容 关于 password 加密内容,可以通过执行命令获取。当我们引入 jasypt-spring-boot-starter 依赖后,在仓库中找到 jasypt-1.9.2.jar 路径
C:\Users\Administrator>java -cp E:\2020\002project\repository\org\jasypt\jasypt\1.9.2\jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123456" password=yhh123 algorithm=PBEWithMD5AndDES
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.131-b11
----ARGUMENTS-------------------
algorithm: PBEWithMD5AndDES
input: 123456
password: yhh123
----OUTPUT----------------------
n52j7wwoeqOm6gsf6vDcTA==
C:\Users\Administrator>
案例配置项 为了案例演示方便,特意增加了配置:my.ds.url/username/password
#案例配置项,配置时password是加密后的内容;系统启动后,获取到的password是解密后的内容
my:
ds:
url: jdbc:mysql://127.0.0.1:3306/edu?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai
username: yhh
password: abc[n52j7wwoeqOm6gsf6vDcTA==]
编写配置类 通过配置类 JasyptConfiguration,映射配置项内容,看看 password 属性值是否是解密后的明文信息
@Configuration
@ConfigurationProperties("my.ds")
@Data public class JasyptConfiguration {
private String url;
private String username;
private Object password;
}
案例效果
@RestController
@RequestMapping("jasypt")
@Slf4j
public class JasyptController {
@Autowired
private StringEncryptor stringEncryptor;
@Autowired
private JasyptConfiguration jasyptConfiguration;
@RequestMapping("ok")
public String ok(){
log.info("数据源连接属性内容:{}", jasyptConfiguration);
return "ok";
}
/**
* 加密
* @param content
* @return
*/
@RequestMapping("encrypt/{content}")
public String encrypt(@PathVariable("content") String content) {
String encrypt = stringEncryptor.encrypt(content);
log.info("通过jasypt加密,明文:{},密文:{}", content, encrypt);
return encrypt;
}
}
启动应用,访问端点:http://127.0.0.1:8080/jasypt/ok
观察控制台打印:
- 配置文件中,password 是密文【password: abc [n52j7wwoeqOm6gsf6vDcTA==]】
- 最终在应用中,获取到的 password 是解密后的明文【 password=123456】
数据源连接属性内容:JasyptConfiguration(url=jdbc:mysql://127.0.0.1:3306/edu?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai, username=yhh, password=123456)