基于 log4j2 插件实现统一日志脱敏,性能远超正则替换

news2024/12/27 15:15:07

前言

金融用户敏感数据如何优雅地实现脱敏?

日志脱敏之后,无法根据信息快速定位怎么办?

经过了这两篇文章之后,我们对日志脱敏应该有了一定的理解。

但是实际项目中,我们遇到的情况往往更加复杂:

1)项目的 java bean 定义不规范,大量接口使用 map。

2)历史项目众多,改造成本巨大。

种种原因,导致使用注解的方式耗费大量的时间。但是一般给我们改造的时间是有限的。

那么,有没有一种方法可以统一对敏感信息进行脱敏处理呢?

答案是有的,我们可以基于 log4j2 实现自己的脱敏策略,统一实现日志的脱敏。

在这里插入图片描述

log4j2 Rewrite

我们可以基于 log4j2 RewritePolicy 统一使用脱敏策略。

本项目自 V1.2.0 添加对应支持,后续将提升对应的可拓展性。

说明:如果使用 slf4j 接口,实现为 log4j2 时也是支持的。

使用入门

maven 引入

引入核心脱敏包。

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-log4j2</artifactId>
    <version>1.2.1</version>
</dependency>

其他的一般项目中也有,如 log4j2 包:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
</dependency>

log4j2.xml 配置

例子如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages = "com.github.houbb.sensitive.log4j2.rewrite">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
        </Console>
        <Rewrite name="rewrite">
            <AppenderRef ref="Console"/>
            <SensitiveRewritePolicy/>
        </Rewrite>
    </Appenders>
    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="rewrite" />
        </Root>
    </Loggers>
</Configuration>

几个步骤:

  1. 指定 package 为 packages = "com.github.houbb.sensitive.log4j2.rewrite"

  2. 按照 log4j2 Rewrite 规范,指定重写策略为 SensitiveRewritePolicy

  3. 输出时,直接指定为对应的重写之后的结果 <AppenderRef ref="rewrite" />

测试

正常的日志打印:

private static final String TEST_LOG = "mobile:13088887777; bankCard:6217004470007335024, email:mahuateng@qq.com, amount:123.00, " +
        "IdNo:340110199801016666, name1:李明, name2:李晓明, name3:李泽明天, name4:山东小栗旬" +
        ", birthday:20220517, GPS:120.882222, IPV4:127.0.0.1, address:中国上海市徐汇区888号;";

logger.info(TEST_LOG);

自动脱敏效果如下:

mobile:130****7777|9FC4D36D63D2B6DC5AE1297544FBC5A2; bankCard:6217***********5024|444F49289B30944AB8C6C856AEA21180, email:mahu*****@qq.com|897915594C94D981BA86C9E83ADD449C, amount:123.00, IdNo:3****************6|F9F05E4ABB3591FC8EA481E8DE1FA4D6, name1:李*|15095D14367F7F02655030D498A4BA03, name2:李**|035E3C0D1A0410367FE6EB8335B2BFDE, name3:李泽**|B87138E5E80AEC87D2581A25CAA3809D, name4:山东***|6F2178D34BC7DD0A07936B5AFF39A16F, birthday:********|1F88D983FAFC50022651122B42F084A0, GPS:**********|E281A9A52DE915154285148D68872CA2, IPV4:127******|F528764D624DB129B32C21FBCA0CB8D6, address:中国上海市徐******|821A601949B1BD18DCBAAE27F2E27147;

ps: 这里是为了演示各种效果,实际默认对应为 1,2,3,4 这几种策略。

log4j2 配置定制化

为了满足各种用户的场景,在 V1.2.1 引入了 SensitiveRewritePolicy 策略的可配置化。

默认配置

log4j2 配置中,SensitiveRewritePolicy 配置默认等价于

<SensitiveRewritePolicy
        prefix=":=&apos;&quot;"
        scanList = "1,2,3,4"
        replaceList = "1,2,3,4"
        defaultReplace = "12"
        replaceHash = "md5"
/>

属性说明

SensitiveRewritePolicy 策略的属性说明。

属性说明默认值备注
prefix需要脱敏信息的匹配前缀:='"降低误判率
replaceHash哈希策略模式md5支持 md5/none 两种模式
scanList敏感扫描策略列表1,2,3,41~10 内置的10种敏感信息扫描策略,多个用逗号隔开
replaceList敏感替换策略列表1,2,3,41~10 内置的10种敏感信息替换策略,多个用逗号隔开
defaultReplace敏感替换默认策略121~13 内置的13种敏感信息替换策略,指定一个。当列表没有匹配时,默认使用这个

其中 1-13 的内置策略说明如下:

策略标识说明
1手机号
2身份证
3银行卡
4邮箱
5中国人名
6出生日期
7GPS
8IPV4
9地址
10护照
11匹配任意不掩盖
12匹配任意半掩盖
13匹配任意全掩盖

不足之处

这里的策略自定义和 log4j2 的插件化比起来,确实算不上强大,但是可以满足 99% 的脱敏场景。

后续有时间考虑类似 log4j2 的 plugins 思想,实现更加灵活的自定义策略。

性能

正则的替换可能会导致 cpu 飙升等问题,替换的策略也有限制。

实现的底层不是基于正则的,性能要远高于正则,大概是 2 倍左右,符合企业级应用性能。

后续将添加对应的 benchmark。

开源地址

为了便于大家学习,项目已开源

https://github.com/houbb/sensitive

小结

实际项目中,建议二者结合使用。

基于 log4j2 的方式统一处理非常方便,但是是性能和准确性要有一定的折中。

如果是新项目,建议使用注解的方式,通过日志标准规范开发,后续拓展性也更加灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发云原生应用应遵循的十二要素

代码库&#xff1a;一份版本控制下的基准代码库&#xff0c;多份部署 应用程序的源代码仓库应该只包含一个应用程序&#xff0c;并列出它所依赖的资源清单。对于不同的环境&#xff0c;我们应该不需要重新编译或打包应用程序。每个环境中特有的设置应该与代码无关 依赖&#…

SpringMVC-【回顾】

回顾MVC架构 什么是mvc&#xff1a;模型、视图、控制器 -----软件设计规范 回顾servlet maven项目导入依赖&#xff08;webmvc,servlet-api,jsp-api,jstl,junit&#xff09;创建子模块&#xff0c;在子模块中添加框架支持&#xff08;在子模块中导入依赖jsp、servlet【因为父…

【NACK】视频rtp包接收及nack触发流程走读

这里大神分析很很透彻了:原文地址:WebRTC中NACK的处理流程 - 资料 - 音视频开发中文网 - 构建全国最权威的音视频技术交流分享论坛视频包的接收 RtpVideoStreamReceiver::ReceivePacket void RtpVideoStreamReceiver::ReceivePacket(const RtpPacketReceived& packet)知乎…

聊聊哪些奇葩的代码规范 —— 代码放一行

因为有些要求感觉实是太过奇葩&#xff0c;收集下来娱乐下大家。 代码规范要求 要求代码必须要放在一行上面&#xff0c;导致代码上面有不少行甚至超过了 1000 个字符。 规范解读 就是有时候代码过长&#xff0c;我们会折行增加可读性&#xff0c;最简单的一个例子就是 obj…

CG平台实验——逻辑回归

文章目录 练习2&#xff1a;逻辑回归介绍1 Logistic回归1.1 数据可视化1.2 实现1.2.1 Sigmoid函数1.2.2 代价函数和梯度1.2.2.1 代价函数1.2.2.2 梯度下降 1.2.3 寻找最优参数1.2.4 评估逻辑回归 2 正则化逻辑回归2.1 数据可视化2.2 特征映射2.3 代价函数和梯度 2.4 寻找最优参…

rust疑难进阶手册(1)-安装和管理,类型推断,打印输出(1)

目录 安装管理和配置工具项目管理类型推断格式输出位置参数格式化文本命名参数安装 不管OS是否带有rust,都应使用rustup来安装rust linux/freebsdcurl https://sh.rustup.rs -sSf | shwindows https://www.rust-lang.org/tools/install windows下建议使用GNU的编译链接库,不…

GraphQL入门实战

解决什么问题 根据请求控制返回结果 例如&#xff1a; 一个User对象&#xff0c;有id&#xff0c;name&#xff0c;mobile&#xff0c;email 有些接口只要返回id,name &#xff0c;有些接口还要要返回 mobile 适用场景 弱文档管理&#xff0c;公司对文档要求不高需求复杂变…

【JavaEE进阶】springBoot热部署、请求转发与重定向

目录 一、SpringBoot热部署 1.1热部署的步骤 1.1.1导入maven中央仓库的jar包 1.1.2开启项目自动编译 1.1.3启动项目 1.2热部署的原理 二、请求转发&重定向 2.1关键字不一样 2.2定义不同 请求转发(forward)&#xff1a; 请求重定向(redirect): 2.3数据共享不一样…

如何用MASM32开发Windows应用程序

提醒&#xff1a;以下内容仅做参考&#xff0c;可自行发散。在发布作品前&#xff0c;请把不需要的内容删掉。IT技术日异月异&#xff0c;无论是初学者还是有经验的专业人士&#xff0c;都需要与时俱进&#xff0c;不断学习新技术。在学习一门新的IT技术时&#xff0c;都需要采…

Github自定义个人首页

前言 GitHub 个人主页&#xff0c;官方称呼是 profile&#xff0c;是一个以 Markdown 脚本语言编写的个人 GitHub 展示主页面。Guthub 个人主页可以展示很多有用的信息&#xff0c;例如添加一个首页被访问次数的计数器&#xff0c;一个 Github 被 Star 与 Commit 的概览信息&a…

JVM-学习笔记

一 . JVM架构图 JVM是Java Virtual Machine的简称&#xff0c;意为Java虚拟机。JVM有很多种&#xff0c;使用最为广泛的JVM为HotSpot。 如上面架构图所示&#xff0c;JVM分为三个主要子系统&#xff1a; 类加载器子系统&#xff08;Class Loader Subsystem&#xff09; 运行…

Linux命令学习之cp和mv

cp man 1 cp可以看一下cp的帮助说明。 cp -r /learnwell/good/ /tmp把good目录复制到/tmp目录下&#xff0c;注意想要复制目录&#xff0c;一定要加上-r选项。 接下来学习复制文件&#xff0c;cp 源文件 目标目录&#xff08;相对路径方法&#xff09;或者是cp /源文件所在目…

华为OD机试题【IPv4地址转换成整数】【2023 B卷 100分】

文章目录 &#x1f3af; 前言&#x1f3af; 题目描述&#x1f3af; 解题思路示例 1示例 2&#x1f4d9; Python代码实现&#x1f4d7; Java代码实现&#x1f4d8; C语言代码实现 &#x1f3af; 前言 &#x1f3c6; 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为…

Spark安装和编程实践(Spark2.4.0)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装&#xff08;单机、伪分布&#xff09; Hadoop集群搭建 HBase2.2.2安装&#xff08;单机、伪分布&#xff09; Zookeeper集群搭建 HBase集群搭建 Spark安装和编程实践&#xff08;Spark2.4.0&#xff09; Spark集群搭建 文章目…

linux(信号产生的各种方式)

目录&#xff1a; 1.引入 2.介绍系统支持的信号列表 3.键盘方式产生信号 4.程序中存在异常问题&#xff0c;产生信号 5.系统调用产生信号 6.软件条件也能产生信号 7.任何理解OS给进程发送信号 1.引入 我怎么证明ctrlc是向指定进程发送了2号信号呢&#xff1f;&#xff1f; sig…

5万字大数据实验室建设方案能源大数据中心建设方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除篇幅有限&#xff0c;无法完全展示&#xff0c;喜欢资料可转发评论&#xff0c;私信了解更多信息。 大数据实验室建设方案 大数据实验室建设方案 目录 1概述 1.1建设背景 1.…

chatgpt赋能python:Python抓取数据:从入门到精通

Python抓取数据&#xff1a;从入门到精通 Python是当下最热门的编程语言之一&#xff0c;其强大的数据处理能力使得Python在数据抓取方面也越来越受欢迎。本文将从入门到精通介绍Python抓取数据的方法&#xff0c;希望对初学者有所帮助。 网络爬虫 网络爬虫是Python基于网络…

CG平台实验——线性回归

文章目录 练习1&#xff1a;线性回归介绍1 实现简单示例函数1.1 提交解决方案 2 单变量线性回归2.1 绘制数据2.2 梯度下降2.2.1 更新公式2.2.2 实现2.2.3 计算成本J(θ)2.2.4 梯度下降 2.3 可视化成本函数 选做练习3 多变量线性回归3.1 特征标准化3.2 梯度下降 练习1&#xff1…

chatgpt赋能python:Python在边框中写文字:优雅展示内容的方式

Python在边框中写文字&#xff1a;优雅展示内容的方式 当我们需要在网页上展示一些信息时&#xff0c;通常会使用边框来突出显示内容&#xff0c;然而&#xff0c;普通的边框可能会显得过于单调&#xff0c;缺少设计感&#xff0c;这时我们可以借助Python来实现一个功能强大的…

chatgpt赋能python:Python备份列表:从小白到大神,这里有你需要的一切

Python备份列表&#xff1a;从小白到大神&#xff0c;这里有你需要的一切 随着信息科技的发展&#xff0c;数字资料的价值越发具有现实意义&#xff0c;但是数据泄露、系统崩溃、病毒攻击、硬件故障等情况也时有发生。因此&#xff0c;对数据进行备份是非常必要的。Python作为…