首页 > 编程语言 >java日志脱敏(密码/身份证/其他自定义等)logback

java日志脱敏(密码/身份证/其他自定义等)logback

时间:2023-08-01 18:12:34浏览次数:48  
标签:java String 自定义 matcher logMsg param PATTERN logback find

java日志脱敏(密码/身份证/其他自定义等) logback
原文链接:https://blog.csdn.net/weixin_39286166/article/details/126889660

一.脱敏规则类
 
import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**

  • 自定义日志脱敏类
  • @Author: zengt
  • @Date: 2022/9/8 17:22
    */
    public final class SensitiveLogDataConverter extends MessageConverter {
//银行卡正则匹配
private final static Pattern BANK_CARD_PATTERN = Pattern.compile("(\\D)([3-6]\\d{3})(\\d{8,12})(\\d{4})(\\D)", Pattern.CASE_INSENSITIVE);

//手机号正则匹配
private final static Pattern PHONE_PATTERN = Pattern.compile("(?<!\\d)(1\\d{10})(?!\\d)", Pattern.CASE_INSENSITIVE);

//身份证正则匹配
private final static Pattern ID_CARD_PATTERN = Pattern.compile("([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[\\dXx])|([1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})", Pattern.CASE_INSENSITIVE);

//姓名正则匹配
//姓名、realName 暂时不加密 -- luzy
private final static Pattern NAME_PATTERN = Pattern.compile("(userName|receiveName)(=|=\\[|\\\":\\\"|:|:|=')([\\u4e00-\\u9fa5]{1})([\\u4e00-\\u9fa5]{1,3})(\\]|\\\"|'|)", Pattern.CASE_INSENSITIVE);

//邮箱
private final static Pattern EMAIL_PATTERN = Pattern.compile("(\\w{1})(\\w*)(\\w{1})@(\\w+)(.com)", Pattern.CASE_INSENSITIVE);

//其他(密码/地址/卡号等)
//token暂时不加密 -- luzy
private final static Pattern OTHER_PATTERN = Pattern.compile("(appId|authCode|password|密码|验证码|地址|住址|address|cardNo|卡号|card|cardNumber|app_key|appkey|appSecret|app_secret)(=|=\\[|\\\":\\\"|:|:|=')(.*?)(?>(\\]|[^\\\\\"]\\\"|'))", Pattern.CASE_INSENSITIVE);

    @Override
    public String convert(ILoggingEvent event) {
        try {
            final Set<String> list;
            String logMsg = event.getFormattedMessage();
            list = validDate(logMsg);
            if (!CollectionUtils.isEmpty(list)) {
                for (String param : list) {
                    String convertMsg = logMsg;
                    logMsg = convertDate(convertMsg, param);
                }
            }
            return logMsg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.convert(event);
    }

    /**
     * 正则匹配是否包含脱敏数据
     */
    private static Set<String> validDate(String param) {
        Set<String> set = new HashSet<>();
        // 匹配手机号
        Matcher phoneMatcher = PHONE_PATTERN.matcher(param);
        while (phoneMatcher.find()) {
            set.add(phoneMatcher.group());
        }
        // 匹配身份证
        Matcher idCardMatcher = ID_CARD_PATTERN.matcher(param);
        while (idCardMatcher.find()) {
            set.add(idCardMatcher.group());
        }

        Matcher bankCardMatcher = BANK_CARD_PATTERN.matcher(param);
        while (bankCardMatcher.find()) {
            set.add(bankCardMatcher.group());
        }

        Matcher namePatternMatcher = NAME_PATTERN.matcher(param);
        while (namePatternMatcher.find()) {
            set.add(namePatternMatcher.group());
        }
        

        Matcher emailPatternMatcher = EMAIL_PATTERN.matcher(param);
        while (emailPatternMatcher.find()) {
            set.add(emailPatternMatcher.group());
        }

        Matcher otherPatternMatcher = OTHER_PATTERN.matcher(param);
        while (otherPatternMatcher.find()) {
            set.add(otherPatternMatcher.group());
        }
        return set;
    }


/**
 * 数据脱敏
 */
private static String convertDate(String logMsg, String param) {

    if (PHONE_PATTERN.matcher(param).find()) {
        return logMsg.replace(param, param.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
    } else if (ID_CARD_PATTERN.matcher(param).find()) {
        String replaceContext = param.replaceAll(param, StringUtils.left(param, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(param, 4), StringUtils.length(param), "*"), "******")));
        return logMsg.replace(param, replaceContext);
    } else if (BANK_CARD_PATTERN.matcher(param).find()) {
        String replaceContext = BANK_CARD_PATTERN.matcher(param).replaceAll("$1$2********$4$5");
        return logMsg.replace(param, replaceContext);
    } else if (NAME_PATTERN.matcher(param).find()) {
        String replaceContext = NAME_PATTERN.matcher(param).replaceAll("$1$2$3**$5");
        return logMsg.replace(param, replaceContext);
    } else if (EMAIL_PATTERN.matcher(param).find()) {
        String replaceContext = EMAIL_PATTERN.matcher(param).replaceAll("$1****$3@$4.com");
        return logMsg.replace(param, replaceContext);
    } else if (OTHER_PATTERN.matcher(param).find()) {
        String replaceMent = "$1$2********$4";
        String replaceContext = OTHER_PATTERN.matcher(param).replaceAll(replaceMent);
        return logMsg.replace(param, replaceContext);
    }
    return logMsg;
        }
}

二.logback指定脱敏覆盖类 

<!-- 指定脱敏类的位置 -->
<conversionRule conversionWord="msg" converterClass="cn.***.SensitiveLogDataConverter"/>

 

标签:java,String,自定义,matcher,logMsg,param,PATTERN,logback,find
From: https://www.cnblogs.com/sunny3158/p/17598687.html

相关文章

  • java中使用异步方式调用接口@Async
    @Async使用:1、首先在启动类上开启注解@EnableAsync2、然后需要异步操作的方法上加上@Async*/publicclassAsyncTest{@Asyncpublicvoidtest()throwsInterruptedException{//做处理Thread.sleep(1000);}/**如果需要返回值的话,通过AsyncResult进行封装*/@AsyncpublicF......
  • javascript按钮通过cookie限制60s后才可以点击
    javascript按钮通过cookie限制60s后才可以点击1️⃣首先创建一个html页面,放入一个按钮 2️⃣设置点击按钮的触发函数一般当点击按钮都会有一些业务需要,在需求结束后,触发saveCookie的方法 3️⃣saveCookie方法当点击查询按钮之后,触发saveCooike方法,按钮倒计时需要一个结束......
  • JavaIO流
    JavaIO流基础概念数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打......
  • 使用Java进行串口通信
    引言 由于java的平台无关特性使得串口编程很困难。因为串口需要一个与特定平台实现的标准的API,而这对于java来说很困难。不幸的是,Sun在java的串口通信上没有太多关注。Sun已经定义了一个叫做JavaComm的串口通信API,但它的实现却不是javaSE(标准版)的一部分。Sun只为少数java平台提......
  • 每个Java开发者都应该知道的5个JDK工具
    JDK是Java语言的软件开发工具包,没有它就无法编译Java程序。目前,有许许多多的JDK工具呈现在大家面前,但最常用的莫过于java.exe、javac.exe、jar等。除了这几个,还有哪些呢?本文作者Joe拥有多年的Java开发经验,其在博客上分享了一篇文章:5JDKToolsEveryJavaDeveloperShouldKnow,笔......
  • 计算机基础与JavaScript初识
    一:编程介绍编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.计算机程序:就是计算机所执行的一系列的指令集合,而程序全部都是用我们所掌握的语言来编写的,所以人们要控制计算机一定要通过计算机语言向计算机发出命令。从事编程的人员,就是程......
  • java jsch sftp 中文乱码解决方案
    不同jsch版本对比--->JavaSSH/Sftp库——JSch/SSHJ方案一:maven版本:<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>代码案例:packagecom.ch......
  • 从Java后端获取时间配置字符串,并在前端使用它来设置默认公布时间。
    <divclass="layui-inline"id="AItem"><labelclass="layui-form-labelsyn-form-item-require">公布时间:</label><divclass="layui-input-block">&......
  • 学习Java的第11天
    运算符算数运算符:+,-,*,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)条件运算符?:扩展赋值运算符:+=,-=,*=,/=packageoperator;publicclassDemo03{publicstaticv......
  • 学生信息管理小系统(Java)
    一、题目要求 需要实现对应的操作二、思路(1)先设计一个主菜单界面,用户可以选择对应的功能;(2)每个板块对应一个方法,实现具体的操作;(3)最后在main函数中使用switch方法根据用户的选择对应不同的结果;三、代码1importjava.util.ArrayList;2importjava.util.Scanner;3......