脱敏技术!!!

什么是数据脱敏???

数据脱敏(Data Masking)是一种数据安全技术,旨在通过预先设定的规则和算法,对原始数据中包含的敏感信息进行变形处理,使得这些信息在非生产环境(例如开发、测试、分析或培训场景)中使用时,既能保持原有数据格式和业务逻辑的真实性,又能有效保护个人隐私和商业机密不被泄露。

在实施数据脱敏时,对诸如身份证号、手机号、银行卡号、个人姓名、家庭住址、电子邮件地址、医疗记录等敏感信息采取替换、遮盖、乱序、加密、截断等手段进行处理,以防止这些敏感信息在未经授权的情况下被识别或滥用。

具体脱敏规则可以包括但不限于:

  • 替换:例如将身份证号的部分数字替换为“*”或随机数。

  • 随机化:例如生成与真实数据格式相符但与原始数据无关的新数据。

  • 固定模式脱敏:例如保留电话号码的区号和最后几位,其余部分替换。

  • 加密:对数据进行不可逆或可逆加密,仅在必要时解密。

  • 假名化:用虚构的名字替换真实姓名。

代码实现:主要是使用hutool中的脱敏方法(DesensitizedUtil)来实现

1、首先建立一个spring boot项目

<dependency>
                <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.8.16</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--json模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

2、创建注解Desensitization

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
//@Target用于限制自定义注解可以应用于哪些程序元素
//ElementType.FIELD:可以应用于字段、枚举常量声明。
@JacksonAnnotationsInside
//作用是将一组注解合并到一个新的注解中。当这个新注解被应用到类或字段上时,实际上相当于应用了它所包含的所有注解。
@JsonSerialize(using = DesensitizationSerialize.class)
//用于自定义 Java 对象如何序列化成 JSON 格式
public @interface Desensitization {
    /**
     * 脱敏数据类型,只要在CUSTOMER的时候,startInclude和endExclude生效
     */
    DesensitizationTypeEnum type() default DesensitizationTypeEnum.CUSTOMER;
 
    /**
     * 开始位置(包含)
     */
    int startInclude() default 0;
 
    /**
     * 结束位置(不包含)
     */
    int endExclude() default 0;
}

3.建立脱敏需要的枚举类

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

4.创建自定义的序列化脱敏类

@NoArgsConstructor
@AllArgsConstructor
public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {
    // 保存敏感信息处理规则的枚举
    private DesensitizationTypeEnum type;

    private Integer startInclude;

    private Integer endExclude;
    // JsonGenerator 主要用于生成 JSON 数据并将其输出到各种类型的输出流
    //serialize 方法本身并不直接提供数据脱敏功能,它主要是为了将表单数据转换为可传输的字符串格式
    @Override
    public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        switch (type) {
            //自定义 Java 对象如何序列化成 JSON 格式
            // 自定义类型脱敏
            case CUSTOMER:
                //通过使用 CharSequenceUtil 类,开发者可以更加方便地进行字符串相关的编程工作,避免了重复编写基础的字符串处理逻辑
                jsonGenerator.writeString(CharSequenceUtil.hide(str,startInclude,endExclude));
                break;
            // userId脱敏
            case USER_ID:
                jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));
                break;
            // 中文姓名脱敏
            case CHINESE_NAME:
                jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));
                break;
            // 身份证脱敏
            case ID_CARD:
                jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str), 1, 2));
                break;
            // 固定电话脱敏
            case FIXED_PHONE:
                jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));
                break;
            // 手机号脱敏
            case MOBILE_PHONE:
                jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str)));
                break;
            // 地址脱敏
            case ADDRESS:
                jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str), 8));
                break;
            // 邮箱脱敏
            case EMAIL:
                jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str)));
                break;
            // 密码脱敏
            case PASSWORD:
                jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str)));
                break;
            // 中国车牌脱敏
            case CAR_LICENSE:
                jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str)));
                break;
            // 银行卡脱敏
            case BANK_CARD:
                jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str)));
                break;
            default:
        }
    }

    //BeanProperty 参数代表Java Bean中正在被反序列化的属性,  初始化或定制该反序列化器的行为。
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        if (beanProperty != null) {
            // 判断数据类型是否为String类型
            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
                // 获取定义的注解
                Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);
                // 为null
                if (desensitization == null) {
                    //就可以通过 getContextAnnotation 来找到这个注解并据此调整属性的序列化或反序列化行为
                    desensitization = beanProperty.getContextAnnotation(Desensitization.class);
                }
                // 不为null
                if (desensitization != null) {
                    // 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。
                    return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(),
                            desensitization.endExclude());
                }
            }
            //查找和提供合适的序列化器(JsonSerializer)来处理给定类型的数据
            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }
        return serializerProvider.findNullValueSerializer(null);
    }
}

5.测试:创建实例类添加脱敏注解

@Data
public class TestAnnotationDTO implements Serializable {
    /**
     * 自定义
     */
    @Desensitization(type = DesensitizationTypeEnum.CUSTOMER,startInclude = 5,endExclude = 10)
    private String custom;
    /**
     * 手机号
     */
    @Desensitization(type = DesensitizationTypeEnum.MOBILE_PHONE)
    private String phone;
    /**
     * 邮箱
     */
    @Desensitization(type = DesensitizationTypeEnum.EMAIL)
    private String email;
    /**
     * 身份证
     */
    @Desensitization(type = DesensitizationTypeEnum.ID_CARD)
    private String idCard;
 
 
}

 6、测试类

@RestController
@RequestMapping("/test")
public class TestApi {
 
    @GetMapping("/test-annotation")
    public TestAnnotationDTO testAnnotation(){
        TestAnnotationDTO testAnnotationDTO = new TestAnnotationDTO();
        testAnnotationDTO.setPhone("17634388363");
        testAnnotationDTO.setCustom("111111111111111111");
        testAnnotationDTO.setEmail("1433926101@qq.com");
        testAnnotationDTO.setIdCard("4444199810015555");ce
        return testAnnotationDTO;
    }
 
}

7、启动项目:http://localhost:8080/test/test-annotation

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

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

相关文章

OpenHarmony实战开发-从0到1实现购物应用页面

概述 OpenHarmony ArkUI框架提供了丰富的动画组件和接口&#xff0c;开发者可以根据实际场景和开发需求&#xff0c;选用丰富的动画组件和接口来实现不同的动画效果。 本Codelab中&#xff0c;我们会构建一个简易的购物应用。应用包含两级页面&#xff0c;分别是主页&#xf…

【正点原子FreeRTOS学习笔记】————(7)任务调度

这里写目录标题 一、开启任务调度器&#xff08;熟悉&#xff09;二、启动第一个任务&#xff08;熟悉&#xff09;2.1&#xff0c;prvStartFirstTask () /* 开启第一个任务 */2.2&#xff0c;vPortSVCHandler () /* SVC中断服务函数 */ 三、任务切换&#xff08;掌握&#xff…

【元胞自动机】MATLAB界面聚合的元胞自动机模拟完整实现运行

文末有完整代码分享链接 文件介绍 automain 为元胞自动机主函数 choosedirection 选择方向函数&#xff0c;主函数调用 judgedirection 判断位置函数&#xff0c;主函数调用 neighbor 求每个元胞的邻居函数&#xff0c;主函数调用 surfaceness 求表面粗糙度 porosity 求孔隙率…

开源AI引擎|信息抽取与文本分类项目案例:提升12345政务投诉处理效率

一、实际案例介绍 采集员案件上报流程是城市管理和问题解决的关键环节&#xff0c;涉及对案件类别的选择、案件来源的记录、详细案件描述的填写以及现场图片的上传。这一流程要求采集员准确、详细地提供案件信息&#xff0c;以便系统能够自动解析关键数据并填写相关内容&#…

Python读取PDF文字转txt,解决分栏识别问题,能读两栏

搜索了一下&#xff0c;大致有这些库能将PDF转txt 1. PyPDF/PyPDF2&#xff08;截止2024.03.28这两个已经合并成了一个&#xff09;pypdf PyPI 2. pdfplumber GitHub - jsvine/pdfplumber: Plumb a PDF for detailed information about each char, rectangle, line, et cete…

VSCode 如何同步显示网页在手机或者平板上

首先要确保 ①电脑上安装了VsCode ②VsCode安装插件LiveServer 安装成功之后 连续按住 Alt L 、Alt O 会跳转到对应的html页面上 http://127.0.0.1:5500/....... 是这个开头的 然后打开网络 如果桌面有网上邻居的可以直接点桌面的网上邻居 进来找到WLAN这个…

spark核心概念

DAG 所谓DAG就是有向无环图&#xff0c;其实就是个无环的流程&#xff0c;Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler!则为Spark核心实现的重要一环&#xff0c;其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据&#xff0c;根据…

AI智能分析网关V4如何使用GB28181注册到EasyCVR平台?具体步骤是什么?

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…

JavaScript基础练习题之计算数组元素的和与平均值

一、如何使用JavaScript计算数组元素的和与平均值&#xff1f; 二、正确的源程序 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>计算数组元素的和与平均值</title></head><body><h1>计算数组元…

HarmonyOS 应用开发之AbilityStage组件容器

AbilityStage是一个 Module 级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默认工程中未自动生成Ab…

Linux常见指令解析一

Linux常见指令解析一 常见指令1. ls 指令2.pwd 命令3.cd 命令4.touch 命令5.mkdir 命令6.rmdir指令 && rm 指令7.man 指令8.cp 指令9.cat 命令 && tac 命令10.mv 指令11.more 指令12.less 指令13.head 指令14.tail 指令15.cal 指令 常见指令 1. ls 指令 语法…

包含具有多种类型信息的3D模型

1982年&#xff0c;Gbor Bojr开始使用类似于1975年的建筑描述系统技术来开发建筑信息软件。随后&#xff0c;1984年Bojr发布了用于Apple Lisa操作系统的Graphisoft的Radar CH。该软件技术被称为ArchiCAD于1987年重新推出&#xff0c;这是第一个能够在个人计算机上运行的建筑信息…

【源码分析】一文看透集合容器

一文看透集合容器 一、Mapa. HashMapb.ConcurrentHashMapc.HashTabled. TreeMap 二、Collectiona. ListArrayListLinkedListVectorCopyOnWriteArrayList对比和自身思考思考&#xff1a;为什么都拒绝使用Vector啊&#xff1f;它线程安全诶 b. SetHashSetTreeSetCopyOnWriteArray…

2024年【烟花爆竹产品涉药】免费试题及烟花爆竹产品涉药考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【烟花爆竹产品涉药】免费试题及烟花爆竹产品涉药考试技巧&#xff0c;包含烟花爆竹产品涉药免费试题答案和解析及烟花爆竹产品涉药考试技巧练习。安全生产模拟考试一点通结合国家烟花爆竹产品涉药考试最新大纲…

135.分发糖果

javapublic class Solution {public int candy(int[] ratings) {// 获取孩子人数int len ratings.length;// 初始化一个数组存储每个孩子的糖果数&#xff0c;默认第一个孩子有1颗糖果int[] candyVec new int[len];candyVec[0] 1;// 阶段1&#xff1a;从左到右遍历for (int …

MongoDB内存过高问题分析解决

告警 公司有个3.2.7版本的mongo复制集&#xff0c;最近几天频繁告警内存过高。 服务器配置16C64G内存。mongo备节点内存使用到55G&#xff0c;触发告警。 以下内容基于3.2.7版本&#xff0c;3.2.7版本已经太老&#xff0c;很多后来的命令和配置&#xff0c;3.2.7都没有。 …

C++自主点餐系统

一、 题目 设计一个自助点餐系统&#xff0c;方便顾客自己点餐&#xff0c;并提供对餐厅销售情况的统计和管理功能。 二、 业务流程图 三、 系统功能结构图 四、 类的设计 五、 程序代码与说明 头文件1. SystemMap.h #pragma once #ifndef SYSTEMMAP #define SYSTEMMAP #in…

vue3全局引入element-plus使用Message教程

文章目录 安装引入 Element Plus和组件样式示例注意安装与引入&#xff1a;按需引入&#xff1a;API 使用&#xff1a;样式问题&#xff1a;组件上下文&#xff1a;版本兼容性&#xff1a;错误处理&#xff1a; 这是 Element UI 的 Vue 3 版本。ElMessage 是 Element Plus 中的…

在Linux上使用nginx反向代理部署Docker网站

在政务云上部署Web环境&#xff0c;为了保证服务器安全&#xff0c;甲方只开放一个端口且只允许使用https协议进行访问&#xff0c;经过思考&#xff0c;决定使用docker部署网站&#xff0c;使用nginx反向代理&#xff0c;通过不同的二级域名访问不同的端口。 1 使用docker部署…

编程语言|C语言——C语言变量的存储方式

前言 变量是程序中数据的存储空间的抽象。变量的存储方式可分为静态存储和动态存储两种。 静态存储变量通常是在程序编译时就分配一定的存储空间并一直保持不变&#xff0c;直至整个程序结束。在上一部分中介绍的全局变量的存储方式即属于此类存储方式。 动态存储变量是在程序执…