springboot框架项目实践应用一(敏感信息脱敏)

180 阅读3分钟

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)