java打印日志时,如何对字段进行脱敏?

2023-11-07

在我们开发项目的时候,有些字段比较敏感,比如用户信息,这就需要在打印日志的时候对相关字段脱敏处理,本文提供的脱敏方案是使用conversionRule标签的方式,通过继承MessageConverter,在打印日志的时候对相关字段进行脱敏。
第一步,创建类继承MessageConverter,重写convert方法,如下:

public class SensitiveMessageConverter extends MessageConverter {
    /**
     * 正则匹配模式 
     */
    public static final Pattern REGEX_PATTERN = Pattern.compile("\\s*([\"]?[\\w]+[\"]?)(\\s*[:=]+[^\\u4e00-\\u9fa5@,.*{\\[\\w]*\\s*)([\\u4e00-\\u9fa5_\\-@.\\w]+)[\\W&&[^\\-@.]]?\\s*");

    @Override
    public String convert(ILoggingEvent event) {
        // 获取原始日志
        String formattedMessage = event.getFormattedMessage();
        return doConvert(formattedMessage);
    }

    private String doConvert(String formattedMessage) {
        if (StringUtils.isBlank(formattedMessage)) return formattedMessage;
        // 获取是否脱敏开关,可分环境配置是否开启
        Boolean convertSwitch = ApolloPropertyUtil.getBooleanProperty("log.sensitive.convert.switch", true);
        // 获取需要脱敏的字段。配置模板(key为脱敏模式,value为脱敏字段,可以有多个,other不脱敏):
        // {"name":["name","userName"],"mobilePhone":["phone"],"password":["password"],"idCard":["idcard"],"email":["email"],"other":["address"]}
        JSONObject jsonObject = ApolloPropertyUtil.getJSONObjectProperty("log.sensitive.convert.fields", "");
        // 是否开启脱敏开关
        if (!convertSwitch) return formattedMessage;
        if (Objects.isNull(jsonObject)) return formattedMessage;
        Matcher matcher = REGEX_PATTERN.matcher(formattedMessage);
        while (matcher.find()) {
            // 字段
            String key = matcher.group(1);
            key = key.replaceAll("\"", "");
            // 字段值
            String value = matcher.group(3);
            String mode = "";
            Iterator<String> iterator = jsonObject.keySet().iterator();
            while (iterator.hasNext()) {
                String next = iterator.next();
                List<String> list = (List<String>) jsonObject.get(next);
                if (list.contains(key)) {
                    // 命中当前属性属于哪一种脱敏模式(只能命中一种),目前支持 phone、password、idcard、other
                    mode = next;
                    break;
                }
            }
            // 没有命中脱敏模式,或者属性值为空,或者属性值为”null“,直接返回
            if (StringUtils.isAnyBlank(value, mode) || "null".equals(value)) continue;
            String afterValue = desensitize(mode, value);
            String origin = matcher.group(1) + matcher.group(2) + matcher.group(3);
            formattedMessage = formattedMessage.replace(origin, matcher.group(1) + matcher.group(2) + afterValue);
        }
        return formattedMessage;
    }

    /**
     * 脱敏
     *
     * @param mode 脱敏模式
     * @param value 脱敏的内容
     * @return 脱敏后的内容
     */
    private String desensitize(String mode, String value) {
        SensitiveModeEnum sensitiveModeEnum = SensitiveModeEnum.get(mode);
        // 获取不到相关脱敏模式,暂不支持,返回原日志
        if (Objects.isNull(sensitiveModeEnum)) return value;
        char[] chars = value.toCharArray();
        // 具体模式的策略可以再扩展(比如可以支持指定下标范围,指定正则,指定符号前面几位或者后面几位脱敏等等),这里暂不展开
        switch (sensitiveModeEnum) {
            case NAME:
                chars[0] = '*';
                break;
            case MOBILE_PHONE:
                for (int i = 3; i < 7; i++) {
                    chars[i] = '*';
                }
                break;
            case TELEPHONE:
                for (int i = 3; i < 5; i++) {
                    chars[i] = '*';
                }
                break;
            case ID_CARD:
                for (int i = 9; i < 13; i++) {
                    chars[i] = '*';
                }
                break;
            case PASSWORD:
                Arrays.fill(chars, '*');
                break;
            case EMAIL:
                for (int i = 3; i < 6; i++) {
                    chars[i] = '*';
                }
                break;
            case OTHER:
                break;
        }
        return new String(chars);
    }
}

第二步,在logback.xml中增加 conversionRule 标签

conversionWord是输入的日志信息,converterClass对应上面增加的类

<conversionRule conversionWord="msg" converterClass="xxx.xxx.log.SensitiveMessageConverter"/>

测试

@Test
    public void test() {
        HashMap<Object, Object> map = new HashMap<>();
        Map<String, String> map1 = new HashMap<>();
        map1.put("email", "1234567@qq.com");
        map1.put("address", "上海市详细地址");
        map.put("name", "张三分");
        map.put("sendPhone", "18912430987");
        map.put("password", "123456");
        map.put("detail", map1);
        log.info("结果:{}", JSON.toJSONString(map));
}

结果:

结果:{"password":"******","name":"*三分","sendPhone":"189****0987","detail":{"address":"上海市详细地址","email":"123***7@qq.com"}} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java打印日志时,如何对字段进行脱敏? 的相关文章

  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 尝试进行输出

    今天心看到的概念 学习 认知 我对这个观念有点疑问 不如说 学习和认知有很大练习 可以说我认为 学习是认知的一部分 因此 想要提高学习能力 就可以从提高认知能力入手 所以我去查了一下认知方面的书 把 认知天性 加入到了我的kindle里 费
  • 基于 OpenVINO™ 的 AI 视觉应用基础课学习笔记(一)人工智能发展

    第一讲是概述性的内容 人工智能发展 人工智能概述 人工智能 让机器的行为看起来就像是人所表现出的智能行为一样 图灵测试 一个人在不接触对方的情况下 通过一种特殊的方式 和对方进行一系列的问答 如果在相当长的时间里 他无法根据这些问题判断对方
  • R语言和医学统计学(10):正态性和方差齐性检验

    本文首发于公众号 医学和生信笔记 完美观看体验请至公众号查看本文 医学和生信笔记 专注R语言在临床医学中的使用 R语言数据分析和可视化 文章目录 前言 正态性检验 shapiro wilk检验 kolmogorov smimov检验 方差齐
  • 使用kali破解win7密码

    虚拟机密码忘了 修改启动顺序为CD 设置虚拟机光盘镜像为kali ISO 这里用的是kali 2017 2 开启按f2进入kali live 模式 fdisk l 查看磁盘分区 找到win7虚拟机所使用的磁盘 mount dev sda1
  • 以前的windows安装文件可以删除吗_C盘里的文件夹都有何用?可以删除吗?哪些可以删除?...

    众所周知 C盘里的文件不能随意动 特别重要 那么打开C盘 我们可以在根目录下看到一些特定的文件夹 这些文件夹是干嘛用的呢 里面放着什么东西 哪些可以删除呢 今天蝈蝈就来给大家谈谈这个问题 以下是文件夹名及其介绍 不同系统 不同用户C盘里的文
  • 初识冯诺依曼体系结构

    目录 1 冯诺依曼体系结构 2 冯诺依曼体系的原理 3 数据流向 4 冯诺依曼体系的意义 1 冯诺依曼体系结构 我们常见的计算机 如笔记本 我们不常见的计算机 如服务器 大部分都遵守冯诺依曼体系 1 输入单元 包括键盘 鼠标 扫描仪 写板等
  • .NET混淆器Dotfuscator怎样利用切除和水印保护应用程序?

    Dotfuscator是一个 NET的Obfuscator 它提供企业级的应用程序保护 大大降低了盗版 知识产权盗窃和篡改的风险 Dotfuscator的分层混淆 加密 水印 自动失效 防调试 防篡改 报警和防御技术 为世界各地成千上万的应
  • Html小知识点和sublime部分用法

    主要的开发工具 chrome sublime photoshop 二 web标准有三个标准组成 1 结构标准 结构用于对网页元素进行整理和分类 我们主要学的是HTML 2 表现标准 表现用于设置网页的版式 颜色 大小等外观样式 主要指的是c
  • metaq/rocketmq入门学习

    MetaQ是一款分布式 队列模型的消息中间件 基于发布订阅模式 有Push和Pull两种消费方式 支持严格的消息顺序 亿级别的堆积能力 支持消息回溯和多个维度的消息查询 metaq是rocketmq的开源版本 rocketmq的一些文档 h
  • 创建QT项目

    经过了令人苦恼的版本选择 然后又经历了IDE熟悉以及纯C 应用的创建 接下来终于进入了激动人心的时刻 开启第一个QT项目 使用创建向导创建QT项目 文件 gt 新建文件或项目 选择应用 窗口应用 根据自己的实际情况 配置项目名称和项目保存的
  • 画流程图都可以用哪些工具?

    在日常生活中 我相信我们很多人都看到过流程图 对于设计师来说 它还需要涉及流程图来反映用户的旅程和交互方式 那么你知道哪些流行的流程图设计软件呢 作为高级设计师 我今天推荐10款流程图设计软件 你可以和我一起读这篇文章 即时设计 即时设计是
  • uni-app 从零开始第三章:底部 tabBar

    pages json 页面路由 uni app官网 一 新建 home页面 找到pages目录 新增一个home的页面 勾选上同时新建文件夹 新建完成后 pages json 中 会自动添加上刚刚新建的文件信息 二 新增tabBar数据 在
  • Seaborn做图系列①——直方图&箱型图&散点图&变量关系图&回归图&热力图&条形图

    数据可视化系列汇总 Matplotlib可视化 二维图表绘制 折线图 直方图 散点图 条形图 箱形图 Matplotlib可视化 3D绘制散点图 曲面图 折线图 等高线图 Excel数据分析高级技巧 动态图表制作 offset vlooku
  • 26_Java判断String是否以某个字符串开头或结尾

    Java判断String是否以某个字符串开头 String mobile 8618730600000 System out println mobile startsWith 86 输出true System out println mob
  • VSCode+PHPstudy配置PHP开发环境

    第一步 下载安装VSCode编辑器 第二步 下载安装PHPstudy集成环境 第三步 打开PHPstudy 选择界面左侧中的环境 第四步 点击右侧PHP运行环境下面的更多 选择适合的PHP版本 第五步 点击PHPstudy左侧环境 再点击右
  • 基于 Docker 来安装 FastDFS

    文章目录 百度百科 FastDFS 简介 FastDFS 存储策略 上传交互过程 下载交互过程 FastDFS的文件同步 FastDFS 为什么要结合 Nginx 其他资源 FastDFS 安装 环境准备 创建工作目录 docker com
  • Qt 自定义颜色下拉控件

    效果 其实 在这里之前看了许多自定义颜色控件 有的是采用继承QPushButton 点击后 直接弹出 QColorDialog 然后重写 paintEvent 函数 绘制背景为选中的颜色 但是 没有下拉选择颜色的感觉 也有的继承 QComb
  • 微信小程序实战之实现富文本编辑器

    前言 这是我参加掘金启航计划的第三篇文章 这次总结的是实现一个简单的富文本编辑器 相信阅读文章后 观众老爷们 能够实现富文本编辑器 在微信小程序中发布自己的文章 希望观众老爷们多多支持 1 实现效果 实现的效果如下图 1 文本加粗 斜体 下
  • AIX 6.1环境 yum的安装方法

    smit使用方法介绍 因为后面会用到 所以先介绍一下smit的使用方法 输入smitty installp或smitty install 选择Install and Update Software 选择Install Software 在I
  • java打印日志时,如何对字段进行脱敏?

    在我们开发项目的时候 有些字段比较敏感 比如用户信息 这就需要在打印日志的时候对相关字段脱敏处理 本文提供的脱敏方案是使用conversionRule标签的方式 通过继承MessageConverter 在打印日志的时候对相关字段进行脱敏