java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java脱敏组件

基于java实现一个脱敏组件

作者:allbs

这篇文章主要为大家详细介绍了如何基于java实现一个脱敏组件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

功能说明

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

使用示例

总共有四种使用场景:

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脱敏组件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文