【SpringBoot】数据脱敏

devtools/2024/9/23 1:39:59/

文章目录

在这里插入图片描述

什么是数据脱敏

数据脱敏,也称为数据的去隐私化或数据变形,是一种技术手段,用于对某些敏感信息通过特定的脱敏规则进行数据的变形,从而实现敏感隐私数据的可靠保护。这样可以在开发、测试和其他非生产环境以及外包环境中安全地使用脱敏后的真实数据集。

数据脱敏的主要应用场景包括涉及客户安全数据或商业性敏感数据的情况,例如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏数据脱敏的主要功能是通过使用数据脱敏产品,有效防止企业内部对隐私数据的滥用,防止隐私数据在未经脱敏的情况下从企业流出,满足企业既要保护隐私数据,同时又保持监管合规的需求。

今天我们就用自定义注解的方式在我们的项目中实现数据脱敏

@JsonSerialize

@JsonSerialize 是 Jackson 库中的一个注解,用于在将 Java 对象序列化为 JSON 格式时指定如何进行自定义的序列化处理。Jackson 是一个流行的 Java 库,用于处理 JSON 数据的序列化和反序列化

@JsonSerialize 注解可以应用于字段、方法或类级别,允许我们自定义序列化过程。例如,我们可以通过 @JsonSerialize 注解将日期格式化为特定的字符串,或将枚举类型序列化为其名称而不是值。

在使用 @JsonSerialize 注解时,我们可以使用 using 属性来指定一个自定义的序列化器(Serializer)类,这个类需要继承自 JsonSerializer,其中 T 是要序列化的对象的类型。通过这个自定义的序列化器,我们可以完全控制如何将 Java 对象转换为 JSON 数据。

此外,@JsonSerialize 注解还有一些其他的属性,如 include,用于指定序列化的范围和作用规则(例如,只序列化非空的属性)。

举个简单的例子,大家感受下:

@Data
public class CustomDateClass {  @JsonSerialize(using = CustomDateSerializer.class)  private Date myDate;  //自定义的日期序列化public static class CustomDateSerializer extends ToStringSerializer<Date> {  private static final long serialVersionUID = 1L;  public CustomDateSerializer() {  //传递null以使用默认日期格式super(null); }  //重写 serialize 方法来定制日期的序列化过程,将其格式化为 "yyyy-MM-dd" 的字符串。@Override  public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {  String formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(value);  jgen.writeString(formattedDate);  }  }  
}

接下来我们就使用自定义注解的方式,利用@JsonSerialize注解的特性来实现今天的数据脱敏功能。

Jackson_48">自定义Jackson注解

需要自定义一个脱敏注解,一旦有属性被标注,则进行对应的脱敏

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {//脱敏策略SensitiveStrategy strategy();
}

定制脱敏策略

针对项目需求,定制不同字段的脱敏规则,比如手机号中间几位用 * 替代:

/*** 脱敏策略,枚举类,针对不同的数据定制特定的策略*/
public enum SensitiveStrategy
{/*** 姓名,第2位星号替换*/USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),/*** 密码,全部字符都用*代替*/PASSWORD(DesensitizedUtil::password),/*** 身份证,中间10位星号替换*/ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")),/*** 手机号,中间4位星号替换*/PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),/*** 电子邮箱,仅显示第一个字母和@后面的地址显示,其他星号替换*/EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")),/*** 银行卡号,保留最后4位,其他星号替换*/BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1")),/*** 车牌号码,包含普通车辆、新能源车辆*/CAR_LICENSE(DesensitizedUtil::carLicense);private final Function<String, String> desensitizer;SensitiveStrategy(Function<String, String> desensitizer){this.desensitizer = desensitizer;}public Function<String, String> desensitizer(){return desensitizer;}
}

定制JSON序列化实现

对标注注解@Sensitive的字段进行脱敏

/*** 序列化注解自定义实现* JsonSerializer<String>:指定String 类型,serialize()方法用于将修改后的数据载入*/
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {private SensitiveStrategy strategy;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(strategy.desensitizer().apply(value));}/*** 获取属性上的注解属性*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {Sensitive annotation = property.getAnnotation(Sensitive.class);if (Objects.nonNull(annotation)&&Objects.equals(String.class, property.getType().getRawClass())) {this.strategy = annotation.strategy();return this;}return prov.findValueSerializer(property.getType(), property);}
}

脱敏工具类

/*** 脱敏工具类*/
public class DesensitizedUtil
{/*** 密码的全部字符都用*代替,比如:******** @param password 密码* @return 脱敏后的密码*/public static String password(String password){if (StringUtils.isBlank(password)){return StringUtils.EMPTY;}return StringUtils.repeat('*', password.length());}/*** 车牌中间用*代替,如果是错误的车牌,不处理** @param carLicense 完整的车牌号* @return 脱敏后的车牌*/public static String carLicense(String carLicense){if (StringUtils.isBlank(carLicense)){return StringUtils.EMPTY;}// 普通车牌if (carLicense.length() == 7){carLicense = StringUtils.hide(carLicense, 3, 6);}else if (carLicense.length() == 8){// 新能源车牌carLicense = StringUtils.hide(carLicense, 3, 7);}return carLicense;}
}

定义Person类,对其数据脱敏

使用注解@Sensitive注解进行数据脱敏

@Data
public class Person {/*** 真实姓名*/@Sensitive(strategy = SensitiveStrategy.USERNAME)private String realName;/*** 电话号码*/@Sensitive(strategy = SensitiveStrategy.PHONE)private String phoneNumber;/*** 身份证号码*/@Sensitive(strategy = SensitiveStrategy.ID_CARD)private String idCard;
}

模拟接口测试

以上4个步骤完成了数据脱敏Jackson注解,下面写个controller进行测试

@RestController
public class TestController {@GetMapping("/test")public Person test(){Person user = new Person();user.setRealName("阿Q说代码");user.setPhoneNumber("13588888888");user.setIdCard("370213199204174235");return user;}
}

返回结果如下:
在这里插入图片描述

总结

以上就是我们通过自定义注解的方式实现数据脱敏的全部内容了,想要了解更多JAVA后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!


http://www.ppmy.cn/devtools/25274.html

相关文章

Bert基础(十九)--Bert实战:文本相似度匹配

文本匹配是指计算机系统识别和确定两段文本之间关系的任务。这个概念非常广泛&#xff0c;涵盖了各种场景&#xff0c;其中文本之间的关系可以是有相似度、问答、对话、推理等。在不同的应用场景下&#xff0c;文本匹配的具体定义可能会有所不同。 以下是几种常见的文本匹配任务…

记录k8s以docker方式安装Kuboard v3 过程

原本是想通过在k8s集群中安装kuboad v3的方式安装kuboard&#xff0c;无奈在安装过程中遇到了太多的问题&#xff0c;最后选择了直接采用docker安装的方式&#xff0c;后续有时间会补上直接采用k8s安装kuboard v3的教程。 1.kuboard安装文档地址&#xff1a; 安装 Kuboard v3 …

3D看车有哪些强大的功能?适合哪些企业使用?

3D看车是一种创新的汽车展示方式&#xff0c;它提供了许多强大的功能&#xff0c;特别适合汽车行业的企业使用。 3D看车可实现哪些功能&#xff1f; 1、细节展示&#xff1a; 51建模网提供全套汽车行业3D数字化解决方案&#xff0c;3D看车能够将汽车展示得更加栩栩如生&…

上门服务系统|上门服务小程序搭建流程

随着科技的不断进步和人们生活水平的提高&#xff0c;越来越多的服务开始向线上转型。传统的上门服务业也不例外&#xff0c;随着上门服务小程序的兴起&#xff0c;人们的生活变得更加便捷和高效。本文将为大家介绍上门服务小程序的搭建流程以及应用范围。 一、上门服务小程序搭…

iBarcoder for Mac:一站式条形码生成软件

在数字化时代&#xff0c;条形码的应用越来越广泛。iBarcoder for Mac作为一款专业的条形码生成软件&#xff0c;为用户提供了一站式的解决方案。无论是零售、出版还是物流等行业&#xff0c;iBarcoder都能轻松应对&#xff0c;助力用户实现高效管理。 iBarcoder for Mac v3.14…

windows驱动开发-I/O请求(二)

前面我们已经介绍了I/O请求的数据结构&#xff0c;接下来就是I/O请求的处理了。 IRP的处理 驱动例程收到IRP请求的时候&#xff0c;一般会使用一个巨大的switch语句&#xff0c;来处理每一个IOCTL&#xff0c;虽然前面我们简单的讲述了三种不同的I/O缓冲区方式&#xff0c;但…

【算法基础实验】图论-构建加权无向图

构建加权无向图 理论基础 在图论中&#xff0c;加权无向图是一种每条边都分配了一个权重或成本的图形结构。这种类型的图在许多实际应用中都非常有用&#xff0c;如路由算法、网络流量设计、最小生成树和最短路径问题等。 加权无向图的基本特征 顶点和边&#xff1a; 顶点&…

streampetr原版网络nuscenes数据pkl文件中的各字段含义

streampetr原版网络nuscenes数据pkl文件中的各字段含义 每帧数据都包含下列的信息 "token": 该帧数据的标识&#xff0c;具有唯一性 "prev": 该帧数据上一帧数据的token&#xff0c;如果没有就为"" "next": 该帧数据下一帧数据的toke…