当前位置: 首页 > news >正文

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

一、接口数据脱敏概述

1.1 接口数据脱敏的定义

接口数据脱敏是Web应用程序中一种保护敏感信息不被泄露的关键措施。在API接口向客户端返回数据时,系统会对包含敏感信息(如个人身份信息、财务数据等)的字段进行特殊处理。这种处理通过应用特定的算法或遵循既定规则,将敏感字段的部分或全部内容隐藏或替换,例如使用星号(*)或其他占位符来掩盖关键信息,同时尽量保持数据的原有格式和可读性(在合理范围内),以确保敏感数据不会直接暴露给未经授权的访问者。

1.2 接口数据脱敏的重要性

数据脱敏的重要性不言而喻,它主要体现在以下几个核心方面:

  1. 强化用户隐私保护:对个人敏感信息,如姓名、身份证号码、手机号码等,进行脱敏处理,是保护用户隐私的有效手段。这种措施能够防止敏感信息被非法获取和滥用,维护用户的合法权益。

  2. 确保法律合规性:随着全球范围内数据保护法规的日益严格,如欧盟的《通用数据保护条例》(GDPR)和中国的《个人信息保护法》等,实施数据脱敏已成为企业合规运营的重要一环。通过脱敏处理,企业能够避免触犯相关法律条款,减少因违规而产生的法律风险。

  3. 降低数据泄露风险:即便在数据不慎泄露的情况下,经过脱敏处理的数据也能显著降低敏感信息被直接利用的风险。这有助于减轻因数据泄露给企业、用户及社会带来的潜在危害。

  4. 促进数据的安全共享与利用:在保护个人隐私的前提下,脱敏后的数据仍保留了足够的分析价值,为数据的安全共享和有效利用提供了可能。这有助于推动数据在合规框架内的流通与融合,促进数据价值的最大化释放。

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

手动脱敏:直接在业务逻辑层代码中对敏感数据进行逐一处理,这种方式虽然提供了较高的灵活性,但容易因人为疏忽而导致脱敏遗漏,同时也会导致代码中存在大量的重复处理逻辑,增加了维护成本。

AOP(面向切面编程):利用AOP技术,通过定义切面来拦截API接口返回的数据流,从而实现对敏感字段的统一处理。这种方法能够将脱敏逻辑从业务代码中抽离出来,实现集中管理,提高了代码的可维护性和可扩展性。然而,由于AOP的拦截机制会增加一定的处理开销,因此可能会对系统性能产生一定的影响。

自定义序列化器:在数据序列化阶段,通过集成JSON序列化框架(如Jackson)提供的自定义序列化器功能,实现对敏感字段的自动化处理。这种方法既保持了较好的性能表现,又能够将脱敏逻辑与业务逻辑完全解耦,使得代码更加清晰和易于管理。

注解+反射:通过定义自定义注解来标记那些需要进行脱敏处理的字段,然后在数据返回前,利用Java的反射机制在运行时动态地遍历这些字段并进行脱敏处理。这种方式简化了脱敏操作的使用过程,使得开发者只需通过简单的注解标记即可实现脱敏功能,同时也有利于后续对脱敏逻辑的维护和扩展。

二、开发环境

  • JDK版本:JDK 17

  • Spring Boot版本:Spring Boot 3.2.2

  • 构建工具:Maven

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

3.1 添加依赖

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

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</version></dependency>

3.2 创建自定义注解

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

@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方法的使用,想要自定义规则进行隐藏可以仿照进行实现。

public class DesensitizeSerializer extends JsonSerializer<String> implements ContextualSerializer {private DesensitizeType type;private int startInclude;private int endExclude;public DesensitizeSerializer() {this.type = DesensitizeType.DEFAULT;}public DesensitizeSerializer(DesensitizeType type) {this.type = type;}@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {switch (type) {case CUSTOM_RULE: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;}}@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;
    }

  2. 编写测试接口

@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 测试

五、总结

本文深入探讨了在SpringBoot应用程序中实施数据脱敏策略的关键性,并提出了一种创新的解决方案,即通过集成自定义注解与Hutool脱敏工具类来高效地实现数据脱敏。此方案旨在精准地对敏感信息进行脱敏处理,确保用户隐私得到妥善保护,同时维护数据的安全性。我们期待这一方案能为开发者们提供有价值的参考,共同提升数据保护水平。😊

相关文章:

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

一、接口数据脱敏概述 1.1 接口数据脱敏的定义 接口数据脱敏是Web应用程序中一种保护敏感信息不被泄露的关键措施。在API接口向客户端返回数据时&#xff0c;系统会对包含敏感信息&#xff08;如个人身份信息、财务数据等&#xff09;的字段进行特殊处理。这种处理通过应用特…...

我们水冷使制动电阻功率密度成倍增加-水冷电阻设计工厂

先进陶瓷 我们后来发现工业应用中对占用空间最小的水冷电阻器的工业需求&#xff0c;推出了适用于中压工业应用的水冷电阻器。它的特点是两块由具有特殊性能的先进陶瓷制成的板。 使用工业电驱动装置的一个重要好处是&#xff0c;可靠的再生和动态制动系统可以补充或取代传统…...

模板语法指令语法——02

//指令语法&#xff1a; 1.什么是指定&#xff0c;有什么作用&#xff1f; 指令的职责是&#xff0c;当表达式的值改变时&#xff0c;将其产生的连带影响&#xff0c;响应式的作用语DOM 2.vue框架中的所有指令的名字都以v-开始的 3.插值是写在标签当中用的&#xff0c;指令…...

Comparable 和 Comparator 接口的区别

Comparable 和 Comparator 接口的区别 1、Comparable 接口1.1 compareTo() 方法 2、Comparator 接口2.1 compare() 方法 3、 Comparable 和 Comparator 的区别总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Compa…...

Python requests爬虫

Python的requests库是一个强大且易于使用的HTTP库&#xff0c;用于发送HTTP请求和处理响应。它是Python中最受欢迎的网络爬虫框架之一&#xff0c;被广泛用于从网页中提取数据、爬取网站和进行API调用。 使用requests库&#xff0c;你可以轻松地发送各种HTTP请求&#xff0c;包…...

Docker 基本管理及部署

目录 1.Docker概述 1.1 Docker是什么&#xff1f; 1.2 Docker的宗旨 1.3 容器的优点 1.4 Docker与虚拟机的区别 1.5 容器在内核中支持的两种技术 1.6 namespace的六大类型 2.Docker核心概念 2.1 镜像 2.2 容器 2.3 仓库 3.安装Docker 3.1 查看 docker 版本信息 4.…...

Ubuntu下安装配置和调优Docker,支持IPV6

今天在阿贝云的免费云服务器上折腾了一番Docker的配置和优化,这家免费云服务器可真不错啊。1核1G 10G硬盘,5M带宽,配置虽然简单但够用了。作为一个免费的云服务器,阿贝云的性能可以说是非常不错的了,完全能胜任日常的开发和部署工作。 让我们开始吧。首先,简单介绍一下Docker吧…...

Proteus + Keil单片机仿真教程(六)多位LED数码管的动态显示

上一节我们通过锁存器和八个八位数码管实现了多个数码管的静态显示,这节主要讲解多位数码管的动态显示,所谓的动态显示就是对两个锁存器的控制。考虑一个问题,现在给WS位锁存器增加一个循环,让它从1111 1110到0111 1111会发生什么事情?话不多说,先上代码: #include<…...

WEB开发-HTML页面更新部分内容

1 需求 2 接口 3 示例 在HTML页面中&#xff0c;如果你想要改变部分内容而不是整个页面&#xff0c;有几种方法可以实现这一目标&#xff0c;主要包括&#xff1a; JavaScript 的 DOM 操作 JavaScript允许你动态地修改HTML文档中的元素内容。你可以使用document.getElementB…...

休息时间c++

题目描述 小杨计划在某个时刻开始学习&#xff0c;并决定在学习k秒后开始休息。 小杨想知道自己开始休息的时刻是多少。 输入 前三行每行包含一个整数&#xff0c;分别表示小杨开始学习时刻的时h、分m、秒s(h&#xff0c;m&#xff0c;s的值符合1≤h≤12,0≤m≤59,0≤s≤59)…...

zabbix 自定义监控项及触发器

1. 在zabbix客户端定义脚本 /etc/zabbix/zabbix_agent2.d/目录下创建自定义监控项脚本 ]# cat /etc/zabbix/zabbix_agent2.d/web.conf #UserParameterkey,cmd #UserParameterngx.port,sh /server/scripts/xxx.sh UserParameterngx.port,ss -lntup|grep -w *:80|wc -lUserPar…...

easyExcel 不规则模板导入数据

文章目录 前言一、需求和效果二、难点和思路三、全部代码踩坑 前言 之前分享的 EasyExcel 批量导入并校验数据&#xff0c;仅支持规则excel&#xff0c;即首行表头&#xff0c;下面对应数据&#xff0c;无合并单元格情况。 本篇主要解决问题&#xff1a; 模板excel 表头不在首…...

前端调试技巧(npm Link,vscode调试,浏览器调试等)

Npm Link 功能&#xff1a; 在本地开发npm模块的时候&#xff0c;我们可以使用npm link命令&#xff0c;将npm 模块链接到对应的运行项目中去&#xff0c;方便地对模块进行调试和测试 断点调试 vscode调试 Debug Vue2 Project 目标&#xff1a;在VSCode中调试项目代码…...

SSL证书到期自动巡检脚本-推送钉钉告警

1. 编写SSL证书巡检脚本 cat /hao/batch_check_ssl_expire.sh #!/bin/bash# 域名列表文件绝对路径 domains_file"/hao/domains.txt"#钉钉webhook webhook_url"https://oapi.dingtalk.com/robot/send?access_token99999999999999999999999999999999999999999…...

Winform打印编程基础

1、目的 进行打印设置、打印预览、及实现打印功能 2、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Te…...

Python编程实例-Python的隐藏特性

Python的隐藏特性 文章目录 Python的隐藏特性1、Python中的下划线(_)2、通过解析树进行正则表达式调试3、省略号(...)4、dir()函数5、Lambda 函数6、链式比较运算符7、zip()函数8、修饰器9、上下文管理器和with语句10、生成器和yield语句11、元类(Metaclass)12、小结Python…...

防火墙安全策略利用

拓扑图&#xff1a; 办公区为10.0.1.0/24 生产部为&#xff1a;10.0.2.0/24 办公区为vlan2&#xff0c;生产区为vlan3 DMZ区域为10.0.3.0/24、10.0.3.10为HTTP服务器 游客区&#xff1a;210.0.0./24 ISP&#xff1a;12.0.0.0/24 要求3&#xff1a; 添加安全策略&#xf…...

SystemUIService启动-Android13

SystemUIService启动-Android13 1、SystemUIService启动2、其他SystemUI services启动2.1 Dagger依赖注入2.2 Recents为例 1、SystemUIService启动 SystemUI启动&#xff0c;及其SystemUIService启动 <!-- SystemUi service component --><string name"config_s…...

linux权限深度解析——探索原理

前言&#xff1a;本节内容主要讲述的是linux权限相关的内容&#xff0c; linux的权限如果使用root账号是感受不到的&#xff0c; 所以我们要使用普通账号对本节相关内容进行学习&#xff0c;以及一些实验的测试。 然后&#xff0c; 通过linux权限的学习我们可以知道为什么有时候…...

Qt学生管理系统(付源码)

Qt学生管理系统 一、前言1.1 项目介绍1.2 项目目标 2、需求说明2.1 功能性说明2.2 非功能性说明 三、UX设计3.1 登录界面3.2 学生数据展示3.3 信息插入和更新 三、架构说明3.1 客户端结构如下3.2 数据流程图3.2.1 数据管理3.2.2 管理员登录 四、 设计说明3.1 数据库设计3.2 结构…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...