当前位置:首页 > Java技术 > java 日志脱敏框架 sensitive,优雅的打印脱敏日志

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

2022年09月16日 14:22:03Java技术6

问题

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

github sensitive

项目介绍

日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。

本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发。

用户也可以基于自己的实际需要,自定义注解。

变更日志

日志脱敏

为了金融交易的安全性,国家强制规定对于以下信息是要日志脱敏的:

  1. 用户名
  2. 手机号
  3. 邮箱
  4. 银行卡号
  5. 密码

持久化加密

存储的时候上面的信息都需要加密,密码为不可逆加密,其他为可逆加密。

类似的功能有很多。不在本系统的解决范围内。

特性

  1. 基于注解的日志脱敏
  2. 可以自定义策略实现,策略生效条件
  3. 常见的脱敏内置方案
  4. 支持 jdk1.7+

快速开始

maven 导入

```<dependency> <groupId>com.github.houbb</groupId> <artifactId>sensitive</artifactId> <version>0.0.1</version> </dependency> ```

定义对象

  • User.java

我们对 password 使用脱敏,指定脱敏策略为 StrategyPassword。(直接返回 null)

public class User {

    @Sensitive(strategy = StrategyChineseName.class)
    private String username;
    
    @Sensitive(strategy = StrategyCardId.class)
    private String idCard;
    
    @Sensitive(strategy = StrategyPassword.class)
    private String password;
    
    @Sensitive(strategy = StrategyEmail.class)
    private String email;
    
    @Sensitive(strategy = StrategyPhone.class)
    private String phone;
    
    //Getter &amp; Setter
    //toString()
}
  • 测试
    @Test
    public void UserSensitiveTest() {
        User user = buildUser();
        System.out.println("脱敏前原始: " + user);
        User sensitiveUser = SensitiveUtil.desCopy(user);
        System.out.println("脱敏对象: " + sensitiveUser);
        System.out.println("脱敏后原始: " + user);
    }

    private User buildUser() {
        User user = new User();
        user.setUsername("脱敏君");
        user.setPassword("123456");
        user.setEmail("12345@qq.com");
        user.setIdCard("123456190001011234");
        user.setPhone("18888888888");
        return user;
    }
  • 输出信息如下

脱敏前原始: User{username='脱敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}
脱敏对象: User{username='脱*君', idCard='123456**********34', password='null', email='123**@qq.com', phone='188****8888'}
脱敏后原始: User{username='脱敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}

我们可以直接利用 sensitiveUser 去打印日志信息,而这个对象对于代码其他流程不影响,我们依然可以使用原来的 user 对象。

自定义脱敏策略生效的场景

默认情况下,我们指定的场景都是生效的。

但是你可能需要有些情况下不进行脱敏,比如有些用户密码为 123456,你觉得这种用户不脱敏也罢。

  • UserPasswordCondition.java
@Sensitive(condition = ConditionFooPassword.class, strategy = StrategyPassword.class)
private String password;

其他保持不变,我们指定了一个 condition,实现如下:

  • ConditionFooPassword.java
public class ConditionFooPassword implements ICondition {
    @Override
    public boolean valid(IContext context) {
        try {
            Field field = context.getCurrentField();
            final Object currentObj = context.getCurrentObject();
            final String password = (String) field.get(currentObj);
            return !password.equals("123456");
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

也就是只有当密码不是 123456 时密码脱敏策略才会生效。

针对单个字段

上面的例子是基于注解式的编程,如果你只是单个字段。比如

  • singleSensitiveTest
@Test
public void singleSensitiveTest() {
    final String email = "123456@qq.com";
    IStrategy strategy = new StrategyEmail();
    final String emailSensitive = (String) strategy.des(email, null);
    System.out.println("脱敏后的邮箱:" + emailSensitive);
}
  • 日志信息

脱敏后的邮箱:123***@qq.com

待优化的地方

全新对象创建

这种方式为了避免修改原始对象,创建了一个全新的对象,有点点浪费,可以优化。

其他方法

可以基于 log4j2/logback 等转换器进行敏感信息的脱敏,但是不具有不同的 log 框架的可移植性。

来源:https://segmentfault.com/a/1190000017742745

作者:lovollll
来源链接:https://www.cnblogs.com/lovellll/p/10225585.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42053.html

标签: 日志框架
分享给朋友:

“java 日志脱敏框架 sensitive,优雅的打印脱敏日志” 的相关文章

[springboot]Slf4j日志框架的体系结构

文章目录 一、五花八门的日志工具包 1.1. 日志框架 1.2.日志门面 1.3日志门面存在的意义...

Logback日志框架

Logback日志框架

1 简介 logback官方文档 在实际项目开发中,日志框架是不可避免的。目前常用的日志框架包括log4j和logback等。 该文章将选取logback作为日志框架讲解。logback提供的日志功能主要有两个方面: 通过logbac...

slf4j-api、slf4j-log4j12以及log4j之间什么关系?

slf4j-api、slf4j-log4j12以及log4j之间什么关系?

几乎在每个jar包里都可以看到log4j的身影,在多个子工程构成项目中,slf4j相关的冲突时不时就跳出来让你不爽,那么slf4j-api、slf4j-log4j12还有log4j他们是什么关系?我把自己了解的和大家简单分享一下:     slf4j:Simp...

( 十三 ) SpringBoot 【日志一】统一日志框架

( 十三 ) SpringBoot 【日志一】统一日志框架

( 十三 ) SpringBoot 【日志一】统一日志框架 ( 十三 ) SpringBoot 【日志一】统一日志框架     1、简介       在项目开发中,日志十分的重要,不管是记录运行...

Spring Boot学习记录(四、日志文件)

市面上的日志框架: JUL、JCL、Jboss-logging、logback、log4j,log4j2、slf4j……   日志门面(日志抽象层) 日志实现 JCL(Ja...

日志技术及JUL入门

日志技术及JUL入门

1. 日志的概念 1.1 日志文件日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。记录是保持日志...

大明对日志的经验总结

前言 说一个自己经历过的事情,有一次我在开发一个通过csv文件批量导入交易的job的时候,在UAT环境上进行性能测试,发现执行失败了。通过查看日志发现,机器空间不足了,df -h一看发现32G的机器只有20k的空间,然后一看日志文件的大小,就占了20G。日志这东西,不能记得太多,...

01、ELK日志收集平台简介

01、ELK日志收集平台简介

  作为运维工程师,我们每天需要对服务器进行故障排除,那么最先能帮助我们定位问题的就是查看服务器日志,通过日志可以快速的定位问题。   目前我们说的日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原...

Java 应用代码中异常打印 e.printStackTrace();

在Java开发中,无论是运行还是调试,一般都会对异常进行处理,一则明确问题出在哪个地方,一则也是代码完整性的一部分。谈到log日志,小编建议初学java的朋友使用框架集成的log4j、logback这类统一打印日志,尽量不使用catch的e.printStackTrace(),为什么呢...

java日志框架系列(8):logback框架PatternLayout详解

java日志框架系列(8):logback框架PatternLayout详解

当你想要将记录以你想要的的格式写到目的地时,那么你就需要了解如何设置自定义的格式了。 1.PatternLayout 转换模式:由文本文字和格式转换符组成。   下面了解一下格式转换符与格式修饰符表示的意义:  &nbs...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。