数据脱敏-快速使用

1.数据脱敏定义

数据脱敏百度百科中是这样定义的: 数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。

因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信息,而用户信息里面就包括了一些敏感信息,所以就需要脱敏

使用场景:

此篇文章我们介绍如何使用Hutool工具类进行数据脱敏

2. Hutool 工具介绍

脱敏工具

https://doc.hutool.cn/pages/DesensitizedUtil/#%E4%BB%8B%E7%BB%8Dicon-default.png?t=O83Ahttps://doc.hutool.cn/pages/DesensitizedUtil/#%E4%BB%8B%E7%BB%8D

3.数据脱敏接入WMS项目

用户管理列表进行数据脱敏

4.业务接入

我们已经导入过hutool工具类,所以可以直接使用

使用工具类进行接入

5.SpringBoot使用注解方式接入

我们可以看到,上面的代码与业务进行耦合了

数据脱敏的操作就与业务进行耦合了,所以我们使用注解的方式,

我们针对hutool工具类进行封装

数据脱敏发生时间点:

脱敏发生的时间点就是我们真正要把这个对象写到网络中去,或者是写到磁盘里面去

也就是去进行序列化的时候,就会真正的进行脱敏的这个操作

注解代码:

import com.beiyou.config.SensitiveInfoSerializer;
import com.beiyou.enums.DesensitizationType;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveInfoSerializer.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Desensitization {DesensitizationType type() default DesensitizationType.DEFAULT;/*** 前置不需要打码的长度*/int prefixLen() default 0;/*** 后置不需要打码的长度*/int suffixLen() default 0;/*** 遮罩字符*/String maskingChar() default "*";
}

Java

注解中

  • @JacksonAnnotationsInside:这是一个元注解,它告诉 Jackson 解析器,这个注解应该被视为 Jackson 的一部分,也就是说 Jackson 会处理带有此注解的字段。有效的 Jackson 注解,而不是一个普通的 Java 注解。

  • @JsonSerialize(using = SensitiveInfoSerializer.class):注解用于指定如何序列化一个字段或方法。它允许你指定一个自定义的序列化器类,Jackson 将使用这个类来序列化带有该注解的字段或方法返回的结果。

  • 与 Jackson 的集成:通过 @JsonSerialize(using = SensitiveInfoSerializer.class) 注解,你将 SensitiveInfoSerializer 与 Jackson 集成。当 Jackson 遇到带有 @Desensitization 注解的字段时,它会使用 SensitiveInfoSerializer 来序列化这些字段。

  • 当 Jackson 遇到带有 @Desensitization 注解的字段时,它会使用 SensitiveInfoSerializer 来序列化这些字段。

总结:

当你在一个字段上使用 @Desensitization 注解时,Jackson 会在序列化该字段时调用 SensitiveInfoSerializer 类来进行脱敏处理。

这样可以确保在输出 JSON 数据时,敏感信息会被适当的遮盖或替换。

脱敏类型

public enum DesensitizationType {// 自定义规则CUSTOMIZE_RULE, // 默认的DEFAULT, //用户idUSER_ID, //中文名CHINESE_NAME, //身份证号ID_CARD, //座机号FIXED_PHONE, //手机号MOBILE_PHONE, //地址ADDRESS, //电子邮件EMAIL, //密码PASSWORD, //中国大陆车牌,包含普通车辆、新能源车辆CAR_LICENSE, //银行卡BANK_CARD
}

Java

序列化工具的代码:

import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.StrUtil;
import com.beiyou.annotation.Desensitization;
import com.beiyou.enums.DesensitizationType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;import java.io.IOException;/*** 数据脱敏序列化器**/
public class SensitiveInfoSerializer extends JsonSerializer<String> implements ContextualSerializer {private boolean useMasking = false;private DesensitizationType type;private int prefixLen;private int suffixLen;private String maskingChar;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (useMasking && value != null) {switch (type) {case CUSTOMIZE_RULE:gen.writeString(StrUtil.hide(value, prefixLen, suffixLen));break;case DEFAULT:gen.writeString(value);break;case CHINESE_NAME:gen.writeString(DesensitizedUtil.chineseName(value));break;case ID_CARD:gen.writeString(DesensitizedUtil.idCardNum(value, prefixLen, suffixLen));break;case FIXED_PHONE:gen.writeString(DesensitizedUtil.fixedPhone(value));break;case MOBILE_PHONE:gen.writeString(DesensitizedUtil.mobilePhone(value));break;case ADDRESS:gen.writeString(DesensitizedUtil.address(value, prefixLen));break;case EMAIL:gen.writeString(DesensitizedUtil.email(value));break;case PASSWORD:gen.writeString(DesensitizedUtil.password(value));break;case CAR_LICENSE:gen.writeString(DesensitizedUtil.carLicense(value));break;case BANK_CARD:gen.writeString(DesensitizedUtil.bankCard(value));break;default:gen.writeString(value);}} else {gen.writeString(value);}}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {if (property != null) {Desensitization desensitization = property.getAnnotation(Desensitization.class);if (desensitization != null) {this.type = desensitization.type();this.prefixLen = desensitization.prefixLen();this.suffixLen = desensitization.suffixLen();this.maskingChar = desensitization.maskingChar();useMasking = true;}}return this;}
}

Java

序列化器

JsonSerializer<T> 是 Jackson 提供的一个接口,用于自定义序列化逻辑。,用于定义如何将 Java 对象序列化为 JSON 格式的字符串。当 Jackson 需要将一个 Java 对象转换为 JSON 字符串时,它会调用实现了 JsonSerializer<T> 接口的类中的 serialize 方法。

总结

SensitiveInfoSerializer 类是专门为 Jackson 定制的,用于实现数据脱敏功能。

  • 当 Jackson 需要序列化一个带有 @Desensitization 注解的字段时,它会使用 SensitiveInfoSerializer 对该字段进行序列化。

  • 序列化器会根据注解中的规则和参数来决定如何脱敏该字段的内容。

  • 脱敏后的结果将被写入 JSON 数据中,从而保护了敏感信息不被泄露。

直接使用

就可以直接在类上面使用注解

6.Excel导出数据脱敏

excel数据导出脱敏,需要我们手动使用工具类去进行数据脱敏,在数据将进行序列化之前,将数据进行替换

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

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

相关文章

历年大厂校招 网络安全面试题(80+经验贴)

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

为什么要使用多线程

为什么要使用多线程 任务分解&#xff1a;耗时的操作&#xff0c;任务分解&#xff0c;实时响应。数据分解&#xff1a;充分利用多核CPU处理数据。数据流分解&#xff1a;读写分离&#xff0c;解耦合设计。 #include <iostream> #include<thread> using namespac…

【Unity编辑器扩展】解决uGUI动效痛点 零代码可视化快速制作UI动效 DOTween Sequence可视化

UI动效痛点&#xff1a; UI动效一直是Unity游戏开发的一大痛点&#xff0c;大部分项目都在使用Animator/Animation制作UI动效。而Animation是以节点路径记录动画&#xff0c;一旦UI层级、节点名变更就会导致动效返工&#xff0c;且Animation编辑器缓动曲线很难控制&#xff0c…

【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割

目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接&#xff1a;https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据&#xff0c;其中包含大量少数/尾部类别&#xff0c;这些类…

C:内存函数

目录 前言&#xff1a; 一、memcpy 函数的使用及实现 1、memcpy函数的介绍 1.1 memcpy函数参数解读 2、memcpy函数的使用 3、memcpy函数的模拟实现 二、memmove函数的使用及模拟 1、memmove函数的使用 2、memmove函数的模拟实现 三、memset 函数的使用 1、memset函数的…

PyCharm下载和安装教程

Python、C/C、C#、DSL、Go、Groovy、Java、JavaScript、Objective-C、PHP 等编程语言。 图 1 JetBrains 开发工具 PyCharm下载和安装 进入 PyCharm官方下载页面(如图 2 所示)&#xff0c;可以看到 PyCharm 有 2 个版本&#xff0c;分别是 Professional(专业版)和 Community(社…

Mybatis百万数据插入(含导出)

1 一般一次性插入多条数据 传统的sql语句&#xff1a; INSERT INTO table1 ( field1, field2 ) VALUES( "data1", "data2" ); INSERT INTO table1 ( field1, field2 ) VALUES( "data1", "data2" ); INSERT INTO table1 ( field1, fi…

DirectX修复助手

在日常使用电脑时&#xff0c;我们可能会遇到提示缺少DLL文件&#xff0c;如0xc000007b错误、缺少d3dxxx.dll等问题&#xff0c;这些会影响软件运行甚至导致系统不稳定。以下是一些常见的DLL问题原因和一个修复工具&#xff0c;希望能帮到你。 DLL文件问题的常见原因 软件安装…

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

24. Revit API: 几何对象(五)- (Sur)Face

一、前言 虽然Face是GeometryObject的子类&#xff0c;Surface不是&#xff0c;但这两者之间还是挺有关联的&#xff0c;每个Face都有一个对应的Surface&#xff0c;类似于Edge和Curve的关系。 Surface是数学意义上的面&#xff0c;纯定义。 Face是几何形状&#xff08;实体&a…

css如何设置间距

在CSS中设置间距是非常常见的需求&#xff0c;可以通过多种属性来实现。以下是一些常用的CSS属性及其用法&#xff0c;用于设置元素之间的间距&#xff1a; 内边距&#xff08;Padding&#xff09; padding 属性用于设置元素内容与元素边框之间的距离。可以分别设置四个方向的…

视频质量评价SimpleVQA

目录 一、研究意义 例子 二、介绍 三、文章解读 3.1 论文动机 3.2论文思路 3.3方法 3.3.1网络框架 3.3.2公式解读 3.3.3核心创新 3.3.4理解 &#xff01;&#xff01;&#xff01;作者对模型的改进 本人算法框体 3.3.5实验细节&#xff1a; 四、代码复现 4.1代码文件简介 4.2数…

leetcode第二十六题:删去有序数组的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…

C++之STL—vector容器基础篇

头文件 #include <vector> //vector容器 #include <algorithm> //算法 基本用法&&概念 vector<int> v; v.push_back(10); vector<int >::iterator v.begin(); v.end(); 三种遍历方式 #include <vector> #include <algorithm>…

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…

在线文档搜索服务测试报告

目录 1. 项目背景: 2. 项目功能: 3. 测试计划: 1. 项目背景: 1.1 在线搜索服务的前端主要一下几个功能, 分别是进入搜索引擎界面(有提示输入关键词信息); 进行输入关键词的界面, 以及显示有关关键词的文档url, 点击跳转至目标文档的界面; 1.2 该在线搜索服务的文档可以实现用…

精彩回顾|博睿数据Bonree ONE 3.0产品发布会圆满落幕:三城联动 共襄盛举!

在金秋九月的璀璨时刻&#xff0c;博睿数据于9月20日在北京圆满举办了Bonree ONE 3.0产品发布会的收官之站。此前&#xff0c;这一盛会已在上海、广州相继绽放光彩&#xff0c;三城联动&#xff0c;共襄盛举&#xff0c;不仅展现了博睿数据在可观测性领域的深厚积淀与前瞻视野&…

一行命令,一分钟轻松搞定SSL证书自动续期

httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;专为 Nginx 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。现在的网站SSL免费证书有效期只有3个月&#xff0c;所以就会有经常更快SSL证书的需求&#xff0c;如果手上需要更换的SSL证书比较多的情况下…

leetcode第80题:删除有序数组的重复项(||)

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明&…

【第十一章:Sentosa_DSML社区版-机器学习之分类】

目录 11.1 逻辑回归分类 11.2 决策树分类 11.3 梯度提升决策树分类 11.4 XGBoost分类 11.5 随机森林分类 11.6 朴素贝叶斯分类 11.7 支持向量机分类 11.8 多层感知机分类 11.9 LightGBM分类 11.10 因子分解机分类 11.11 AdaBoost分类 11.12 KNN分类 【第十一章&…