Hutool 实现敏感信息展示脱敏及其反脱敏

news2025/2/27 11:14:29

业务需求

将用户敏感信息脱敏展示到前端是出于保护用户隐私和信息安全的考虑。

        敏感信息包括但不限于手机号码、身份证号、银行卡号等,这些信息泄露可能导致用户个人信息的滥用、身份盗用等严重问题。脱敏是一种常用的保护用户隐私的方式,它的目的是减少潜在的风险,同时保持一定的用户信息可读性。

在选择用户信息以及展示选座信息时,用户证件号码的脱敏展示。

Hutool 工具类实现数据脱敏

Hutool包含的组件

Hutool官方文档:信息脱敏工具-DesensitizedUtilicon-default.png?t=N7T8https://link.juejin.cn/?target=https%3A%2F%2Flink.csdn.net%2F%3Ftarget%3Dhttps%3A%2F%2Fwww.hutool.cn%2Fdocs%2F%23%2Fcore%2F%25E5%25B7%25A5%25E5%2585%25B7%25E7%25B1%25BB%2F%25E4%25BF%25A1%25E6%2581%25AF%25E8%2584%25B1%25E6%2595%258F%25E5%25B7%25A5%25E5%2585%25B7-DesensitizedUtil  

<dependency>    
   <groupId>cn.hutool</groupId>   
   <artifactId>hutool-all</artifactId>    
   <version>5.8.16</version>
</dependency>
 
注意 :Hutool 5.x支持JDK8+, 如果你的项目使用JDK7,请使用
Hutool 4.x版本。本文使用的数据脱敏工具类只有在5.6+版本以上才提供。

        Hutool作为一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

        可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块,本文所使用的数据脱敏工具就是在hutool.core模块。

Hutool支持的脱敏数据类型

        Hutool针对数据脱敏业务为不同的敏感数据提供了相应的API来实现脱敏操作,现阶段最新版本的Hutool支持的脱敏数据类型如下,基本覆盖了常见的敏感信息。

  1. 用户id

  2. 中文姓名

  3. 身份证号

  4. 座机号

  5. 手机号

  6. 地址

  7. 电子邮件

  8. 密码

  9. 中国大陆车牌,包含普通车辆、新能源车辆

  10. 银行卡

Hutool提供的脱敏方法如下图所示:

注意 :Hutool 脱敏是通过 * 来代替敏感信息的,具体实现是在StrUtil.hide( )方法中,如果我们想要自定义隐藏符号,则可以把Hutool的源码拷出来,重新实现即可。

API演示
/**
	 * 【手机号码】前三位,后4位,其他隐藏,比如135****2210
	 *
	 * @param num 移动电话;
	 * @return 脱敏后的移动电话;
	 */
	public static String mobilePhone(String num) {
		if (StrUtil.isBlank(num)) {
			return StrUtil.EMPTY;
		}
		return StrUtil.hide(num, 3, num.length() - 4);
	}
 
    /**
	 * 【地址】只显示到地区,不显示详细地址,比如:北京市海淀区****
	 *
	 * @param address       家庭住址
	 * @param sensitiveSize 敏感信息长度
	 * @return 脱敏后的家庭地址
	 */
	public static String address(String address, int sensitiveSize) {
		if (StrUtil.isBlank(address)) {
			return StrUtil.EMPTY;
		}
		int length = address.length();
		return StrUtil.hide(address, length - sensitiveSize, length);
	}
 
	/**
	 * 【密码】密码的全部字符都用*代替,比如:******
	 *
	 * @param password 密码
	 * @return 脱敏后的密码
	 */
	public static String password(String password) {
		if (StrUtil.isBlank(password)) {
			return StrUtil.EMPTY;
		}
		return StrUtil.repeat('*', password.length());
	}

搭建Jackson序列化体系

现在有了数据脱敏工具类,如果前端需要显示数据数据的地方比较多,我们不可能在每个地方都调用一个工具类,这样就显得代码太冗余了,那我们如何通过注解的方式优雅的完成数据脱敏呢?

实现思路

在 SpringMVC 返回数据时,通过默认的 Jackson 序列化器进行指定,替换为咱们已经包装后的序列化器,这样就能依赖现有解决方案,降低技术复杂度。

代码实现

定义手机号和证件号的 Jackson 自定义序列化器,并在对应需要脱敏的敏感字段上指定自定义序列化器。

1)身份证号序列化器。

public class IdCardDesensitizationSerializer extends JsonSerializer<String> {
 
    @Override
    public void serialize(String idCard, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String phoneDesensitization = DesensitizedUtil.idCardNum(idCard, 4, 4);
        jsonGenerator.writeString(phoneDesensitization);
    }
}

2)手机号序列化器。

public class PhoneDesensitizationSerializer extends JsonSerializer<String> {
 
    @Override
    public void serialize(String phone, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String phoneDesensitization = DesensitizedUtil.mobilePhone(phone);
        jsonGenerator.writeString(phoneDesensitization);
    }
}

3)敏感字段上自定义序列化器。

@Data
@Accessors(chain = true)
public class PassengerRespDTO {
 
    /**
     * 证件号码
     */
    @JsonSerialize(using = IdCardDesensitizationSerializer.class)
    private String idCard;
 
    /**
     * 手机号
     */
    @JsonSerialize(using = PhoneDesensitizationSerializer.class)
    private String phone;
}

完成上述步骤后,前端调用 HTTP 请求获取数据时,SpringMVC 通过 Jackson 进行序列化数据时,操作证件号码和手机号两个字段就会采用咱们自定义的序列化器,完成敏感信息脱敏功能。


脱敏数据反脱敏

        对接前端的敏感数据脱敏展示功能做到上面这些就已经实现了。但是总感觉哪里不对,因为咱们在购票服务中,下单接口会调用乘车人详细信息接口获取到手机号、证件号等信息保存入库。

        如果我在后端服务里去调用乘车人的信息接口,那岂不是也是脱敏的?这样的话,存储到数据库的数据就不准确了,期望是真实的数据,但是实际是脱敏后的。为此,我们需要想办法把自己脱敏后的数据还原回来,这里介绍几种思路:

Redis缓存原始数据

        将脱敏后的数据和一个随机id一起封装为个对象一起传给前端,我在redis中以这个id为key,未脱敏值为value,当前端需要基于脱敏数据进行相关操作就传个id过来让我后端在redis找到该数据的原始态

        这种方案比较适用于脱敏数据较少的情况,一般对于这种敏感数据展示的需求是比较少的,但是为了实现这么个反脱敏的操作我得浪费一大块缓存取时刻保持一份热点也许相对较小的数据,一个项目的用户量上来了,他们的手机号、身份证号等等敏感数据越来越多,那这样子缓存的占比也越来越大。

对称算法加解密

        这种模式的脱敏就不是运用我们前面提到的替换操作,而是一种对称加解密的过程,将敏感数据采用一个对称算法加密后传输给前端,前端将其传入到后端后再凭借对称解密的方式还原原始数据。

        这种方式优点在于对称加密算法可以提供较高的安全性,只有持有密钥的人才能解密敏感数据,降低了数据泄露的风险。并且对称加解密算法通常具有较高的执行效率,可以快速地对数据进行加解密操作。但是缺点也很明显,由于对称加解密方式是全盘加密和解密,无法对敏感数据进行细粒度的控制,比如只加密部分字段或片段。并且有被拦截通过一些工具进行解码风险,从而泄露数据。

总结

        本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点Hutool工具及其使用方法,在此基础上进行了实操,分别演示了使用DesensitizedUtil工具类、配合Jackson通过注解的方式完成数据脱敏;最后,介绍了一些常见的数据反脱敏方法,本文内容如有不当之处,还请大家批评指正。

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

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

相关文章

#[量化投资-学习笔记018]Python+TDengine从零开始搭建量化分析平台-正态分布与收益率

正态分布(Normal Distribution)又叫高斯分布、常态分布。通常用来描述随机变量的概率分布。 自然界的数据分布通常是符合正态分布规律的&#xff0c;比如说人的身高、体重。但是非自然界数据就不一定了。尤其是经过人为加工过的数据。 金融领域大量使用正态分布来计算收益率和…

R语言提取文字(字符串)中的内容--正则式(2)

科学研究中有时候咱们收集到的数据很乱&#xff0c;不能马上进行分析&#xff0c;如SEER数据&#xff0c;用过都知道&#xff0c;咱们需要对数据进行清洗&#xff0c;从数据中提取咱们需要的东西&#xff0c;才能进行分析&#xff0c;这时候有个有用的东西叫正则式&#xff0c;…

iceoryx(冰羚)-简介

概要 RouDi RouDi是Routing and Discovery的缩写。RouDi负责通信设置&#xff0c;但实际上并不参与发布者与订阅者或客户端与服务器之间的通信。鲁迪可以被认为是iceoryx的总机操作员。它的另一个主要任务是设置共享内存&#xff0c;应用程序使用共享内存交换有效负载数据。Ro…

Go语言常用命令详解(一)

文章目录 前言常用命令go build示例参数说明 go test示例参数说明 go run示例参数说明 go clean示例参数介绍 总结写在最后 前言 Go语言是一种开源的编程语言&#xff0c;由Google开发并于2009年首次发布。它以其简洁、高效和并发性能而备受开发者的喜爱。作为一门相对年轻的语…

本地视频AI人脸替换,一键启动,傻瓜式操作

本地无须准备配置和运行环镜&#xff0c;整个压缩包下载后解压&#xff0c;一键启动程序&#xff0c;只需一张照片和一个视频&#xff0c;就可以把视频中的人物替换成您想要的人脸。支持CPU和GPU解码&#xff0c;使用GPU解码速度较快。 所有使用的软件安装包已上传网盘&#x…

提升pip速度!设置pip全局镜像源,速度飞起!

文章目录 💢 问题 💢💯 解决方案 💯🐾 镜像源🐾 镜像全局配置🍄 Windows系统🍄 Linux和macOS系统🍄 添加环境变量的方式💢 问题 💢 由于“某些网络限制”原因,我们在使用pip安装python模块的时候速度会比较慢,这个时候我们就需要用到一些镜像源,本文将…

requests 技术问题与解决方案:解决字典值中列表在URL编码时的问题

本文将探讨 issue 80 中提出的技术问题及其解决方案。该问题主要涉及如何在模型的 _encode_params 方法中处理列表作为字典值的情况。 问题背景 在处理用户提交的数据时&#xff0c;有时需要将字典序列化为 URL 编码字符串。在 requests 库中&#xff0c;这个过程通常通过 par…

点成分享丨如何提高旋转蒸发仪的蒸馏提纯效率

旋转蒸发仪&#xff1a; 主要用于医药、化工和制药等行业的浓缩、结晶、干燥、分离及溶媒回收。其原理为在真空条件下&#xff0c;恒温加热&#xff0c;使旋转瓶恒速旋转&#xff0c;物料在瓶壁形成大面积薄膜&#xff0c;高效蒸发。溶媒蒸气经高效玻璃冷凝器冷却&#xff0c;…

如何修改Hosts文件(Windows、Linux)本机配置域名解析

Hosts文件是一种在计算机网络中存储主机名与IP地址对应关系的文本文件。通过配置Hosts文件&#xff0c;可以避免在网络环境中DNS无法正常解析时&#xff0c;出现无法访问互联网的问题。 Windows修改hosts文件 1 以windows10系统为例&#xff0c;手指同时按住 windows 键和 X 键…

《洛谷深入浅出基础篇》P1536 村村通——并查集

上链接&#xff1a;P1536 村村通 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1536 上题干&#xff1a; 题目描述 某市调查城镇交通状况&#xff0c;得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程…

Flutter 3.16 发布,快来看有什么更新吧

参考原文&#xff1a;https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1 Flutter 又又又发布新季度更新啦&#xff0c;同时随着而来的还有 Dart 3.2&#xff0c;本次 3.16 开始 Material 3 会成为新的默认主题&#xff0c;另外 Android 也迎来了 Impeller 的…

力扣第797题 所有可能的路径 C++ 深度优先搜索 +java

题目 797. 所有可能的路径 中等 相关标签 深度优先搜索 广度优先搜索 图 回溯 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从…

郑州市管城区工信局局长任华民一行莅临中创算力调研指导工作

2023年11月15日&#xff0c;为深入了解企业生产经营情况&#xff0c;解决发展诉求。郑州市管城区工信局局长任华民等领导一行莅临中创算力&#xff0c;中创副总经理杨光、技术总监刘朝阳、行政主管生田等人员陪同调研。 调研期间&#xff0c;双方就生产经营、“算力数据中心”…

零基础学Python怎么学习?我来告诉你

对于IT新手来说&#xff0c;零基础学Python的话&#xff0c;之后可选择的职业方向非常多。Python全栈和爬虫一直以来都是市场的最火的就业岗位之一&#xff0c;它们的薪资回报也算是开发岗里面的顶级了。而且随着大数据和人工智能时代的到来&#xff0c;数据处理和人工智能行业…

Python | 机器学习之逻辑回归

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之逻辑回归概念 1.1 机器学习 1.2 逻辑回归 2. 逻辑回归 2.1 实验目的…

通过注释来埋点

目录 开始 插件编写 功能一 功能二 功能三 合并功能 运行代码 总结 这篇文章主要讲如何根据注释&#xff0c;通过babel插件自动地&#xff0c;给相应函数插入埋点代码&#xff0c;在实现埋点逻辑和业务逻辑分离的基础上&#xff0c;配置更加灵活 这篇文章想要达到的效…

idea查看UML类图

idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包&#xff0c;鼠标右键&#xff0c;选择Diagrams->Show Diagram 1.2 对于UML类图中的包&#xff0c;选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱&#xff…

inner join left join 什么情况效果相同

效果不同的情况 SELECT g.name AS groupName, g.root_code AS rootCode, g.data_sort AS groupDataSort, l.* FROM wise_system_point_group g LEFT JOIN wise_system_point_list l ON g.code l.group_code WHERE g.code "drug" ORDER BY g.data_sort, l.data_s…

DBA_IND_STATISTICS 字段含义

功能 展示数据库中所有索引的优化器统计信息。 字段说明 参考&#xff1a;https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000885743

骨传导式蓝牙耳机值得入手吗?盘点最值得入手的5款骨传导耳机

在骨传导耳机还没有火之前&#xff0c;相信很多朋友都是使用入耳式和头戴式耳机比较多一点&#xff0c;但是慢慢的会发现&#xff0c;这两种耳机都存在很大的问题&#xff0c;比如说入耳式耳机&#xff0c;长时间佩戴会造成耳朵痛等问题&#xff0c;而头戴式耳机因为隔音效果好…