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, //用户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数据导出脱敏,需要我们手动使用工具类去进行数据脱敏,在数据将进行序列化之前,将数据进行替换