基于java实现一个脱敏组件

 更新时间:2024年11月13日 08:20:08   作者:allbs  
这篇文章主要为大家详细介绍了如何基于java实现一个脱敏组件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

功能说明

因为最近有脱敏的需求,所以就趁着这个机会自己实现了一个。肯定还有不少开源库有这种功能,但是考虑到不一定满足自己的需要,所以就自己造了一个轮子自己用。主要功能包括

  • 接口返回内容的脱敏,包含json序列化方式和aop的两种实现。
  • json序列化方式只能用于接口数据返回,在程序内部和数据库并不脱敏。
  • aop的方式,在程序内部和接口数据返回时可以脱敏,但是数据库不脱敏,且速度是慢于序列化方式的。
  • 根据自己的需求来实现脱敏规则,比如有些人的手机号脱敏是中间四位,有些人又只保留初始和末尾一位。
  • 自定义脱敏字符,默认为*
  • 请求体数据自动过滤,比如你传向前端的数据是包含脱敏字符的,正常的做法是前端判断时候包含脱敏字符,如果包含则该字段不往后端传输。我这边实现的是,如果请求体传过来的数据内容跟改字段的脱敏规则一致则不接收该字段内容,不,准确的说是在接收该字段内容之前转为null。

使用示例

总共有四种使用场景:

1.作用与方法上的aop注解

@Desensitizes({@Desensitize(field = "username", exclude = true), @Desensitize(field = "phoneNumber", type = MobilePhoneDesensitizer.class), @Desensitize(field = "email", type = EmailDesensitizer.class, maskChar = "#")})  
@GetMapping("/testMethodAnno")  
public TestNoAnnoVO testMethodAnno() {  
    TestNoAnnoVO test = new TestNoAnnoVO();  
    test.setUsername("JohnDoe");  
    test.setPhoneNumber("13812345678");  
    test.setEmail("john.doe@example.com");  
    return test;  
}

@Data  
public class TestNoAnnoVO {  
  
    private String username;  
  
    private String phoneNumber;  
  
    private String email;  
}

输出内容为:

2.作用于实体字段的aop注解

@GetMapping("/testFieldAnno")  
public TestVO testFieldAnno() {  
    TestVO test = new TestVO();  
    test.setUsername("JohnDoe");  
    test.setPhoneNumber("13812345678");  
    test.setEmail("john.doe@example.com");  
    test.setIdCard("123456199001011234");  
    return test;  
}

public class TestVO {  
  
    @Desensitize(exclude = true)  
    private String username;  
  
    @Desensitize(type = MobilePhoneDesensitizer.class)  
    private String phoneNumber;  
  
    @Desensitize(type = EmailDesensitizer.class, maskChar = "#")  
    private String email;  
  
    @Desensitize(type = IDCardDesensitizer.class, maskChar = "%")  
    private String idCard;  
}

输出内容为:

3.序列化注解

@GetMapping("/testJsonAnno")  
public TestJsonVO testJsonAnno() {  
    TestJsonVO test = new TestJsonVO();  
    test.setUsername("JohnDoe");  
    test.setPhoneNumber("13812345678");  
    test.setEmail("j@example.com");  
    test.setIdCard("123456199001011234");  
    return test;  
}

@Data  
public class TestJsonVO {  
  
    @JsonDesensitize(exclude = true)  
    private String username;  
  
    @JsonDesensitize(type = MobilePhoneDesensitizer.class)  
    private String phoneNumber;  
  
    @JsonDesensitize(type = EmailDesensitizer.class, maskChar = "#")  
    private String email;  
  
    @JsonDesensitize(type = IDCardDesensitizer.class)  
    private String idCard;  
}

这个有些区别,如果设置了exclude为true,则直接将返回的该字段隐去。输出内容为:

最后就是基于@JsonDesensitize额外加了一个属性ignoreDesensitized,用于判断是否在接收数据时排除脱敏内容。

@PostMapping("testPut")  
public void testPut(@RequestBody TestDTO testDTO) {  
    log.info("接收到的数据内容为{}", testDTO.toString());  
}

@Data  
public class TestDTO {  
  
    @JsonDesensitize(exclude = true, ignoreDesensitized = true)  
    private String username;  
  
    @JsonDesensitize(type = MobilePhoneDesensitizer.class, ignoreDesensitized = true)  
    private String phoneNumber;  
  
    @JsonDesensitize(type = EmailDesensitizer.class, maskChar = "#", ignoreDesensitized = true)  
    private String email;  
  
    @JsonDesensitize(type = IDCardDesensitizer.class, ignoreDesensitized = true)  
    private String idCard;  
}

使用效果为:

这个是严格按照输出时的脱敏匹配的,比如输出时手机号脱敏内容为138****1234,那么136****4321则不会接收,正常没有*的手机号或者不符合该规则的比如13****51234这种也会被正常接收。当然这个规则是可以在项目中自定义的。

使用说明

项目地址

github.com/chenqi92/alltobs-desensitization-all 里面包含待引入的jar和demo,因为刚写完,简单测试了一下不排除有其他bug,有需要可以自己fork一下自己改。后续我会在项目中实际使用,如果发现有bug会不断更新,当然也欢迎提issuses。

引入jar

<dependency>  
    <groupId>com.alltobs</groupId>  
    <artifactId>alltobs-desensitization</artifactId>  
    <version>1.0.0</version>  
</dependency>

工具已经上传到了maven的中央仓库,国内的用户可能存在下载困难等问题,需要科学一下。使用国内的阿里等平台代理,以我以往经验同步过去起码要半个月把。

启用功能

启动类添加注解@EnableAllbsDesensitization

根据自己使用场景的需要、以及上述示例来选择性的添加注解

@Desensitize

@Desensitizes

@JsonDesensitize

自定义在项目中实现一个自己需要的脱敏方式

如果你不想用默认的脱敏方式,实际上我也没写几个,后续应该会接着加。 那么就在你的项目工程中自定义集成BaseDesensitizer类然后自己实现desensitizegetDesensitizedRegex方法即可。 这两个方法一个是用于脱敏规则,一个是用于接收数据时判断是否符合规则。 具体实现以身份证号为例:

package com.alltobs.alltobsdesensitizationdemo.desensitizer;  
  
import com.alltobs.desensitization.desensitizer.BaseDesensitizer;  
  
import java.util.regex.Pattern;  
  
/**  
 * 类 IDCardDesensitizer  
 * * @author ChenQi  
 * &#064;date 2024/11/11  
 */public class IDCardDesensitizer extends BaseDesensitizer {  
  
    @Override  
    public String desensitize(String value, String maskChar) {  
        if (value != null && (value.length() == 15 || value.length() == 18)) {  
            // 脱敏中间部分  
            int prefixLength = 6;  
            int suffixLength = 4;  
            int maskLength = value.length() - prefixLength - suffixLength;  
  
            String prefix = value.substring(0, prefixLength);  
            String suffix = value.substring(value.length() - suffixLength);  
            String maskedSection = maskChar.repeat(maskLength);  
            return prefix + maskedSection + suffix;  
        }  
        return value;  
    }  
  
    @Override  
    public String getDesensitizedRegex(String maskChar) {  
        String escapedMaskChar = Pattern.quote(maskChar);  
        // 身份证号可能是 15 位或 18 位,这里统一处理  
        String maskPattern = escapedMaskChar + "+";  
        return "^\\d{6}" + maskPattern + "\\d{4}$";  
    }  
}

以上就是基于java实现一个脱敏组件的详细内容,更多关于java脱敏组件的资料请关注脚本之家其它相关文章!

相关文章

  • JavaWeb中获取表单数据及乱码问题的解决方法

    JavaWeb中获取表单数据及乱码问题的解决方法

    这篇文章主要介绍了JavaWeb中获取表单数据及乱码问题的解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • idea启动命令过长的问题及解决

    idea启动命令过长的问题及解决

    当IDEA启动命令过长时,可以通过修改workspace.xml文件或调整启动类配置来解决,方案一是在.idea文件或项目目录中修改workspace.xml;方案二是通过运行配置(run->edit)来保存启动设置,这两种方法都可以有效缩短命令长度,解决启动错误
    2024-09-09
  • 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    下面小编就为大家带来一篇解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java对象序列化与反序列化原理解析

    java对象序列化与反序列化原理解析

    这篇文章主要介绍了java对象序列化与反序列化原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • rabbitmq basicReject/basicNack/basicRecover的区别及说明

    rabbitmq basicReject/basicNack/basicRecover的区别及说明

    这篇文章主要介绍了rabbitmq basicReject/basicNack/basicRecover的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空问题

    解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读

    这篇文章主要给大家介绍了关于如何解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • java基础之TreeMap实现类全面详解

    java基础之TreeMap实现类全面详解

    这篇文章主要为大家介绍了java基础之TreeMap实现类全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 详解Java线程池如何统计线程空闲时间

    详解Java线程池如何统计线程空闲时间

    这篇文章主要和大家分享一个面试题:Java线程池是怎么统计线程空闲时间?文中的示例代码讲解详细,对我们掌握Java有一定帮助,需要的可以参考一下
    2022-11-11
  • Java中checkbox实现跨页多选的方法

    Java中checkbox实现跨页多选的方法

    最近做了一个项目其中遇到这样的需求,要实现checkbox跨页多选功能,经过小编整理,顺利解决,今天小编给大家分享Java中checkbox实现跨页多选的方法,需要的的朋友参考下
    2017-01-01
  • 深入浅析JDK8新特性之Lambda表达式

    深入浅析JDK8新特性之Lambda表达式

    Lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。这篇文章主要介绍了JDK8新特性之Lambda表达式,非常不错感兴趣的朋友参考下吧
    2016-10-10

最新评论