3 步完成 Spring Boot 的日志脱敏

Java后端技术

共 8601字,需浏览 18分钟

 · 2022-07-23

往期热门文章:

1、线上MySQL的自增id用尽怎么办?被面试官干趴下了!
2、求求你别再用 System.currentTimeMillis() 统计代码耗时了,真的太 Low 了!
3、如何将 @Transactional 事务注解运用到炉火纯青?
4、不知道怎么解耦业务?Spring Event 了解一下!
5、Java多线程+List分段完美解决导入等批量更新场景问题!

在我们写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。

对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具类,在打印日志的时候对特定特字段进行脱敏返回。

两种方式各有优缺点:

  • 第一种方式需要修改代码,不符合开闭原则。
  • 第二种方式,需要在日志方法的参数进行脱敏,对原生日志有入侵行为。

自定义脱敏组件(slf4j+logback)

一个项目在书写了很多打印日志的代码,但是后面有了脱敏需求,如果我们去手动改动代码,会花费大量时间。如果引入本组件,完成配置即可轻松完成脱敏。(仅需三步可轻松配置)

一、自定义脱敏组件 - 脱敏效果演示



二、自定义脱敏组件 - 使用方式

1、引入Jar包依赖

前提是你将Jar包打入本地仓库,Jar包地址见后文。

<dependency>
    <groupId>pers.liuchengyin</groupId>
    <artifactId>logback-desensitization</artifactId>
    <version>1.0.0</version>
</dependency>

2、替换日志文件配置类(logback.xml)

日志打印方式都只需要替换成脱敏的类即可,如果你的业务不需要,则无需替换。

①ConsoleAppender - 控制台脱敏
// 原类
ch.qos.logback.core.ConsoleAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyConsoleAppender
②RollingFileAppender - 滚动文件
// 原类
ch.qos.logback.core.rolling.RollingFileAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyRollingFileAppender
③FileAppender - 文件
// 原类
ch.qos.logback.core.FileAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyFileAppender

替换示例:

<property name="CONSOLE_LOG_PATTERN"
          value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>

<!-- ConsoleAppender 控制台输出日志 -->
<appender name="CONSOLE" class="pers.liuchengyin.logbackadvice.LcyConsoleAppender">
    <encoder>
        <pattern>
            ${CONSOLE_LOG_PATTERN}
        </pattern>
    </encoder>
</appender>

3、添加脱敏配置文件(logback-desensitize.yml)

该配置文件应该放在resources文件下


三、自定义脱敏组件 - 脱敏规范

1、支持数据类型

八大基本类型及其包装类型、Map、List、业务里的Pojo对象、List<业务里的Pojo对象>、JSON字符串。

注:在配置文件中配置的时候,只需要配置对象里的属性值就行。

2、不支持的数据类型

List<八大基本类型及包装类型>,因为不知道脱敏的数据源具体是哪一个。

3、匹配规则

key + 分割符 + value,目前仅支持冒号(:)和等号(=),示例如下:

log.info("your email:{}, your phone:{}""123456789@qq.com","15310763497");
log.info("your email={}, your cellphone={}""123456789@qq.com","15310763497");
  • key:定义了对应需要脱敏的关键字,如上诉的email、phone等以及业务对象中的字段、Map中的Key、JSON中的Key
  • value:需要脱敏的值,如上诉的123456789@qq.com15310763497

4、日志规范

建议书写日志的时候尽量规范,对于key为中文的是没有办法脱敏的,规范程度可以见脱敏效果演示里的代码。

四、logback-desensitize.yml配置说明

# 日志脱敏
log-desensitize:
  # 是否忽略大小写匹配,默认为true
  ignore: true
  # 是否开启脱敏,默认为false
  open: true
  # pattern下的key/value为固定脱敏规则
  pattern:
    # 邮箱 - @前第4-7位脱敏
    email: "@>(4,7)"
    # qq邮箱 - @后1-3位脱敏
    qqemail: "@<(1,3)"
    # 姓名 - 姓脱敏,如*杰伦
    name: 1,1
    # 密码 - 所有需要完全脱敏的都可以使用内置的password
    password: password
  patterns:
    # 身份证号,key后面的字段都可以匹配以下规则(用逗号分隔)
    - key: identity,idcard
      # 定义规则的标识
      custom:
        # defaultRegex表示使用组件内置的规则:identity表示身份证号 - 内置的18/15位
        - defaultRegex: identity
          position: 9,13
        # 内置的other表示如果其他规则都无法匹配到,则按该规则处理
        - defaultRegex: other
          position: 9,10
    # 电话号码,key后面的字段都可以匹配以下规则(用逗号分隔)
    - key: phone,cellphone,mobile
      custom:
        # 手机号 - 内置的11位手机匹配规则
        - defaultRegex: phone
          position: 4,7
        # 自定义正则匹配表达式:座机号(带区号,号码七位|八位)
        - customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
        # -后面的1-4位脱敏
          position: "-<(1,4)"
        # 自定义正则匹配表达式:座机号(不带区号)
        - customRegex: "^[0-9]{7,8}"
          position: 3,5
        # 内置的other表示如果其他规则都无法匹配到,则按该规则处理
        - defaultRegex: other
          position: 1,3
    # 这种方式不太推荐 - 一旦匹配不上,就不会脱敏
    - key: localMobile
      custom:
          customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
          position: 1,3

上面这个配置是相对完整的,一定要严格遵守层级配置格式。

自定义脱敏支持的方式

1、key:value的方式

  • phone:4,7,表示phone属性的4-7位进行脱敏
  • 原始数据:13610357861
  • 脱敏后:136****7861

2、以符号作为起始、结束节点作为脱敏标志

emai:"@>(4,7)"@为脱敏标志,>表示其为结束节点,<表示其为开始节点。即@>表示对@之前的进行脱敏,@<表示对@之后的进行脱敏。这个示例就是@前的数据的第4-7位进行脱敏。

注意:这种规则里的双引号、括号不能省略,其次:=不能作为标志符号,因为和匹配规则有冲突

  • 原始数据:123456789@qq.com
  • "@>(4,7)"脱敏后:123****89@qq.com
  • "@<(1,3)"脱敏后:123456789@***com

3、自定义正则脱敏

patterns:
  # 手机号
  - key: phone,mobile
    custom:
      # 手机号的正则
      - customRegex: "^1[0-9]{10}"
        # 脱敏范围
        position: 4,7

customRegex:正则表达式,如果符合该表达式,则使用其对应的脱敏规则(position)

4、一个字段,根据多种值含义进行自定义脱敏

比如说,username字段的值可以是手机号、也可以是邮箱,这个值动态改变的,前面几种方式都没办法解决,可以使用该方式。

patterns:
  - key: username
    custom:
      # 手机号 - 11位
      - defaultRegex: phone
        position : 4,7
      # 邮箱 - @
   - defaultRegex: email
     position : "@>(3,12)"
   # 身份证 - 15/18位
   - defaultRegex: identity
     position : 1,3
   # 自定义正则
   - customRegex: "^1[0-9]{10}"
     position : 1,3
   # 都匹配不到时,按照这种规则来
   - defaultRegex: other
     position : 1,3

注意:上面示例中匹配规则里的 双引号和括号 都不能省略

该组件内置四种匹配规则:手机号、身份证号、邮箱、other(其他匹配不到时用的),内置一种脱敏方式:password,表示完全脱敏,可用于pattren下的。

注:当pattern和patterns下的key有重复的时候,只会使用pattern下指定的方式进行脱敏。

Jar包地址和源码地址

https://github.com/liuchengyin01/LogbackDesensitization/tree/master/repo/pers/liuchengyin/logback-desensitization/1.0.0

Github地址:

https://github.com/liuchengyin01/LogbackDesensitization

Jar包打入Maven本地仓库的方式

1、下载Jar包,放在一个文件夹里

2、在这个文件夹里打开cmd(打开cmd,进入到这个文件夹)

3、执行命令(前提保证maven配置正常,使用mvn -v命令查看是否正常,如果显示版本号表示正常)

mvn install:install-file -DgroupId=pers.liuchengyin -DartifactId=logback-desensitization -Dversion=1.0.0 -Dpackaging=jar -Dfile=logback-desensitization-1.0.0.jar

命令说明:

-DgroupId
 表示jar对应的groupId  
 <groupId>pers.liuchengyin</groupId>
-DartifactId:
 表示jar对应的artifactId
 <artifactId>logback-desensitization</artifactId>
-Dversion
 表示jar对应的 version
 <version>1.0.0</version>
转自:https://blog.csdn.net/qq_40885085
往期热门文章:

1、线上MySQL的自增id用尽怎么办?被面试官干趴下了!
2、计算机专业会不会成为下一个土木?
3、xxl-job惊艳的设计,怎能叫人不爱
4、ArrayList#subList这四个坑,一不小心就中招
5、面试官:大量请求 Redis 不存在的数据,从而影响数据库,该如何解决?
6、MySQL 暴跌!
7、超越 Xshell!号称下一代 Terminal 终端神器,用完爱不释手!
8、IDEA 官宣全新默认 UI,太震撼了!!
9、让你直呼「卧槽」的 GitHub 项目!
10、Kafka又笨又重,为啥不选Redis?

浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报