desensitization

Introduction: 简单易用强大的 Java 数据脱敏库
More: Author   ReportBugs   
Tags:

基于 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

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools