Skip to content

allurx/desensitization

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

desensitization

基于Java反射api、简单易用、支持任意数据结构的数据脱敏库,包含但不限于以下类型的数据脱敏

  • 邮箱
  • 手机号码
  • 中文名称
  • 身份证号码
  • 银行卡号码
  • 密码
  • 级联脱敏
  • 自定义注解脱敏

用法

JDK版本

desensitization是基于JDK21开发的,JDK1.8及以上版本请参考该使用指南

maven依赖

<dependency>
    <groupId>red.zyc</groupId>
    <artifactId>desensitization</artifactId>
    <version>3.0.0</version>
</dependency>

例子

对象域值脱敏

下面是一个Child类,其中包含了一些敏感数据字段以及一些嵌套的敏感数据字段

public class Child {

    @ChineseName
    public String name = "小明";

    @PhoneNumber
    public String phoneNumber = "19962000001";

    @Password
    public String password = "123456789";

    @Cascade
    public Father father;    

}

只需要在敏感数据字段上标记相应类型的敏感注解,例如@ChineseName@Password等注解, 如果这个数据字段是需要级联脱敏的对象,只需要在该字段上标注@Cascade注解, 最后调用以下方法即可擦除对象中的所有敏感信息并返回一个新的Child对象。

var child = Sensitive.desensitize(new Child());

值脱敏

可能你的敏感信息是一个字符串类型的值或者是一个CollectionArrayMap之类的值,同样擦除它们的敏感信息也很简单

void desensitize() {

    // String
    var v1 = Sensitive.desensitize("123456@qq.com", new AnnotatedTypeToken<@Email String>() {
    });
    assert "1*****@qq.com".equals(v1);

    // Collection
    var v2 = Sensitive.desensitize(Stream.of("123456@qq.com").collect(Collectors.toList()), new AnnotatedTypeToken<List<@Email String>>() {
    });
    v2.forEach(s -> {
        assert "1*****@qq.com".equals(s);
    });

    // Array
    var v3 = Sensitive.desensitize(new String[]{"123456@qq.com"}, new AnnotatedTypeToken<@Email String[]>() {
    });
    Arrays.stream(v3).forEach(s -> {
        assert "1*****@qq.com".equals(s);
    });

    // Map
    var v4 = Sensitive.desensitize(Stream.of("张三").collect(Collectors.toMap(s -> s, s -> "123456@qq.com")), new AnnotatedTypeToken<Map<@ChineseName String, @Email String>>() {
    });
    v4.forEach((s1, s2) -> {
        assert "张*".equals(s1);
        assert "1*****@qq.com".equals(s2);
    });
}

在上面的例子中我们只需要构造脱敏对象的AnnotatedTypeToken以便我们能够准确的捕获被脱敏对象的实际类型和相应的敏感注解。

原理

desensitization是基于annotation-parser库来解析任意数据结构中自定义敏感注解的,详细信息可以查看该工程介绍。

扩展

如果你的应用是基于spring-boot搭建的,并且你不想在代码中每次都手动调用脱敏方法对数据进行脱敏处理,那么desensitization-spring-boot 这个starter可能会对你有很大的帮助,详细信息可以查看该工程介绍。

License

Apache License 2.0