继承JsonSerializer+注解实现自定义数据脱敏方案

1、数据脱敏

数据脱敏是一种保护隐私数据的技术,通过将敏感信息转化为非敏感信息来实现对数据的保护,以保护敏感隐私数据的可靠性和安全性。

数据脱敏可以分为可恢复和不可恢复两类:

  1. 可恢复类可以通过一定的方式恢复成原来的敏感数据。
  2. 不可恢复类则无法被恢复。

在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。

2、为何要进行数据脱敏

  1. 保护隐私和数据安全:在处理敏感信息时,如个人身份证号码、银行卡号、电话号码等,通过数据脱敏可以保护该信息不被泄露,提高数据的安全性。
  2. 满足法律法规和合规要求:数据脱敏可以确保数据的合规性,满足相关法律法规和标准的要求。
  3. 防止数据滥用和恶意攻击:数据脱敏可以防止敏感数据被滥用,降低恶意攻击的风险。
  4. 保护企业商业机密:对于包含企业商业机密的数据,通过数据脱敏可以保护其不被泄露,避免对企业造成损失。

在日常的开发中,除了数据脱敏外,还需要将一些敏感的数据从响应中进行剔除,不返回给前端,比如用户信息中的password字段。

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)

可以通过这个注解对指定的字段不进行序列化,前端也就无法收到这个字段。

3、当前市面上普遍的数据脱敏方式

  1. 截断:将敏感数据的某一部分或全部用特殊字符(如*)代替,从而隐藏真实数据。例如将身份证号用“*”替换真实数字。
  2. 随机值:用随机字母或数字代替敏感数据,以保护数据隐私。例如,可以将姓名中的每个字变为随机的相近字。
  3. 数据替换:用一个设定的虚拟值替换真值,从而破坏数据的可读性。例如,可以将手机号统一设置成虚拟手机号。
  4. 仿真:根据敏感数据的原始内容生成符合原始数据编码和校验规则的新数据,使用相同含义的数据替换原有的敏感数据。例如,可以将姓名脱敏后仍然为有意义的姓名,住址脱敏后仍然为住址。

本文就以“截断”为案例进行展示。

4、截断方案

使用截断的方式对数据进行脱敏是一种常见的脱敏方法。它主要是通过对敏感数据的某一部分或全部用特殊字符(如*)或固定字符(如“X”)进行替换,以隐藏敏感信息的真实内容。

这种脱敏方法的主要优点是操作简单,实施方便。同时,由于敏感信息被替换为非敏感字符,因此可以有效地保护敏感数据的隐私。

4.1、前提知识

  1. 熟悉SpringBoot,熟悉SpringBoot默认的序列化方式。
  2. 熟悉正则表达式,使用正则表达式可以简化匹配 / 替换代码。
  3. 熟悉Java8提供的Lamba表达式和内置的函数接口。
  4. 熟悉枚举、注解的使用。

4.2、四大函数式接口

接口名称描述方法
Function通常用于将一个类型的值转换为另一个类型的值。R apply(T t)
Consumer通常用于消费一个参数然后执行一些操作void accept(T t)
Supplier该接口可以作为数据提供者T get();
Predicate通常用于测试一个条件是否成立boolean test(T t);

熟悉Java8所提供的函数接口,可以简化代码的同时也可以提升代码质量。

4.3、脱敏决策枚举

在枚举中直接使用Function函数接口对数据进行截断替换。

import java.util.function.Function;/*** Created by Time Travel* 2023/11/27 17:26**/
public enum SensitiveStrategy {// 身份证ID_CARD(s -> s.replaceAll("(\\d{3})\\d{12}(\\w{3})", "$1*****$2")),// 手机号PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),// 地址ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}\\S*(\\S{2})", "$1********$2"));private final Function<String, String> serialize;SensitiveStrategy(Function<String, String> serialize) {this.serialize = serialize;}public Function<String, String> serialize() {return serialize;}}

$1和$2分别匹配的是正则中的第一个括号和第二个括号里的内容。

4.4、定义脱敏注解

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

@JacksonAnnotationsInside:在Jackson中常被用于标记复合注解。当开发者需要将多个Jackson注解组合成一个自定义注解时,就会使用到这个注解。
@JsonSerialize:作用是将java对象序列化为json数据。它常用于字段或get方法上,作用于getter()方法,将java对象序列化为json数据。

4.5、继承JsonSerializer实现序列化

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 java.io.IOException;
import java.util.Objects;/*** Created by Time Travel* 2023/11/27 17:27**/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.serialize().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);}}

4.6、效果

4.6.1、实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String nickname;@Sensitive(strategy = SensitiveStrategy.PHONE)private String phone;@Sensitive(strategy = SensitiveStrategy.ID_CARD)private String identifyCard;@Sensitive(strategy = SensitiveStrategy.ADDRESS)private String address;
}

4.6.2、测试结果

在这里插入图片描述

5、总结

使用数据脱敏方案可以有效地保护隐私和敏感数据的安全,同时满足数据处理和测试等需求,以下是使用数据脱敏方案的总结:

  1. 选择合适的脱敏方案:根据需要保护的数据类型和场景,选择合适的脱敏方案。例如,对于敏感数据的部分字段,可以使用截断或随机值替换;对于需要保持数据完整性的场景,可以使用仿真或数据替换等方案。
  2. 确定脱敏规则和阈值:根据实际需求和风险承受能力,确定脱敏规则和阈值。例如,将手机号码的后四位替换为随机数字,或者将地址中的省市区信息替换为仿真数据等。
  3. 做好数据备份和恢复准备:在进行数据脱敏前,需要做好数据备份,以防止数据丢失或破坏。同时,也需要考虑数据还原的需求,以便在必要时将数据还原为原始状态。
  4. 确保脱敏后的数据质量:在脱敏后,需要确保数据的可用性和准确性。如果脱敏后的数据质量不佳,可能会对数据处理和分析的结果产生负面影响。
  5. 定期更新和审查脱敏方案:随着业务需求和安全威胁的变化,需要定期更新和审查脱敏方案,以确保其有效性和适用性。
  6. 加强人员管理和安全培训:数据脱敏方案只是数据保护的一部分,加强人员管理和安全培训也是非常重要的。需要对开发、测试和运维等人员进行安全意识和技能培训,以减少人为泄露数据的可能性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/176012.shtml

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

相关文章

【Shell】Shell基础学习

一、shell脚本 (1)第一个shell脚本 #!/bin/bash #this is a comment echo "hello world"一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。 “#”开头是注释 …

P8A003-系统加固-系统管理员账户安全

【预备知识】 Administrator 原意为管理人或行政官员或遗产管理人&#xff0c;在计算机名词中&#xff0c;它的意思是系统超级管理员或超级用户。但是在Windows系统中此用户名只在安全模式中使用。 【实验步骤】 网络拓扑&#xff1a;server2008-basic windows server 2008 …

LeetCode [简单]118. 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 public class Solution {public IList<IList<int>> Generate(int numRows) {List<IList<int>> res new …

交流负载测试使用场景

交流负载测试是一种在特定环境下&#xff0c;对电力设备、汽车电子部件&#xff0c;工业自动化设备、网络设备、家电产品&#xff0c;航空航天设备以及医疗器械等产品进行测试的方法&#xff0c;该测试的目的是评估这些设备在实际运行条件下的性能和可靠性。 1电力设备测试 交…

Zabbix 6.0 详细基础介绍

目录 一、如何选择自己的运维监控平台 1.1 常用的开源运维监控工具 1.1.1 Cacti 1.1.2 Nagios 1.1.3 Ganglia 1.1.4 Centreon 1.1.5 Grafana 1.1.6 Prometheus 1.1.7 Zabbix 1.2 监控工具选型经验 1.2.1 中小企业传统监控选择 Zabbix 1.2.2 云原生监控选择 Prometh…

虚幻学习笔记2—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2&#xff0c;两种方式分别为&#xff1a;点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件&#xff1a;这一步很重要&#xff0c;如图2.1.1所示&#xff1a;在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHF 文章目录 GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHFPretraining 预训练阶段Supervised FineTuning &#xff08;SFT&#x…

Vue 3 面试经验分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

docker容器运维操作命令

docker exec &#xff1a;在运行的容器中执行命令 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明&#xff1a; -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端docker ps : 列出容器 docker ps [OPTIONS] OPTIONS说明&#…

【EI会议投稿】第四届物联网与智慧城市国际学术会议(IoTSC 2024)

第四届物联网与智慧城市国际学术会议 2024 4th International Conference on Internet of Things and Smart City 继IoTSC前三届的成功举办&#xff0c;第四届物联网与智慧城市国际学术会议&#xff08;IoTSC 2024&#xff09;将于2024年3月22-24日在河南洛阳举办。 智慧城市的…

Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务

最简单的有可能是你的服务还没有开启&#xff0c;需要启动服务&#xff01;&#xff01;&#xff01;&#xff01; 在连接数据库的时候&#xff0c;有时会遇到一个“ORA12514&#xff1a;监听程序当前无法识别连接描述符中请求的服务”的错误&#xff0c;这个错误其实就是数据…

二十章多线程

概念 有很多工作是可以同时完成的&#xff0c;这种思想放在Java中被称为并发&#xff0c;并发完成每一件事被称为线程。 程序员可以在程序中执行多个线程&#xff0c;每一个线程完成一个功能//与其他线程并发执行&#xff0c;这种机制被称为多线程&#xff0c;并不算所有编程…

Echarts大屏可视化_02 球体模块制作

继续跟着b站大佬pink老师学大屏可视化 球体模块制作 1.球体模块布局 HTML <div class"column"><div class"no"><div class"no-hd"><ul><li>125811</li><li>104563</li></ul></div&g…

Mysql解决随机选取问题

常规的随机选取效率差的原因&#xff1a; 两种解决方法&#xff1a; 总结&#xff1a;

基于单片机设计的超声波测距仪(采用HC-SR04模块)

一、前言 本项目是基于单片机设计的超声波测距仪&#xff0c;主要采用了STC89C52单片机和HC-SR04超声波测距模块。通过LCD1602液晶显示屏来展示测量的距离信息。 超声波测距技术是一种常见的非接触式测距方法&#xff0c;利用超声波的传播速度测量物体与测距器之间的距离。它…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

前缀和算法总结

前缀和思维导图&#xff1a; 一维前缀和算法模版&#xff1a; #include <iostream>using namespace std;const int N 100010;int n, m; int s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i){int x;scanf("%d", &…

java--方法重写

1.什么是方法重写 ①当子类觉得父类中的某个方法不好用&#xff0c;或者无法满足自己的需求时&#xff0c;子类可以重写一个方法名称、参数列表一样的方法&#xff0c;去覆盖父类的这个方法&#xff0c;这就是方法重写。 ②注意&#xff1a;重写后&#xff0c;方法的访问&…

外汇天眼:你要多久才能成为一个赚钱的交易者?

自古以来&#xff0c;从我们的远祖开始&#xff0c;遇到风险会先跑&#xff0c;看到食物就会先吃&#xff0c;怕被人抢走&#xff0c;这是我们求生本能。 但如果按照我们的天性去做交易&#xff0c;基本上是不容易赚到钱&#xff0c;因为这个心态是祖先留下来的&#xff0c;可…

DM8数据库版本升级

DM数据库版本升级说明 DM数据库的版本一直在不断的的迭代。 对于DM 的数据库版本&#xff0c;分大版本和小版本。 1)大版本&#xff1a;指DM6&#xff0c;DM7&#xff0c;DM8 这种。2)小版本&#xff1a;指同一个大版本子版本的变化&#xff0c;比如DM8的&#xff1a;8.1.0.1…