自学内容网 自学内容网

数据脱敏-快速使用

1.数据脱敏定义

数据脱敏百度百科中是这样定义的: 数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。

因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信息,而用户信息里面就包括了一些敏感信息,所以就需要脱敏

使用场景:

此篇文章我们介绍如何使用Hutool工具类进行数据脱敏

2. Hutool 工具介绍

脱敏工具

https://doc.hutool.cn/pages/DesensitizedUtil/#%E4%BB%8B%E7%BB%8Dicon-default.png?t=O83Ahttps://doc.hutool.cn/pages/DesensitizedUtil/#%E4%BB%8B%E7%BB%8D

3.数据脱敏接入WMS项目

用户管理列表进行数据脱敏

4.业务接入

我们已经导入过hutool工具类,所以可以直接使用

使用工具类进行接入

5.SpringBoot使用注解方式接入

我们可以看到,上面的代码与业务进行耦合了

数据脱敏的操作就与业务进行耦合了,所以我们使用注解的方式,

我们针对hutool工具类进行封装

数据脱敏发生时间点:

脱敏发生的时间点就是我们真正要把这个对象写到网络中去,或者是写到磁盘里面去

也就是去进行序列化的时候,就会真正的进行脱敏的这个操作

注解代码:

import com.beiyou.config.SensitiveInfoSerializer;
import com.beiyou.enums.DesensitizationType;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveInfoSerializer.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Desensitization {

    DesensitizationType type() default DesensitizationType.DEFAULT;

    /**
     * 前置不需要打码的长度
     */
    int prefixLen() default 0;

    /**
     * 后置不需要打码的长度
     */
    int suffixLen() default 0;

    /**
     * 遮罩字符
     */
    String maskingChar() default "*";
}

Java

注解中

  • @JacksonAnnotationsInside:这是一个元注解,它告诉 Jackson 解析器,这个注解应该被视为 Jackson 的一部分,也就是说 Jackson 会处理带有此注解的字段。有效的 Jackson 注解,而不是一个普通的 Java 注解。

  • @JsonSerialize(using = SensitiveInfoSerializer.class):注解用于指定如何序列化一个字段或方法。它允许你指定一个自定义的序列化器类,Jackson 将使用这个类来序列化带有该注解的字段或方法返回的结果。

  • 与 Jackson 的集成:通过 @JsonSerialize(using = SensitiveInfoSerializer.class) 注解,你将 SensitiveInfoSerializer 与 Jackson 集成。当 Jackson 遇到带有 @Desensitization 注解的字段时,它会使用 SensitiveInfoSerializer 来序列化这些字段。

  • 当 Jackson 遇到带有 @Desensitization 注解的字段时,它会使用 SensitiveInfoSerializer 来序列化这些字段。

总结:

当你在一个字段上使用 @Desensitization 注解时,Jackson 会在序列化该字段时调用 SensitiveInfoSerializer 类来进行脱敏处理。

这样可以确保在输出 JSON 数据时,敏感信息会被适当的遮盖或替换。

脱敏类型

public enum DesensitizationType {

    // 自定义规则
    CUSTOMIZE_RULE, // 默认的
    DEFAULT, //用户id
    USER_ID, //中文名
    CHINESE_NAME, //身份证号
    ID_CARD, //座机号
    FIXED_PHONE, //手机号
    MOBILE_PHONE, //地址
    ADDRESS, //电子邮件
    EMAIL, //密码
    PASSWORD, //中国大陆车牌,包含普通车辆、新能源车辆
    CAR_LICENSE, //银行卡
    BANK_CARD
}
 

Java

序列化工具的代码:

import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.StrUtil;
import com.beiyou.annotation.Desensitization;
import com.beiyou.enums.DesensitizationType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;

import java.io.IOException;

/**
 * 数据脱敏序列化器
 *
 */
public class SensitiveInfoSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private boolean useMasking = false;
    private DesensitizationType type;
    private int prefixLen;
    private int suffixLen;
    private String maskingChar;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (useMasking && value != null) {
            switch (type) {
                case CUSTOMIZE_RULE:
                    gen.writeString(StrUtil.hide(value, prefixLen, suffixLen));
                    break;
                case DEFAULT:
                    gen.writeString(value);
                    break;
                case CHINESE_NAME:
                    gen.writeString(DesensitizedUtil.chineseName(value));
                    break;
                case ID_CARD:
                    gen.writeString(DesensitizedUtil.idCardNum(value, prefixLen, suffixLen));
                    break;
                case FIXED_PHONE:
                    gen.writeString(DesensitizedUtil.fixedPhone(value));
                    break;
                case MOBILE_PHONE:
                    gen.writeString(DesensitizedUtil.mobilePhone(value));
                    break;
                case ADDRESS:
                    gen.writeString(DesensitizedUtil.address(value, prefixLen));
                    break;
                case EMAIL:
                    gen.writeString(DesensitizedUtil.email(value));
                    break;
                case PASSWORD:
                    gen.writeString(DesensitizedUtil.password(value));
                    break;
                case CAR_LICENSE:
                    gen.writeString(DesensitizedUtil.carLicense(value));
                    break;
                case BANK_CARD:
                    gen.writeString(DesensitizedUtil.bankCard(value));
                    break;
                default:
                    gen.writeString(value);
            }
        } else {
            gen.writeString(value);
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
        if (property != null) {
            Desensitization desensitization = property.getAnnotation(Desensitization.class);
            if (desensitization != null) {
                this.type = desensitization.type();
                this.prefixLen = desensitization.prefixLen();
                this.suffixLen = desensitization.suffixLen();
                this.maskingChar = desensitization.maskingChar();
                useMasking = true;
            }
        }
        return this;
    }
}

Java

序列化器

JsonSerializer<T> 是 Jackson 提供的一个接口,用于自定义序列化逻辑。,用于定义如何将 Java 对象序列化为 JSON 格式的字符串。当 Jackson 需要将一个 Java 对象转换为 JSON 字符串时,它会调用实现了 JsonSerializer<T> 接口的类中的 serialize 方法。

总结

SensitiveInfoSerializer 类是专门为 Jackson 定制的,用于实现数据脱敏功能。

  • 当 Jackson 需要序列化一个带有 @Desensitization 注解的字段时,它会使用 SensitiveInfoSerializer 对该字段进行序列化。

  • 序列化器会根据注解中的规则和参数来决定如何脱敏该字段的内容。

  • 脱敏后的结果将被写入 JSON 数据中,从而保护了敏感信息不被泄露。

直接使用

就可以直接在类上面使用注解

6.Excel导出数据脱敏

excel数据导出脱敏,需要我们手动使用工具类去进行数据脱敏,在数据将进行序列化之前,将数据进行替换


原文地址:https://blog.csdn.net/zhzjn/article/details/142469588

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!