继承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;

	// 进行序列化
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(strategy.serialize().apply(value));
    }
    
    // 获取属性上的注解属性
    @Override
    public 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. 加强人员管理和安全培训:数据脱敏方案只是数据保护的一部分,加强人员管理和安全培训也是非常重要的。需要对开发、测试和运维等人员进行安全意识和技能培训,以减少人为泄露数据的可能性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务&#xff1a;右键“此电脑”&#xff0c;选择“管理”&#xff0c;之后选择“服务和应用程序”--“服务”&#xff0c;在服务中找到“MySQL”&#xff0c;右键选择“停止”。 2、找到“控制面板”--“程序和功能”&#xff0c;找到MySQL&…

C++二分查找视频教程:两数之和

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 n…

Find My键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

键盘是最常用也是最主要的输入设备&#xff0c;通过键盘可以将英文字母、汉字、数字、标点符号等输入到计算机中&#xff0c;从而向计算机发出命令、输入数据等。还有一些带有各种快捷键的键盘。随着时间的推移&#xff0c;渐渐的市场上也出现独立的具有各种快捷功能的产品单独…

STK Components 二次开发- StarLink

1.星链数据下载 CelesTrak: Current GP Element Sets 下载二根数就可以。 2.处理数据 下载下来的数据是这样&#xff0c;要将字符串转为 二根数对象 TwoLineElementSet tle new TwoLineElementSet(tleString); Sgp4Propagator propagator new Sgp4Propagator(tle); 3.批量…

linux task_struct中进程调度相关的变量记录

参考文章&#xff1a; Linux进程调度分析记录&#xff0c;进程优先级&#xff0c;隔离处理器&#xff0c;isolcpus - 知乎

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法&#xff1a; 方法二&#xff1a;reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案&#xff1a; 使用Set&#xf…

AT89S52单片机------中断系统

目录 单片机的内部结构 中断请求标志寄存器 (1)TCON寄存器 (2)SCON寄存器 (3)定时器2的控制寄存器T2CON 中断允许与中断优先级的控制寄存器 中断允许寄存器IE 中断优先级寄存器IP 响应中断请求的条件 外部中断响应时间 外部中断的触发方式选择 中断请求的撤销 1.定…

[极客大挑战2023] Crypto/PWN/Reverse

这个网站真辛苦&#xff0c;每次都要回到all&#xff0c;屏幕随时卡。界面有待进步老远。也不提示结束&#xff0c;结果现在才听说结束了&#xff0c;才开始记录一下。 还跟往常一样&#xff0c;WM不作&#xff0c;其它也AK不了&#xff0c;总是差点。 Crypto SignIn 53594…

AI - Steering behaviors(转向系统)

游戏AI角色的转向系统&#xff08;Steering behaviors&#xff09;实现 一些向量的接口是cocos2dx的。但从名字上应该能理解做了什么向量操作 Seek&#xff1a; 获取当前位置指向目标点的向量&#xff0c;转化为单位向量后再乘以速度值&#xff0c;即为所需速度desired velo…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先&#xff0c;uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的&#xff0c;在官方提供的案例当中&#xff0c;核心代码是这一部分&#xff1a; 但如果将其封装为组件&#xff0c;并在一个页面当中引用多次来生成多个charts图标&#xff0c;那么这个时…

化学仿制药参比制剂目录-参比制剂查询网站

2015年以前&#xff0c;参比制剂对于仿制药的研究无关紧要&#xff0c;但推出了’仿制药一致性评价’后&#xff0c;参比制剂的选择成为了决定仿制药成功与否的关键因素&#xff0c;如今在进行仿制药研究时&#xff0c;首要任务就是确定仿制目标&#xff0c;也就是参比制剂。 …

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…

TIME_WAIT状态套接字重新使用

《TIME_WAIT相关知识》里边有相关理论知识。 《TIME_WAIT状态TCP连接导致套接字无法重用实验》有相关实验。 现代Linux的TCP协议栈已经做了许多升级&#xff0c;所以可以让我们直接重用TIME_WAIT状态套接字而不会引起问题。下边是优化的内容&#xff1a; 1.新连接的SYN告知序列…

Java - Stream Filter 多条件筛选过滤

Java Stream流中Filter用于通过设置的条件过滤出元素 &#xff0c;示例如下&#xff1a; List strings Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,"", “jkl”);List filtered strings.stream().filter(string -> !string.isEmpty()).collect(C…

基于ssm框架的公寓租房系统设计与实现

基于ssm框架的公寓租房系统的设计与实现 摘要&#xff1a;在互联网技术的不断发展壮大的背景下,人们生活水平及经济水平也随之得到提上&#xff0c;许多商家都纷纷吧自己的业务重心偏移到网络这个大蛋糕上&#xff0c;为了迎合时代的发展&#xff0c;房屋的出租业务也应该将重…

血的教训--redis被入侵之漏洞利用复现--总览

血的教训–redis被入侵之漏洞利用复现–总览 相信大家对于自己的服务器被入侵&#xff0c;还是比较憎恨的&#xff0c;我的就被攻击了一次&#xff0c;总结经验&#xff0c;自己也是整理了这一个系列&#xff0c;从最基础到最后面的自己总结被攻破的步骤&#xff0c;非常清晰的…

【腾讯云云上实验室】探索向量数据库背后的安全监控机制

当今数字化时代&#xff0c;数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及&#xff0c;如何保护数据的安全性和隐私性成为了迫切的需求。 今天&#xff0c;我将带领大家一起探索腾讯云云上实验室所推出的向量数据库&#xff0c…

抽象类的使用—模板设计模式 Java

模板设计模式 一、引入二、改进 一、引入 需求 ① 有多个类&#xff0c;完成不同的任务 job ② 要求统计得到各自完成任务的时间 ③ 请编程实现 >最容易想到的方法&#xff0c;写类&#xff0c;统计时间 AA BB中的 job 方法中是有重复的。 >改进1&#xff1a;每个类中&…

基于单片机仿指针显示的电子时钟设计

**单片机设计介绍&#xff0c; 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机仿指针显示的电子时钟是一种利用单片机控制器和LED或LCD显示屏幕来模拟传统时钟指针的显示效果的设计…