SpringBoot实战:轻松实现接口数据脱敏

文章目录

  • 引言
  • 一、接口数据脱敏概述
    • 1.1 接口数据脱敏的定义
    • 1.2 接口数据脱敏的重要性
    • 1.3 接口数据脱敏的实现方式
  • 二、开发环境
  • 三、实现接口返回数据脱敏
    • 3.1 添加依赖
    • 3.2 创建自定义注解
    • 3.3 定义脱敏枚举类
    • 3.4 创建自定义序列化类
  • 四、测试
    • 4.1 编写测试代码
    • 4.2 测试
  • 五、总结

在这里插入图片描述

引言

在当今的信息化时代,数据安全尤为重要。接口返回数据脱敏是一种重要的数据保护手段,可以防止敏感信息通过接口返回给客户端,降低数据泄露的风险。本文旨在探讨如何在SpringBoot应用程序中实现接口返回数据脱敏。我们将介绍一种基于自定义注解结合Hutool脱敏工具类的方案,以实现SpringBoot中的接口返回数据脱敏。

一、接口数据脱敏概述

1.1 接口数据脱敏的定义

接口数据脱敏是指在Web应用程序的API接口返回数据时,对包含敏感信息的字段进行处理,使其部分或全部信息被隐藏或替换,以防止敏感信息的泄露。这个过程通常不会改变数据的原始格式,而是通过特定的算法或规则,将敏感部分替换为特定字符(如星号*)或者保留部分信息。

1.2 接口数据脱敏的重要性

数据脱敏的重要性主要体现在以下几个方面:

  1. 保护用户隐私: 对于姓名、身份证号、手机号等个人敏感信息进行脱敏,可以有效保护用户隐私,防止信息被滥用。
  2. 遵守法律法规: 许多国家和地区都制定了严格的数据保护法规,如欧盟的GDPR和中国的《个人信息保护法》。实施数据脱敏有助于企业合规经营。
  3. 降低安全风险: 通过脱敏处理,即使数据不慎泄露,也能最大限度地减少敏感信息被盗用的风险。
  4. 支持数据共享: 在保护隐私的同时,脱敏数据仍然保留了一定的分析价值,有利于数据的安全共享和利用。

1.3 接口数据脱敏的实现方式

  1. 手动脱敏:在业务逻辑层直接对敏感数据进行处理。这种方式灵活但容易遗漏,且代码重复率高。

  2. AOP(面向切面编程):通过切面拦截返回数据,统一处理敏感字段。这种方式可以集中管理脱敏逻辑,但可能影响性能。

  3. 自定义序列化器:利用JSON序列化框架(如Jackson)的自定义序列化器来处理敏感字段。这种方式性能较好,且与业务逻辑解耦。

  4. 注解+反射:通过自定义注解标记需要脱敏的字段,然后利用反射机制在运行时进行脱敏处理。这种方式使用简单,易于维护。

本文将重点介绍如何结合自定义注解和Hutool工具类来实现接口数据脱敏。

二、开发环境

  • JDK版本:JDK 17
  • Spring Boot版本:Spring Boot 3.2.2
  • 构建工具:Maven

三、实现接口返回数据脱敏

3.1 添加依赖

首先在 pom.xml 文件中添加必要的依赖:

    <!-- Hutool工具包 -->    
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency><!-- Jackson依赖 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</version></dependency>

3.2 创建自定义注解

接下来,我们创建一个自定义注解 @Desensitize

/*** 用于标记字段需要进行脱敏处理的注解** @author shijun* @date 2024/07/09*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizeSerializer.class)
public @interface Desensitize {/*** 脱敏类型*/DesensitizeType type() default DesensitizeType.DEFAULT;/*** 脱敏起始位置*/int startInclude() default 0;/*** 脱敏结束位置*/int endExclude() default 0;}

3.3 定义脱敏枚举类

然后,定义枚举类 DesensitizeType 来定义字段的脱敏类型:

/*** 脱敏类型枚举类*/
public enum DesensitizeType {/*** 默认脱敏*/DEFAULT,/*** 自定义脱敏*/CUSTOM_RULE,/*** 手机号脱敏*/PHONE,/*** 电子邮件脱敏*/EMAIL,/*** 身份证号脱敏*/ID_CARD,/*** 银行卡号脱敏*/BANK_CARD,/*** 地址脱敏*/ADDRESS,/*** 中文姓名脱敏*/CHINESE_NAME,/*** 密码脱敏*/PASSWORD,
}

3.4 创建自定义序列化类

Hutool支持的脱敏数据类型包括:

  1. 用户id
  2. 中文姓名
  3. 身份证号
  4. 座机号
  5. 手机号
  6. 地址
  7. 电子邮件
  8. 密码
  9. 中国大陆车牌,包含普通车辆、新能源车辆
  10. 银行卡

整体来说,所谓脱敏就是隐藏掉信息中的一部分关键信息,用*代替。大家可以自己看一看DesensitizedUtil类中方法,其实就是replace方法和hide方法的使用,想要自定义规则进行隐藏可以仿照进行实现。

/*** 脱敏序列化器,用于在序列化字符串时根据不同的脱敏类型进行数据脱敏。** @author shijun* @date 2024/07/08*/
public class DesensitizeSerializer extends JsonSerializer<String> implements ContextualSerializer {/*** 脱敏类型,默认为DEFAULT*/private DesensitizeType type;/*** 脱敏起始位置*/private int startInclude;/*** 脱敏结束位置*/private int endExclude;public DesensitizeSerializer() {this.type = DesensitizeType.DEFAULT;}public DesensitizeSerializer(DesensitizeType type) {this.type = type;}/*** 序列化字符串时调用,根据脱敏类型对字符串进行相应的脱敏处理。** @param value       待序列化的字符串* @param gen         JSON生成器,用于写入处理后的字符串* @param serializers 序列化器提供者,用于获取其他序列化器* @throws IOException 如果序列化过程中发生I/O错误*/@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {switch (type) {case CUSTOM_RULE:// 这里是对字符串的startInclude到endExclude字段进行隐藏处理,如果想要实现两端保留,可以考虑使用StrUtil的replace方法gen.writeString(StrUtil.hide(value, startInclude, endExclude));break;case PHONE:gen.writeString(DesensitizedUtil.mobilePhone(value));break;case EMAIL:gen.writeString(DesensitizedUtil.email(value));break;case ID_CARD:gen.writeString(DesensitizedUtil.idCardNum(value, 1, 2));break;case BANK_CARD:gen.writeString(DesensitizedUtil.bankCard(value));break;case ADDRESS:gen.writeString(DesensitizedUtil.address(value, 8));break;case CHINESE_NAME:gen.writeString(DesensitizedUtil.chineseName(value));break;case PASSWORD:gen.writeString(DesensitizedUtil.password(value));break;default:gen.writeString(value);break;}}/*** 根据上下文信息创建自定义的序列化器,用于处理带有@Desensitize注解的属性。** @param prov     序列化器提供者,用于获取其他序列化器* @param property 当前属性的信息,用于获取注解和属性类型* @return 自定义的序列化器实例*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {if (property != null) {Desensitize annotation = property.getAnnotation(Desensitize.class);if (annotation != null) {this.type = annotation.type();if (annotation.type() == DesensitizeType.CUSTOM_RULE) {this.startInclude = annotation.startInclude();this.endExclude = annotation.endExclude();}}}return this;}}

代码分析:

  • serialize方法在序列化字符串时被调用,根据脱敏类型对字符串进行相应的脱敏处理。根据不同的脱敏类型,使用不同的处理方法对字符串进行脱敏,并将处理后的字符串写入JSON生成器中。
  • createContextual方法根据上下文信息创建自定义的序列化器,用于处理带有@Desensitize注解的属性。它通过获取注解中的脱敏类型和自定义规则的起始位置和结束位置,对实例进行相应的设置,并返回自定义的序列化器实例。

这个序列化器的主要用途是在 JSON 序列化过程中自动对标记了 @Desensitize 注解的字段进行脱敏处理。

四、测试

4.1 编写测试代码

  1. 编写实体类
@Data
public class UserDTO {/*** 用户姓名*/@Desensitize(type = DesensitizeType.CHINESE_NAME)private String name;/*** 用户手机号*/@Desensitize(type = DesensitizeType.PHONE)private String phoneNumber;/*** 用户电子邮件地址*/@Desensitize(type = DesensitizeType.EMAIL)private String email;/*** 用户密码*/@Desensitize(type = DesensitizeType.PASSWORD)private String password;/*** 用户身份证号码*/@Desensitize(type = DesensitizeType.ID_CARD)private String idCard;/*** 用户银行卡号*/@Desensitize(type = DesensitizeType.BANK_CARD)private String bankCard;/*** 用户地址*/@Desensitize(type = DesensitizeType.ADDRESS)private String address;/*** 游戏名称*/@Desensitize(type = DesensitizeType.CUSTOM_RULE, startInclude = 2, endExclude = 6)private String gameName;
}
  1. 编写测试接口
@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/desensitize")public UserDTO getUser() {UserDTO userDTO = new UserDTO();userDTO.setName("孙大圣");userDTO.setEmail("shijun@163.com");userDTO.setPhoneNumber("12345678901");userDTO.setPassword("123456");userDTO.setAddress("辽宁省盘锦市兴隆台区红村乡441号");userDTO.setIdCard("447465200912089605");userDTO.setBankCard("6217000000000000000");userDTO.setGameName("超级无敌大铁锤");return userDTO;}}

4.2 测试

image-20240709170909054

五、总结

在本文中,我们探讨了在SpringBoot应用程序中实现数据脱敏的重要性,并提出了通过自定义注解结合Hutool脱敏工具类实现数据脱敏的解决方案。通过这个方案,我们能够有效地对敏感数据进行脱敏处理,从而保护用户隐私和数据安全,希望对大家有所帮助😊。

在这里插入图片描述

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

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

相关文章

vmware workstation安装debian虚拟机有时无法访问windows共享文件夹

问题 安装好debian12之后&#xff0c;已经按要求安装了vmhgfs工具&#xff0c;然后进行文件共享&#xff0c;是可以连接上的&#xff0c;但重启虚拟机后&#xff0c;共享文件夹就无法访问了 解决办法&#xff0c;参考&#xff1a;在 Linux 客户机中装载共享文件夹的办法 vmh…

C++基础(七):类和对象(中-2)

上一篇博客学的默认成员函数是类和对象的最重要的内容&#xff0c;相信大家已经掌握了吧&#xff0c;这一篇博客接着继续剩下的内容&#xff0c;加油&#xff01; 目录 一、const成员&#xff08;理解&#xff09; 1.0 引入 1.1 概念 1.2 总结 1.2.1 对象调用成员函数 …

多尺度旋转编码

ROPE编码中不使用所有维度旋转同样的角度&#xff0c;而是对成对的维度进行不同的旋转角度&#xff0c;这样设计的原因在于它能够捕捉不同尺度上的位置信息&#xff0c;并且更好地处理长序列数据。让我们更详细地解释一下&#xff1a; 1. 多尺度位置信息 通过对不同维度成对使…

自动群发消息插件常用源代码科普!

随着网络技术的快速发展&#xff0c;自动群发消息插件成为了众多企业和个人提高效率、加强沟通的重要工具。 然而&#xff0c;开发一个高效且稳定的自动群发消息插件并非易事&#xff0c;需要深入理解并熟练掌握相关的源代码。 本文将从五个方面&#xff0c;通过具体的源代码…

Ubuntu 添加so库搜索路径

方法一&#xff1a; 修改 /etc/ld.so.conf文件 将需要配置的库复制到一个目录中&#xff0c;注意复制指令需要添加 -a 选项, -a选项可以将现有so库的链接关系一同拷贝&#xff0c;如果不加 -a 需要重新使用 ln进行链接: sudo cp -a *.so* /libsdk/编辑 /etc/ld.so.conf文件 …

WebKit源代码探秘:深入理解其组织结构与组件

WebKit是一个开源的浏览器引擎&#xff0c;最初由苹果公司开发&#xff0c;现在由许多贡献者共同维护。它以其高性能、易用性和可扩展性而闻名&#xff0c;被用于多个流行的浏览器和应用程序中。WebKit的源代码组织是模块化的&#xff0c;使得开发者可以轻松地找到所需的组件并…

2024第六届上海国际新材料展览会-12月精彩呈现

2024第六届上海国际新材料展览会 The 6th shanghai International New Materials Exhibition in 2024 时 间&#xff1a;2024年12月18-20日 地 点&#xff1a;上海新国际博览中心 CIME 2024专业、权威&#xff0c;涵盖整个新材料行业的国际盛会。 期待与您在CIME 2024现场相…

【INTEL(ALTERA)】为什么我使用 PIO 边缘捕获中断的 Nios® II 设计不能正常工作?

目录 说明 解决方法 说明 当用户选择了不正确的边缘捕获设置&#xff0c;从而阻止触发中断时&#xff0c;可能会出现此问题。 在 PIO&#xff08;并行 I/O&#xff09;英特尔 FPGA IP内核中&#xff0c;如果“启用单个位设置/清除”选项被关闭&#xff0c;则将任何值写入边…

精通C#编程需要学习哪些常用框架?

精通C#编程&#xff0c;了解并熟练运用一些核心框架对于开发高质量的应用程序至关重要。以下是一些C#开发中常用的框架&#xff1a; .NET Core / .NET 6: 这是C#现代应用程序开发的基础框架&#xff0c;支持跨平台&#xff08;Windows、Linux、macOS&#xff09;开发。它包括了…

如何判断服务器是否被攻击

如何判断服务器是否被攻击 一、异常流量模式 一种判断服务器是否遭到攻击的方法是监控网络流量。异常的流量模式&#xff0c;例如流量突然剧增或减少&#xff0c;都可能是攻击的迹象。通常&#xff0c;大量的入站流量表明分布式拒绝服务&#xff08;DDoS&#xff09;攻击的可能…

git合并报错:git -c core.quotepath=false -c log.showSignature=false merge r

这个错误通常发生在 Git 尝试合并两个没有共同祖先的历史时&#xff0c;比如在合并不同的分支或仓库时&#xff0c;可以尝试以下几种方法&#xff1a; 允许不相关历史的合并: git merge release-3.6 --allow-unrelated-histories这个选项告诉 Git 允许合并两个没有共同历史的分…

【购物车案例】for循环为什么使用key

要做出一个简单的购物车界面。首先&#xff0c;有一个复选框&#xff0c;可以选择商品&#xff0c;后面紧跟的是商品名称&#xff0c;然后&#xff0c;是删除按钮&#xff0c;根据这个需求&#xff0c;先写出一个简单的界面&#xff0c;代码如下&#xff1a; <template>…

有关区块链的一些数学知识储备

1.集合 集合是由不同对象组成的整体&#xff08;collections of objects&#xff09;的数学模型&#xff0c;这些对象被称为集合的元素&#xff08;elements&#xff09;。整数&#xff08;Integers&#xff09;、有理数&#xff08;Rational numbers&#xff09;、实数&#x…

openssh9.8p1更新 修复漏洞(CVE-2024-6387)

2024 年 7 月&#xff0c;互联网公开披露了一个 OpenSSH 的远程代码执行漏洞&#xff08;CVE-2024-6387&#xff09;。鉴于该漏洞虽然利用较为困难但危害较大&#xff0c;建议所有使用受影响的企业尽快修复该漏洞。 centos7 为例 yum -y install gcc make openssl-devel zlib…

【区块链+跨境服务】基于区块链的离岸贸易综合服务平台 | FISCO BCOS应用案例

离岸贸易是一种新型的国际贸易模式&#xff0c;指在一个国家或地区的境内&#xff0c;通过一定的方式&#xff0c;将两个或多个国家或地区 之间的贸易活动&#xff0c;从货物流、资金流和信息流三个方面分离开来&#xff0c;实现货物不经过境内&#xff0c;直接从一个国家或地区…

三相感应电机的建模仿真(3)基于ABC相坐标系Level2 S-Fun以及定子串不对称电抗起动过程仿真分析

1. 概述 2. 三相感应电动机状态方程式 3. 基于Level2 S-Function的仿真模型建立 4. 动态分析实例 5. 总结 6. 参考文献 1. 概述 三相感应电机自然坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时间按正弦规律变化),将其用…

[hudsonL@cock.li].mkp勒索病毒的最新威胁:如何恢复您的数据?

引言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒成为网络安全领域的一个严重挑战。最近出现的.[hudsonLcock.li].mkp、[hendersoncock.li].mkp、[myersairmail.cc].mkp勒索病毒&#xff0c;以其具有破坏力的加密技术和极具威胁性的赎金要求&#xff0c;给个人用户和组…

解决idea中无法通过“download source”下载源码的问题

如果jar包不是自己的 在项目pom.xml同级目录下使用命令控制行输入指令 mvn dependency:resolve -Dclassifiersources缺点: 会下pom中所有jar包的源码&#xff0c;如果jar包本身不含源码的话&#xff0c;执行指令也没有效果 如果自己能拿到源码 在开发环境中的pom中&#xf…

量子保密通信协议原理:量子保密通信实验

纸上得来终觉浅&#xff0c;绝知此事要躬行。 在之前的文章中&#xff0c;我们对量子密钥分发协议原理、分发过程进行了详细的描述&#xff0c;今天我们实操一波。博主向大家隆重介绍一下华中师范大学量子保密通信虚拟仿真试验平台&#xff1a;量子保密通信是将量子密钥分发和一…

Java常见注解及其使用汇总

目录 一. springboot项目注解 1. 启动注解SpringBootApplication 1.1 SpringBootConfiguration 注解 1.2 EnableAutoConfiguration 注解 1.3 ComponentScan注解 2. 配置文件相关注解 2.1 Configuration 2.2 ComponentScan 3. controller层相关注解 3.1 RestControlle…