数据脱敏技术

数据脱敏技术数据脱敏 DataMasking 是一种数据安全技术 旨在通过预先设定的规则和算法 对原始数据中包含的敏感信息进行变形处理 使得这些信息在非生产环境 例如开发 测试 分析或培训场景 中使用时 既

大家好,欢迎来到IT知识分享网。

数据脱敏

什么是数据脱敏

1.导入相关依赖
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.8.16</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--json模块--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency> 

2.创建注解Desensitization

package com.jyx.annotations; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.jyx.Serializer.DesensitizationSerialize; import com.jyx.emun.DesensitizationTypeEnum; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) //@Target用于限制自定义注解可以应用于哪些程序元素 // ElementType.FIELD:可以应用于字段、枚举常量声明。 @JacksonAnnotationsInside // 作用是将一组注解合并到一个新的注解中。当这个新注解被应用到类或字段上时,实际上相当于应用了它所包含的所有注解。 @JsonSerialize(using = DesensitizationSerialize.class) // 用于自定义 Java 对象如何序列化成 JSON 格式 public @interface Desensitization { 
    / * 脱敏数据类型,只要在CUSTOMER的时候,startInclude和endExclude生效 */ DesensitizationTypeEnum type() default DesensitizationTypeEnum.CUSTOMER; / * 开始位置(包含) */ int startInclude() default 0; / * 结束位置(不包含) */ int endExclude() default 0; } 

3.建立脱敏需要的枚举类

package com.jyx.emun; public enum DesensitizationTypeEnum { 
    // 自定义 CUSTOMER, // 用户id USER_ID, // 中文名 CHINESE_NAME, // 身份证号 ID_CARD, // 座机号 FIXED_PHONE, // 手机号 MOBILE_PHONE, // 地址 ADDRESS, // 电子邮件 EMAIL, // 密码 PASSWORD, // 中国大陆车牌,包含普通车辆、新能源车辆 CAR_LICENSE, // 银行卡 BANK_CARD } 

4.创建自定义的序列化脱敏类

package com.jyx.Serializer; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.DesensitizedUtil; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.jyx.annotations.Desensitization; import com.jyx.emun.DesensitizationTypeEnum; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.io.IOException; import java.util.Objects; @NoArgsConstructor @AllArgsConstructor public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer { 
    // 保存敏感信息处理规则的枚举 private DesensitizationTypeEnum type; private Integer startInclude; private Integer endExclude; // JsonGenerator 主要用于生成 JSON 数据并将其输出到各种类型的输出流 // serialize 方法本身并不直接提供数据脱敏功能,它主要是为了将表单数据转换为可传输的字符串格式 @Override public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { 
    switch (type) { 
    // 自定义 Java 对象如何序列化成 JSON 格式 // 自定义类型脱敏 case CUSTOMER: // 通过使用 CharSequenceUtil 类,开发者可以更加方便地进行字符串相关的编程工作,避免了重复编写基础的字符串处理逻辑 jsonGenerator.writeString(CharSequenceUtil.hide(str,startInclude,endExclude)); break; // userId脱敏 case USER_ID: jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId())); break; // 中文姓名脱敏 case CHINESE_NAME: jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str))); break; // 身份证脱敏 case ID_CARD: jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str), 1, 2)); break; // 固定电话脱敏 case FIXED_PHONE: jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str))); break; // 手机号脱敏 case MOBILE_PHONE: jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str))); break; // 地址脱敏 case ADDRESS: jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str), 8)); break; // 邮箱脱敏 case EMAIL: jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str))); break; // 密码脱敏 case PASSWORD: jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str))); break; // 中国车牌脱敏 case CAR_LICENSE: jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str))); break; // 银行卡脱敏 case BANK_CARD: jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str))); break; default: } } // BeanProperty 参数代表Java Bean中正在被反序列化的属性, 初始化或定制该反序列化器的行为。 @Override public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException { 
    if (beanProperty != null) { 
    // 判断数据类型是否为String类型 if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { 
    // 获取定义的注解 Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class); // 为null if (desensitization == null) { 
    // 就可以通过 getContextAnnotation 来找到这个注解并据此调整属性的序列化或反序列化行为 desensitization = beanProperty.getContextAnnotation(Desensitization.class); } // 不为null if (desensitization != null) { 
    // 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。 return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(), desensitization.endExclude()); } } // 查找和提供合适的序列化器(JsonSerializer)来处理给定类型的数据 return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty); } return serializerProvider.findNullValueSerializer(null); } } 

5测试:创建实例类添加脱敏注解

@Data public class TestAnnotationDTO implements Serializable { 
    / * 自定义 */ @Desensitization(type = DesensitizationTypeEnum.CUSTOMER,startInclude = 5,endExclude = 10) private String custom; / * 手机号 */ @Desensitization(type = DesensitizationTypeEnum.MOBILE_PHONE) private String phone; / * 邮箱 */ @Desensitization(type = DesensitizationTypeEnum.EMAIL) private String email; / * 身份证 */ @Desensitization(type = DesensitizationTypeEnum.ID_CARD) private String idCard; } 
  1. 创建接口
@RestController @RequestMapping("/test") public class TestApi { 
    @GetMapping("/test-annotation") public TestAnnotationDTO testAnnotation(){ 
    TestAnnotationDTO testAnnotationDTO = new TestAnnotationDTO(); testAnnotationDTO.setPhone(""); testAnnotationDTO.setCustom(""); testAnnotationDTO.setEmail("@.com"); testAnnotationDTO.setIdCard("15555");ce return testAnnotationDTO; } } 

7、启动项目:http://localhost:8080/test/test-annotation

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127197.html

(0)
上一篇 2025-09-12 20:45
下一篇 2025-09-12 21:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信