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

news2024/9/28 20:36:09

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. 加强人员管理和安全培训:数据脱敏方案只是数据保护的一部分,加强人员管理和安全培训也是非常重要的。需要对开发、测试和运维等人员进行安全意识和技能培训,以减少人为泄露数据的可能性。

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

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

相关文章

UTONMOS:元宇宙时代已经来临

当我们站在这个新的人工智能时代的十字路口&#xff0c;不可避免地要面对一个问题&#xff1a;在这个技术革新的大潮中&#xff0c;区块链技术还有没有生存和发展的空间&#xff1f;本文将深入探讨这个问题&#xff0c;分析区块链在人工智能时代的优势、挑战以及未来的可能性。…

二十章多线程

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

Java 之 lambda 表达式(二)---- Stream 操作 API

目录 一. 前言 二. Stream 创建 2.1. 使用集合来创建 Stream 2.2. 使用数组创建 Stream 2.3. 由值创建 Stream 2.4. 由函数创建无限流 Stream 2.5. 代码示例 三. Stream 操作 3.1. 中间型操作 3.1.1. filter() 3.1.2. map() 3.1.3. mapToInt()、mapToLong()、mapTo…

ESP32-Web-Server编程- JS 基础5

ESP32-Web-Server编程- JS 基础5 概述 JS 编程内容颇多&#xff0c;我们提供一些简单的示例&#xff0c;先玩再学&#xff0c;边玩边学。 示例1-演示通过 JS 进行温度转换 资源链接 对应示例的 code 链接 &#xff08;点击直达代码仓库&#xff09; 示例2-增加网页弹窗 演…

【数据结构—单链表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 链表的概念及结构 2. 单链表的实现 2.1单链表头文件——功能函数的定义 2.2单链表源文件——功能函数的实现 2.3 单链表源文件——功能的测试 3.具体的理解操作…

Selenium 学习(0.14)——软件测试之测试用例设计方法——因果图法2【基本步骤及案例】

1、因果图法的基本步骤 2、案例分析 1&#xff09;分析原因和结果 2&#xff09;关联原因和结果 投入1元5角或2元&#xff0c;按下“可乐”&#xff0c;送出“可乐”【暂时忽略找零】 投入2元&#xff0c;按下“可乐”或“雪碧”。找零5角&#xff0c;送出“可乐”或“雪…

vue中keep-alive的使用

什么是keep-alive&#xff1f; keep-alive是一个内置组件&#xff0c;用于缓存和管理组件的状态。 当 keep-alive包裹一个组件时&#xff0c;这个组件的状态将会被缓存起来&#xff0c;而不是每次重新渲染。这在多个视图之间切换时特别有用&#xff0c;可以避免重复的创建和销…

uniapp前端+python后端=微信小程序支付到底怎么开发???国内的资料为什么没一篇能讲清楚,简简单单的只需要3步就可以了-V2版本

一.微信小程序支付 真的&#xff0c;在接到这个任务的时候&#xff0c;本以为很简单&#xff0c;不就是普通的浏览器复制粘贴&#xff0c;最不济找下gpt给生成一下&#xff0c;但是到实际开发就不同了&#xff0c;不是后端出问题就是前端&#xff0c;搜资料&#xff0c;上百度…

【Rust】基本的语法概念

Rust初学习 常见概念变量与可变性变量常量隐藏 数据类型标量类型字符类型复合类型元组数组 函数参数语句和表达式具有返回值的函数 注释控制流使用循环重复执行 常见概念 变量与可变性 变量 fn main() {let x 5;println!("The value of x is: {x}");x 6;println…

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子&#xff0c;其结构复杂多样&#xff0c;蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看&#xff0c;蛋白质的结构可以分为四个层次&#xff1a;初级结构、二级结构、三级结构和四级结构。 初级结…

中英双语大模型ChatGLM论文阅读笔记

论文传送门&#xff1a; [1] GLM: General Language Model Pretraining with Autoregressive Blank Infilling [2] Glm-130b: An open bilingual pre-trained model Github链接&#xff1a; THUDM/ChatGLM-6B 目录 笔记AbstractIntroduction 框架总结1. 模型架构2. 预训练设置3…

MySQL的Linux安装

在MySQL官网下载压缩包MySQL :: Download MySQL Community Server (Archived Versions) 下载完成后将压缩包上传到Linux中。我这里是下的CentOS的压缩包。 并且用的是FinalShell连接工具&#xff0c;可以选择压缩包直接上传。 ​ 上传完毕后&#xff0c;新建mysql文件夹&…

[DASCTF 2023 0X401七月暑期挑战赛] web刷题记录

文章目录 EzFlask方法一 python原型链污染方法二 flask框架静态文件方法三 pin码计算 MyPicDisk方法一 字符串拼接执行命令方法二 phar反序列化 EzFlask 考点&#xff1a;python原型链污染、flask框架理解、pin码计算 源码如下 import uuidfrom flask import Flask, request, …

Linux驱动开发笔记(五):驱动连接用户层与内核层的文件操作集原理和Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134561660 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

OpenVINO异步Stable Diffusion推理优化方案

文章目录 Stable Diffusion 推理优化背景技术讲解&#xff1a;异步优化方案思路&#xff1a;异步推理优化原理OpenVINO异步推理Python API同步和异步实现方式对比 oneflow分布式调度优化优势&#xff1a;实现思路 总结&#xff1a; Stable Diffusion 推理优化 背景 2022年&am…

山西电力市场日前价格预测【2023-11-29】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-29&#xff09;山西电力市场全天平均日前电价为275.28元/MWh。其中&#xff0c;最高日前电价为415.78元/MWh&#xff0c;预计出现在17:45。最低日前电价为0.00元/MWh&#xff0c;预计出…

Make Pixels Dance: High-Dynamic Video Generation论文解析

高动态视频生成的新进展 Make Pixels Dance: High-Dynamic Video Generation高动态视频生成的新进展前言视频生成模式摘要论文十问实验数据集定量评估指标消融研究 训练和推理技巧训练技术推理技术 更多的应用 Make Pixels Dance: High-Dynamic Video Generation 高动态视频生…

MySQL在Docker容器中的性能损失分析与优化策略

文章目录 1. Docker容器对MySQL性能的潜在影响1.1. IO性能1.2. 网络性能1.3. 资源隔离 2. 优化策略2.1. 使用本地数据卷2.2. 配置合理的容器网络2.3. 限制容器资源2.4. 使用容器编排工具 3. 性能测试与监控4. 结论 &#x1f389;MySQL在Docker容器中的性能损失分析与优化策略 ☆…

sqli-labs靶场详解(less17-less22)

目录 less-17 less-18 less-19 less-20 less-21 less-22 less-17 修改密码关卡 服务器后端 账号密码都存在数据库中 使用UPDATE进行修改密码 尝试username处 尝试好久尝试不出来应该是对用户名进行了过滤 于是对password进行注入 判断注入点 passwdadmin 报错&#xff1a…

MySQL使用函数和存储过程实现:向数据表快速插入大量测试数据

实现过程 1.创建表 CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,phone_number VARCHAR(11) DEFAULT NULL,email VARCHAR(255) DEFAULT NULL,address VARCHAR(255) DEF…