JAVA数据脱敏

2023-10-31

为了保护用户隐私,需要对敏感信息进行脱敏处理,如:姓名、电话号码、身份证

基于jackson,通过自定义注解的方式实现数据脱敏

添加依赖

spring-web、spring-boot-starter-web已经集成了jackson相关包,不用添加

<!--jackson依赖-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

脱敏注解

DesensitizationJsonSerializer.class: 脱敏序列化类

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizationJsonSerializer.class)
public @interface Desensitization {

    Class<? extends AbstractDesensitization> value();

}

脱敏序列化

/**
 * 脱敏序列化
 */
public class DesensitizationJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private AbstractDesensitization desensitization;

    public DesensitizationJsonSerializer() {
    }

    public DesensitizationJsonSerializer(AbstractDesensitization desensitization) {
        this.desensitization = desensitization;
    }

    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(desensitization.serialize(s));;
    }


    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        JsonSerializer<?> jsonSerializer = null;
        if(null == beanProperty) jsonSerializer = serializerProvider.findNullValueSerializer(beanProperty);

        if(!Objects.equals(beanProperty.getType().getRawClass(), String.class))
            jsonSerializer = serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);

        if(Objects.equals(beanProperty.getType().getRawClass(), String.class)){
            jsonSerializer = setDesensitization(jsonSerializer, beanProperty);
        }
        return jsonSerializer;
    }

    /**
     * 设置脱敏
     * @param beanProperty
     * @return
     */
    private JsonSerializer<?> setDesensitization(JsonSerializer<?> jsonSerializer, BeanProperty beanProperty) {
        Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);

        if (desensitization == null) desensitization = beanProperty.getContextAnnotation(Desensitization.class);

        if (desensitization != null) {
            //设置脱敏实例
            try {
                jsonSerializer = new DesensitizationJsonSerializer(desensitization.value().newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return jsonSerializer;
    }
}

脱敏类

脱敏父类

子类通过继承AbstractDesensitization实现扩展

public abstract class AbstractDesensitization {

    /**
     * 脱敏
     * @param value
     * @return
     */
    public abstract String serialize(String value);

}

中文姓名脱敏

public class ChineseNameDesensitization extends AbstractDesensitization {

    @Override
    public String serialize(String value) {
        String serializeValue = "";
        if(value.length() < 3){
            serializeValue = value.replaceAll(".*(?=[\\u4e00-\\u9fa5])","*");
        }else{
            serializeValue = value.replaceAll("(?<=[\\u4e00-\\u9fa5]).*(?=[\\u4e00-\\u9fa5])","*");
        }
        return serializeValue;
    }

}

手机号脱敏

public class MobilePhoneDesensitization extends AbstractDesensitization {

    @Override
    public String serialize(String value) {
        return value.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
    }

}

身份证脱敏

public class IdCardDesensitization extends AbstractDesensitization {

    @Override
    public String serialize(String value) {
        return value.replaceAll("(?<=\\w{3})\\w(?=\\w{4})","*");
    }

}

测试

添加脱敏注解

public class User {

    @Desensitization(ChineseNameDesensitization.class)
    private String name;

    private Integer age;

    @Desensitization(IdCardDesensitization.class)
    private String idCard;

    @Desensitization(MobilePhoneDesensitization.class)
    private String mobilePhone;

	//...get and set
}

新建UserController,查询用户信息

@RestController
public class UserController {

    @GetMapping("/users")
    private List<User> users() throws Exception {
        List<User> girls = new ArrayList<>();
        User user = new User();
        user.setName("西施");
        user.setAge(18);
        user.setIdCard("123456789123456202");
        user.setMobilePhone("12345678901");
        User user2 = new User();
        user2.setName("杨贵妃");
        user2.setAge(18);
        user2.setIdCard("123456789123456202");
        user2.setMobilePhone("12345678901");
        User user3 = new User();
        user3.setName("古代四大美女之一 * 貂蝉");
        user3.setAge(18);
        user3.setIdCard("123456789123456202");
        user3.setMobilePhone("12345678901");
        User user4 = new User();
        user4.setName("古代四大美女之一 * 王昭君");
        user4.setAge(18);
        user4.setIdCard("123456789123456202");
        user4.setMobilePhone("12345678901");
        User user5 = new User();
        user5.setName(null);
        user5.setAge(18);
        user5.setIdCard(null);
        user5.setMobilePhone(null);
        girls.add(user);
        girls.add(user2);
        girls.add(user3);
        girls.add(user4);
        girls.add(user5);
        return girls;
    }
}

返回json效果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA数据脱敏 的相关文章

  • Linux GCC常用命令

    1简介 2简单编译 2 1预处理 2 2编译为汇编代码 Compilation 2 3汇编 Assembly 2 4连接 Linking 3多个程序文件的编译 4检错 5库文件连接 5 1编译成可执行文件 5 2链接 5 3强制链接时使用静
  • Excel做题记录——整数规划优化模型

    文章目录 题目 一 首先根据题目要求提取信息 并列出数学模型 二 通过Excel里的 规划求解 来解出答案 1 创建数据表格 2 根据数学模型设置数据 3 使用 规划求解 功能求解 i 变量都为整数 ii 约束量 总重量 小于等于50 参考
  • 【大数据】——处理框架

    说起大数据处理啊 一切都起源于Google公司的经典论文 在当时 2000年左右 由于网页数量急剧增加 Google公司内部平时要编写很多的程序来处理大量的原始数据 爬虫爬到的网页 网页请求日志 计算各种类型的派生数据 倒排索引 网页的各种

随机推荐

  • EtherNet/IP网络模型

    一 常识入门 0 为什么需要CIP协议 CIP协议 Common Industrial Protocol 是一种工业通信协议 旨在实现不同设备 控制器和系统之间的数据交换和控制 CIP协议的使用有以下几个原因 统一标准 CIP协议是一个公认
  • crawlSpider,分布式爬虫,增量式爬虫

    一 crawlSpider 1 上次了一种爬取全站数据是基于Scrapy框架中的Spider的递归爬取进行实现 Requests模块递归回调parse方法 2 现在在讲介绍一种比较好用的方法 基于CrawlSpider的自动爬取进行实现 更
  • 关于LBP特征等价模式的解释

    为了解决二进制模式过多的问题 提高统计性 Ojala提出了采用一种 等价模式 Uniform Pattern 来对LBP算子的模式种类进行降维 Ojala等认为 在实际图像中 绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变 因此
  • C#操作MSSQL数据库 -增删改查

    要在C 中连接到Microsoft SQL Server数据库 MSSQL 你可以使用 NET Framework提供的System Data SqlClient命名空间中的类 以下是一个简单的示例代码 展示了如何在C 中使用MSSQL数据
  • 二叉查找树特性,优点,缺点

    概述 二叉排序树 Binary Sort Tree 又称二叉查找树 Binary Search Tree 亦称二叉搜索树 是数据结构中的一类 在一般情况下 查询效率比链表结构要高 定义 一棵二叉查找树是一棵二叉树 每个节点都含有一个Comp
  • Snap年度AR生态大会Lens Studio资讯:AR应用状况、制作工具Lens Studio和内容生态

    这两天我阅读了一些公众号关于Snap公司召开的AR生态大会Lens Fest 2021报道 并在官网观看了相关视频 这些资讯让我对AR增强现实目前的应用状况和制作技术有了一个全新的了解 结论 整场大会看完之后 我的感觉主要有三点 过去 人们
  • 封装与解封装

    封装与解封装 封装 将数据变为比特流的过程中 在参考模型的每一层需要添加上特定的协议报头动作 动作 从高层往低层依次封装 在每一层使用特定的协议 对数据进行处理 在数据前添加特定的协议报头 封装原则 1 每一层在上一层数据前添加协议报头 2
  • Tangram 2.0——猫客页面内组件的动态化方案

    Tangram 2 0 库 Android Tangram Android Virtualview Android iOS Tangram iOS Virtualview iOS 背景 技术背景 一直以来 无线应用都在不断寻求动态化页面的解
  • 华为OD机试 - 寻找最大价值的矿堆(Java)

    题目描述 给你一个由 0 空地 1 银矿 2 金矿 组成的的地图 矿堆只能由上下左右相邻的金矿或银矿连接形成 超出地图范围可以认为是空地 假设银矿价值1 金矿价值2 请你找出地图中最大价值的矿堆并输出该矿堆的价值 输入描述 地图元素信息如
  • 台阶--Nim游戏(博弈论)

    问题 现在 有一个 nn 级台阶的楼梯 每级台阶上都有若干个石子 其中第 ii 级台阶上有 aiai 个石子 i 1i 1 两位玩家轮流操作 每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中 不能不拿 已经拿到地面上的石子不能再拿
  • 子网掩码是什么,IP段的24是什么写法

    背景 关于设置 IP 网段 我们常见到的 192 168 1 0 24 是什么意思 24是什么意思 这里的 192 168 1 0 的末尾0是 一定是0吗 跟 192 168 1 5 24 所表示的网段是一样的吗 解答 24 这种写法 24
  • QGC调试px4飞控问题总结

    注 本文主要讨论本人遇到的问题 由于各操作步骤已有不少文章说明具体操作方法 本文不再赘述 1 如果使用碳纤维机架 要在电源板背面增加绝缘层以防短路 如果自行焊接导线 应当检查是否短路 2 传感器校准时尽量不要放到桌子上调 这是因为桌子可能不
  • pytorch 初始化

    初始化权值
  • 蓝桥杯:试题F:青蛙过河问题

    试题描述 小青蛙住在一条河边 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线 小青蛙每次跳跃必须落在一块石头或者岸上 不过 每块石头有一个高度 每次小青蛙从一块石头起跳 这块石头的高度就 会下降 1
  • vue项目 设置scrollTop不起作用 总结

    今天在开发中 遇到这样一个情景 一个页面中有三个模块 每个模块对应一个标题 每个模块内容都很长 所以需要点击当前模块对应的标题滚动到模块所在位置 我想的方案是获取到每个模块距离文档顶部的距离 然后将值赋给对应要滚动的元素 步骤如下 首先给每
  • 【每日运维】RockyLinux8.6升级OpenSSH9.4p1

    为什么需要升级openssh呢 因为很多项目进行漏扫结果都会涉及到这个服务器核心组件 一想到以前升级openssh带来的各种依赖性问题就头疼 不管是什么发行版 升级这个东西真的很烦 这次发现可能还会有好一点的通用一点的升级方法 所以有个这个
  • angular调用接口方式_如何在Angular优雅编写HTTP请求

    引言 基本上当下的应用都会分为前端与后端 当然这种前端定义不在限于桌面浏览器 手机 APP等设备 一个良好的后端会通过一套所有前端都通用的 RESTful API 序列接口作为前后端之间的通信 这其中对于身份认证都不可能再依赖传统的Sess
  • 微信小程序面试题

    1 请谈谈wxml与标准的html的异同 标签名字有点不一样 多了一些 wx if 这样的属性以及 这样的表达式 开发工具限制 WXML仅能在微信小程序开发工具中预览 而HTML可以在浏览器内预览 组件封装不同 WXML对组件进行了重新封装
  • 今年做什么副业好?2021年做什么副业挣钱?2021年适合做的副业

    这两年我明白了一个道理 就是人无远虑必有近忧 所以2021我建议大家最好有一个副业 因为有了副业 即使我们没了工作也会有一定的生活保障 2021年适合做的副业有哪些 2021年做什么副业挣钱呢 第一类 体力类 1 餐饮兼职 虽然收入比较低
  • JAVA数据脱敏

    为了保护用户隐私 需要对敏感信息进行脱敏处理 如 姓名 电话号码 身份证 基于jackson 通过自定义注解的方式实现数据脱敏 添加依赖 spring web spring boot starter web已经集成了jackson相关包 不