1.数据脱敏定义
数据脱敏百度百科中是这样定义的: 数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。
因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信息,而用户信息里面就包括了一些敏感信息,所以就需要脱敏
使用场景:
此篇文章我们介绍如何使用Hutool工具类进行数据脱敏
2. Hutool 工具介绍
脱敏工具
https://doc.hutool.cn/pages/DesensitizedUtil/#%E4%BB%8B%E7%BB%8Dhttps://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, //用户idUSER_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;@Overridepublic 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);}}@Overridepublic 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数据导出脱敏,需要我们手动使用工具类去进行数据脱敏,在数据将进行序列化之前,将数据进行替换