logback-defender实现日志脱敏(代码片段)

justry_deng justry_deng     2022-12-15     152

关键词:

Gitee地址 https://gitee.com/JustryDeng/logback-defender


logback-defender

介绍

  logback-defender是一款基于logback实现的无侵入的日志脱敏工具框架,使用此框架,只需要简单的三步。

功能特性

  1. (默认提供)支持json脱敏器
  2. (默认提供)支持string脱敏器
  3. (默认提供)支持正则脱敏器
  4. 支持自定义脱敏器
  5. 支持通过插件实现局部自定义脱敏器(即:轻量的自定义脱敏器)

前置依赖

  • jdk8+
  • logback
  • spring-boot

使用步骤

  1. 引入依赖。
    <dependency>
        <groupId>com.idea-aedi</groupId>
        <artifactId>logback-defender</artifactId>
        <version>$version</version>
    </dependency>
    
  2. 配置application.yml。

    提示:这里只给出了最简单的配置示例,更灵活的用法、更多配置示例,详见下方脱敏配置说明。
    log:
      defender:
        enable: true # 启用logback-defender
        include-logger-prefix: com.ideaaedi.logback # 通过logger所属类的全类名前缀,指定脱敏范围(,多个实用逗号分割)
        opt: default_json # 指定脱敏器
        config-json:
          strategies: # 指定脱敏策略
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__ACCOUNT_NO: account,accountNo
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__EMAIL: email,mail,emailList
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__PHONE_NUMBER: phone,mobile,telphone
    
    
  3. 在logback配置文件(如:logback.xml)中,指定使用logback-defender转换器。示例如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true">
        <property name="logFilePositionDir" value="log"/>
        <property name="logFileName" value="log"/>
        <!--
            提示一: conversionWord的值对应占位符。 这里即: 对【%msg】代表的内容,使用converterClass进行消息转换。
            提示二: conversionRule标签的配置,最好不要太靠下, 否则conversionRule标签可能不会生效。
        -->
        <conversionRule conversionWord="msg" converterClass="com.ideaaedi.logback.defender.core.LogbackCoreConverter"/>
    
        <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
            ......
        </appender>
        
        ......
    
    </configuration>
    

脱敏配置说明

json脱敏器
  • 全量配置及说明

    ################################# 说明 #################################
    # 1.下述为全量配置示例说明,使用时按需配置即可                              #
    #######################################################################
    
    log:
      defender:
        enable: true # 启用脱敏器
        debug: true # 开启调试模式,(当脱敏器本身出现异常时,)以便打印错误日志
        include-logger-prefix: com.ideaaedi.logback.defender,aaa,bbb,ccc # 通过(logger所属类的全类名)前缀,定位要脱敏的日志
        exclude-logger-prefix: TmpApplication,xxx,yyy,zzz # 通过(logger所属类的全类名)前缀,指定不需要脱敏的日志
        opt: default_json # 脱敏模型,支持 default_json-基于json脱敏、default_string-基于字符串脱敏、default_regex-基于正则脱敏、custom-自定义脱敏器脱敏
        config-json: # 当基于default_json脱敏时,需配置strategies
          hit-string-value-is-json: true # 当k-v中v本身是字符串,但是长json样时,是否继续对长json样的字符串进行脱敏
          strategies: # 指定脱敏类别及该类别下的keys
            # 指定脱敏类别的方式,方式一[对枚举值]:  实现了DefenderStrategy接口的枚举类全类名__枚举item
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__ACCOUNT_NO: account,accountNo
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__EMAIL: email,mail,emailList
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__PHONE_NUMBER: phone,mobile,telphone
            # 指定脱敏类别的方式,方式二[对注册到spring中的bean]:  实现了DefenderStrategy并且注册到spring容器中的bean的name
            demoDefenderStrategy: name,chineseName,englishName
          # 短路插件机制:支持对部分日志定制化脱敏
          # 注: 比起自定义脱敏器,插件更轻量化
          # 注:若日志脱敏走了插件,那么是不会再走脱敏器的(详见AbstractLogbackMessageDefender#desensitize)
          short-circuit-plugins: pluginOne,pluginTwo #值为 实现了LogbackMessageDefender并且注册到spring容器中的bean的name
    
  • 其中,枚举策略实现示例:

    public enum SimpleDefenderStrategy implements DefenderStrategy 
    
        /** 姓名类脱敏策略 */
        NAME("name", 1, 1, '*'),
    
        /** 账号类脱敏策略 */
        ACCOUNT_NO("accountNo", 2, 2, '*'),
    
        /** 邮箱类脱敏策略 */
        EMAIL("email", 2, 7, '*'),
    
        /** 身份证号类脱敏策略 */
        ID_CARD("idCard", 6, 4, '*'),
    
        /** 手机号码类脱敏策略 */
        PHONE_NUMBER("phoneNumber", 3, 4, '*'),
    
        /** 住址类脱敏策略 */
        ADDRESS("address", 3, 4, '*');
    
        // 省略...
    
    
  • 其中,自定义脱敏策略demoDefenderStrategy的实现示例:

    @Component("demoDefenderStrategy")
    public class DemoDefenderStrategy implements DefenderStrategy
        @Override
        public String category() 
            return "name";
        
        
        @Override
        public int retainPrefixCount() 
            return 1;
        
        
        @Override
        public int retainSuffixCount() 
            return 1;
        
        
        @Override
        public char replaceChar() 
            return '$';
        
    
    
  • 其中,插件pluginOne实现示例:

     @Component
     public class PluginOne implements LogbackMessageDefender 
     
         public static final String HANDLE_BY_PLUGIN = "PluginOneAbc";
         
         @Override
         public boolean support(ILoggingEvent event) 
             return event.getMDCPropertyMap().containsKey(HANDLE_BY_PLUGIN);
         
         
         @Override
         public void desensitize(ILoggingEvent event, String message, StringBuilder buffer) 
             buffer.append("[O_O] ").append(event.getFormattedMessage()).append(" [O_O]");
         
     
    
string脱敏器
  • 全量配置及说明
    ################################# 说明 #################################
    # 1.下述为全量配置示例说明,使用时按需配置即可                              #
    #######################################################################
    
    log:
      defender:
        enable: true # 启用脱敏器
        debug: true # 开启调试模式,(当脱敏器本身出现异常时,)以便打印错误日志
        include-logger-prefix: com.ideaaedi.logback.defender,aaa,bbb,ccc # 通过(logger所属类的全类名)前缀,定位要脱敏的日志
        exclude-logger-prefix: TmpApplication,xxx,yyy,zzz # 通过(logger所属类的全类名)前缀,指定不需要脱敏的日志
        opt: default_string # 脱敏模型,支持 default_json-基于json脱敏、default_string-基于字符串脱敏、default_regex-基于正则脱敏、custom-自定义脱敏器脱敏
        config-string: # 当基于default_STRING脱敏时,需配置strategies
          compat-backslash: true # 是否兼容反斜杠 \\
          strategies: # 指定脱敏类别及该类别下的keys
            # 指定脱敏类别的方式,方式一[对枚举值]:  实现了DefenderStrategy接口的枚举类全类名__枚举item
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__ACCOUNT_NO: account,accountNo
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__EMAIL: email,mail,emailList
            com.ideaaedi.logback.defender.strategy.SimpleDefenderStrategy__PHONE_NUMBER: phone,mobile,telphone
            # 指定脱敏类别的方式,方式二[对注册到spring中的bean]:  实现了DefenderStrategy并且注册到spring容器中的bean的name
            demoDefenderStrategy: name,chineseName,englishName
          # 短路插件机制:支持对部分日志定制化脱敏
          # 注: 比起自定义脱敏器,插件更轻量化
          # 注:若日志脱敏走了插件,那么是不会再走脱敏器的(详见AbstractLogbackMessageDefender#desensitize)
          short-circuit-plugins: pluginOne,pluginTwo #值为 实现了LogbackMessageDefender并且注册到spring容器中的bean的name
          key-value-delimiter: COLON,EQUAL,ARROW # 指定key-value之间的连接符 可以从(:、=、->)这三个中选
    
  • 其中,枚举策略实现示例:同json脱敏器中的示例。
  • 其中,自定义脱敏策略demoDefenderStrategy的实现示例:同json脱敏器中的示例。
  • 其中,插件pluginOne实现示例:同json脱敏器中的示例。
正则脱敏器
  • 全量配置及说明

    ################################# 说明 #################################
    # 1.下述为全量配置示例说明,使用时按需配置即可                              #
    #######################################################################
    
    log:
      defender:
        enable: true # 启用脱敏器
        debug: true # 开启调试模式,(当脱敏器本身出现异常时,)以便打印错误日志
        include-logger-prefix: com.ideaaedi.logback.defender,aaa,bbb,ccc # 通过(logger所属类的全类名)前缀,定位要脱敏的日志
        exclude-logger-prefix: xxx,yyy,zzz # 通过(logger所属类的全类名)前缀,指定不需要脱敏的日志
        opt: default_regex # 脱敏模型,支持 default_json-基于json脱敏、default_string-基于字符串脱敏、default_regex-基于正则脱敏、custom-自定义脱敏器脱敏
        config-regex:
          strategyProvider: demoPatternStrategyProvider #值为 实现了RegexDefenderStrategyProvider并且注册到spring容器中的bean的name
          short-circuit-plugins: pluginOne,pluginTwo #值为 实现了LogbackMessageDefender并且注册到spring容器中的bean的name
    
  • 其中,strategyProvider的实现示例:

    @Component
    public class DemoPatternStrategyProvider implements RegexDefenderStrategyProvider 
            
        private static final Pattern ACCOUNT_PATTERN = Pattern.compile("account\\\\s*=\\\\s*[a-zA-Z0-9\\u4e00-\\u9fa5!@#$+%^&*()|:\\"?.<>/'\\\\\\\\\\\\-_`。;!]*");
            
        private static final Pattern EMAIL_PATTERN = Pattern.compile("mail\\\\s*=\\\\s*[a-zA-Z0-9\\u4e00-\\u9fa5!@#$+%^&*()|:\\"?.<>/'\\\\\\\\\\\\-_`。;!]*");
      
        private static final Pattern NAME_PATTERN = Pattern.compile("name\\\\s*=\\\\s*[a-zA-Z0-9\\u4e00-\\u9fa5!@#$+%^&*()|:\\"?.<>/'\\\\\\\\\\\\-_`。;!]*");
    
        @Override
        public Map<Pattern, DefenderStrategy> provideRegexStrategyMap() 
            Map<Pattern, DefenderStrategy> map = new HashMap<>(8);
            map.put(ACCOUNT_PATTERN, SimpleDefenderStrategy.ACCOUNT_NO);
            map.put(EMAIL_PATTERN, SimpleDefenderStrategy.EMAIL);
            map.put(NAME_PATTERN, SimpleDefenderStrategy.NAME);
            return map;
        
    
    
自定义脱敏器
  • 全量配置及说明

    ################################# 说明 #################################
    # 1.下述为全量配置示例说明,使用时按需配置即可                              #
    #######################################################################
    
    log:
      defender:
        enable: true # 启用脱敏器
        debug: true # 开启调试模式,(当脱敏器本身出现异常时,)以便打印错误日志
        include-logger-prefix: com.ideaaedi.logback.defender,aaa,bbb,ccc # 通过(logger所属类的全类名)前缀,定位要脱敏的日志
        exclude-logger-prefix: xxx,yyy,zzz # 通过(logger所属类的全类名)前缀,指定不需要脱敏的日志
        opt: custom # 脱敏模型,支持 default_json-基于json脱敏、default_string-基于字符串脱敏、default_regex-基于正则脱敏、custom-自定义脱敏器脱敏
        config-custom:
          bean: myLogbackMessageDefender #值为 实现了LogbackMessageDefender并且注册到spring容器中的bean的name
    
  • 其中,bean的实现示例:

    @Component
    public class MyLogbackMessageDefender implements LogbackMessageDefender 
        
        @Override
        public boolean support(ILoggingEvent event) 
            return true;
        
        
        @Override
        public void desensitize(ILoggingEvent event, String message, StringBuilder buffer) 
            String formattedMessage = event.getFormattedMessage();
            
            List<Character> list = new ArrayList<>(12);
            char[] chars = formattedMessage.toCharArray();
            for (char c : chars) 
                list.add(c);
            
            Collections.shuffle(list);
            
            for (int i = 0; i < list.size(); i++) 
                chars[i] = list.get(i);
            
            
            buffer.append(new String(chars));
        
    
    

java日志脱敏框架sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的支持

...,自定义注解。特性基于注解的日志脱敏可以自定义策略实现,策略生效条件常见的脱敏内置方案java深拷贝,且原始对象不用实现任何接口。快速开始maven导入<dependency><group 查看详情

springboot日志脱敏,3步搞定!soeasy~!(代码片段)

...blog.csdn.net/qq_40885085在我们写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具... 查看详情

java日志脱敏框架sensitive,优雅的打印脱敏日志

...感信息需要脱敏。项目开发过程中,每次处理敏感信息的日志问题感觉很麻烦,大部分都是用工具类单独处理,不利于以后统一管理,很不优雅。于是,就写了一个基于java注解的日志脱敏工具。githubsensitive项目介绍日志脱敏是... 查看详情

java日志脱敏框架sensitive,优雅的打印脱敏日志

...感信息需要脱敏。项目开发过程中,每次处理敏感信息的日志问题感觉很麻烦,大部分都是用工具类单独处理,不利于以后统一管理,很不优雅。于是,就写了一个基于java注解的日志脱敏工具。githubsensitive项目介绍日志脱敏是... 查看详情

这个开源组件太强了,仅需三步完成springboot日志脱敏

参考技术A在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具类,在打印日志的时... 查看详情

这个开源组件太强了,仅需三步完成springboot日志脱敏(代码片段)

...章及时了解前言在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具... 查看详情

java日志的数据脱敏

...非常耗时。)由1,2的利弊,肯定会选择1,然后考虑一种实现(在model层定义方法,获取它的一个复制类,复制类里面的信息都是脱敏的,日志输出时只输出复制对象),克服掉 查看详情

这个开源组件太强了,仅需三步完成springboot日志脱敏(代码片段)

...数据库知识前言在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具... 查看详情

一文玩转java日志数据脱敏(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇来源:blog.csdn.net/blue_driver/article/details/122025368自定义Layout编写log4j配置正则匹配说明注意事项脱敏测试许多系统为了安全需要对敏感信息(如手... 查看详情

如何优雅的实现数据脱敏(代码片段)

如何优雅的实现数据脱敏Jackson序列化中脱敏自定义脱敏序列化改造脱敏注解使用参考很多时候我们从ORM查询到的数据有其它逻辑要处理,比如根据电话号查询用户信息,你脱敏了就没有办法来处理该逻辑了。所以脱敏这... 查看详情

利用jackson序列化实现数据脱敏(代码片段)

...升开发效率形成统一有效的脱敏规则可基于重写默认脱敏实现的desensitize方法,实现可扩展、可自定义的个性化业务场景的脱敏需求3.主要实现3.1基于Jackson的自定义脱敏序列化实现StdSerializer:所有标准序列化程序所使用的基类,... 查看详情

java数据定义规则脱敏实现(代码片段)

步骤说明实现ContextualSerializer类重写createContextual方法一、ContextualSerializer类官方文档解读:接口ContextualSerializer<T>类型参数:T -用于上下文化的序列化器类型 公共接口ContextualSerializer<T>JsonSerializer可以实现的附加接口... 查看详情

java数据定义规则脱敏实现(代码片段)

步骤说明实现ContextualSerializer类重写createContextual方法一、ContextualSerializer类官方文档解读:接口ContextualSerializer<T>类型参数:T -用于上下文化的序列化器类型 公共接口ContextualSerializer<T>JsonSerializer可以实现的附加接口... 查看详情

[安全开发]敏感信息脱敏函数(代码片段)

...;是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集。敏感信息如身份证号、银行卡号、手机号等个... 查看详情

apifox学习笔记-后置操作-脱敏(代码片段)

Apifox学习笔记-后置操作-脱敏后置操作替换星号substr实现substring实现replace实现脱敏方案基础版本手动定位版本公共脚本-脱敏Util通用版公共脚本-脱敏-递归遍历所有key自定义脚本在浏览器控制台临时使用参考资料后置操作因为脱... 查看详情

基于shardingsphere,实现数据“一键脱敏”!(代码片段)

...、姓名、手机号码等,此类信息按照合规要求,通常需要实现加密存储以满足合规要求。痛点一:通常的解决方案是我们书写SQL的时候,把对应的加密字段手动进行加密再 查看详情

基于shardingsphere,实现数据“一键脱敏”!(代码片段)

...手机号码等,此类信息按照合规要求,通常需要实现加密存储以满足合规要求。痛点一 查看详情

java注解的字段脱敏处理(代码片段)

有这样一个场景,系统中可以出现敏感的数据,在打印日志的时候,我们并不希望打印出现,这样,我们使用自己定义注解,来解决这个问题。定义需要脱敏的字段规则。importjava.lang.reflect.Array;importjava.lang.reflect.Field;importjava.lang... 查看详情