【SpringBoot】数据脱敏

文章目录

  • 什么是数据脱敏
  • @JsonSerialize
  • 自定义Jackson注解
  • 定制脱敏策略
  • 定制JSON序列化实现
    • 脱敏工具类
  • 定义Person类,对其数据脱敏
  • 模拟接口测试
  • 总结

在这里插入图片描述

什么是数据脱敏

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

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

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

@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注解

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

@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.mzph.cn/pingmian/5187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue各种时间类型转换

时间范围[2024-04-17 14:36:27, 2024-04-24 14:36:27] console.log(this.$getRecentDays()); 页面使用默认7天 也可以指定console.log(this.$getRecentDays(30)); [2024-04-17 14:36:27, 2024-04-24 14:36:27] 默认值 function getDateString (date, fmt yyyy-MM-dd) {if…

【问题实操】银河高级服务器操作系统实例分享,配置hugepages启动异常

1.问题现象 某运营商国产服务器操作系统项目&#xff0c;部署Kylin-Server-0524-aarch64服务器系统&#xff0c;内核从4.19.90-24.4升级到4.19.90-25.14。在grub中配置huagepages大页内存后&#xff0c;系统在内核启动阶段黑屏&#xff0c;只显示一个光标。grub配置如下图&…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

Gone框架介绍3 - 使用gone命令,自动生成Priest函数

文章目录 1. 安装辅助工具: gone2. 创建一个名为gen-code的新项目3. 创建Goner4. 使用辅助工具5. 添加main函数 我在两年前实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff0c;自己觉得还挺好用的&#xff1b;之前一直…

Linux Mint 21.3 “Virginia“ 简介

Linux Mint 21.3 "Virginia" 是Linux Mint项目发布的最新版本&#xff0c;这个版本基于Ubuntu 22.04 LTS&#xff08;Jammy Jellyfish&#xff09;&#xff0c;并提供了三个主要的桌面环境&#xff1a;Cinnamon、MATE和Xfce。每个桌面环境都有其独特的特点和优势&…

Unity射击游戏开发教程:(8)构建 UI 元素:添加分数显示

用户界面决定用户如何与屏幕交互。UI 适用于所有类型的游戏和应用程序,在此示例中,我们将为我的太空射击游戏设置一个简单的记分板。 第一步是在层次结构中创建一个 UI 元素。只需在层次结构中右键单击,滚动 UI 并选择要添加的 UI 元素类型。在本例中,我们将使用文本元素。…

编程新手如何快速提升编码能力?

编程新手想要快速提升编码能力&#xff0c;可以遵循以下几个策略&#xff1a; 基础扎实&#xff1a;首先&#xff0c;确保你对所学编程语言的基础概念有深刻理解&#xff0c;包括变量、数据类型、控制结构&#xff08;如循环、条件语句&#xff09;、函数、类和对象&#xff08…

使用 Docker 自建一款怀旧游戏之 - 扫雷

1&#xff09;扫雷 简介 扫雷 是一种经典的单人电脑游戏&#xff0c;最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块&#xff0c;而不触发地雷。每个方块上都标有数字&#xff0c;表示周围 8 个方块中…

Java网址url工具类

功能描述 无需引入三方依赖文本匹配网址&#xff08;支持多个&#xff09;网址解析&#xff08;包括协议、主机、路径、参数等&#xff09; package com.qiangesoft.image.utils;import org.springframework.util.Assert; import org.springframework.util.CollectionUtils;i…

行为学学习记忆实验和抗焦虑实验两款硬件

安徽耀坤XWX-BM八臂迷宫实验&#xff08;Eight-arm Maze Test&#xff0c;RMT&#xff09;由八个完全相同的臂组成&#xff0c;这些臂从一个中央平台放射出来&#xff0c;所以又被称为放射迷宫。其基本方式是&#xff1a;训练动物受食物的驱使对迷宫的各臂进行探究&#xff0c;…

xLua背包实践

准备工作 环境&#xff0c;代码 在C#代码方面我们需要准备单例模式基类&#xff0c;AB包管理器&#xff0c;lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包&#xff0c;具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码&#xff1a; JsonUtil…

SSH Config 后门 | Linux 后门系列

ssh 客户端配置文件加载顺序 命令行参数 > ~/.ssh/config > /etc/ssh/ssh_config Ubuntu server 16.04 默认 /etc/ssh/ssh_config # Host * # ForwardAgent no # ForwardX11 no # RhostsRSAAuthentication no # RSAAuthentication …

一、OSPF基础

目录 1.路由协议的优先级 2.转发原则&#xff1a;最长匹配原则 3.负载分担 4.路由备份&#xff08;浮动路由&#xff09; 5.路由协议的分类 6.动态路由 7.距离矢量路由协议&#xff08;BGP&#xff0c;RIP&#xff09; 8.链路状态路由协议&#xff08;OSPF&#xff0c;I…

联系Odoo partner邮件怎么写

亲爱的Odoo 伙伴 我是广东同欣的惊蛰&#xff0c;我通过Odoo官方的珠三角 Partner列表找到了你。 GuangDong TongXin Ai Technology Co., Ltd.&#xff0c;是一家面向中国提供Odoo服务的高科技公司。同欣总部位于广州&#xff0c;目前客户覆盖在广州&#xff0c;深圳&#…

SpringBoot配置HTTPS及开发调试

前言 在实际开发过程中&#xff0c;如果后端需要启用https访问&#xff0c;通常项目启动后配置nginx代理再配置https&#xff0c;前端调用时高版本的chrome还会因为证书未信任导致调用失败&#xff0c;通过摸索整理一套开发调试下的https方案&#xff0c;特此分享 后端配置 …

西瓜书学习——决策树形状、熵和决策树的本质

文章目录 决策树形状监督学习算法分类与回归 熵信息熵香农熵 (Shannon Entropy) - H(X)联合熵 (Joint Entropy) - H(X, Y)条件熵 (Conditional Entropy) - H(Y|X)互信息 (Mutual Information) - I(X; Y)相对熵 (Relative Entropy) / KL散度 (Kullback-Leibler Divergence) - DK…

misc学习

一.知识点 1.BMP文件 BMP文件主要有四部分组成&#xff0c;位图头、位图信息、调色板、位图数据。 bmp文件头(bmp file header)&#xff1a;提供文件的格式、大小等信息 位图信息头(bitmap information)&#xff1a;提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息…

PCL 点云表面重建之曲面平滑(Mobile Least Square, MLS)

一、介绍 1.1 MLS介绍 移动最小二乘法(Mobile Least Square, MLS)是一种用于曲面重建或形变的方法。它通过对曲面进行局部加权平均来减小噪声和估计曲面上的法线方向。   MLS方法的基本思想: 以每个点为中心取一定半径内的邻域点,然后通过最小二乘法拟合一个局部平面或曲…

Docker容器管理详解

引言 Docker作为当前流行的容器化技术&#xff0c;使得应用的部署、扩展和管理变得更加容易。本文将详细介绍Docker容器的概念、特点&#xff0c;以及如何使用Docker命令进行容器管理。 一&#xff0c;Docker容器概念与特点 Docker容器是一种轻量级、可移植、自包含的运行环…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…