news 2026/5/30 19:26:41

一文搞懂后端数据脱敏:概念、场景与落地方案(Java 实战)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文搞懂后端数据脱敏:概念、场景与落地方案(Java 实战)

1. 何为后端数据脱敏?

在实际业务系统中,接口往往会返回包含敏感信息的数据。如果这些数据直接明文返回给前端或第三方系统,存在一定的安全与合规风险

数据脱敏(Data Masking),指的是:不修改原始数据的前提下,对返回给客户端的数据进行遮挡或模糊处理,以防止敏感信息被完整展示。真实的业务场景中,数据脱敏后的展示效果图如下。其中红色框框住的,就是脱敏后的信息。

常见的需要脱敏的字段:手机号、身份证号、邮箱、姓名(如支付宝)、银行卡号、薪资信息等。是否脱敏,取决于:接口使用场景、用户角色、数据敏感级别、系统需求需要。

脱敏的核心目标是:数据可用、数据真实、你有权限查看、但不可全看

2. 脱敏 ≠ 加密 ≠ 删除

这是很多初学者容易混淆的地方,你需要记住的是,脱敏只发生在数据返回阶段,数据库中仍然保存完整数据,二者互不干扰。我们用一个表格来展示脱敏/加密/删除的区别:

对比项脱敏加密删除
是否可还原
是否修改原数据
主要用途展示安全存储/传输安全数据清理

3. 为什么要在后端做脱敏?

有些项目会尝试在前端做脱敏处理,但这并不安全,原因包括:

  • 接口返回的数据本身仍是明文
  • 抓包、日志、调试工具都能看到完整数据
  • 权限控制难以统一

正确做法:脱敏逻辑必须在后端完成。

4.后端脱敏实现方式

1️⃣ VO 层手动脱敏(简单场景)

适合字段少、接口简单的项目。比如针对手机号的脱敏代码实现:

public String maskPhone(String phone) { if (phone == null || phone.length() < 7) { return phone; } return phone.substring(0, 3) + "****" + phone.substring(7); }

优点:实现简单、通俗易懂

缺点:重复代码多、不利于统一规范

2️⃣ Jackson 自定义序列化(推荐)

我们可以通过 Jackson 的 JsonSerialize,在序列化阶段统一脱敏。比如同样是针对手机号进行的脱敏代码编写:

public class PhoneMaskSerializer extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value == null) { gen.writeNull(); return; } gen.writeString(value.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")); } }

之后我们在字段使用:

@JsonSerialize(using = PhoneMaskSerializer.class) private String phone;

优点:与业务逻辑无关、前端无感知。

3️⃣ 注解 + AOP(企业级推荐方案)

适合字段多、接口多的中大型项目。

首先我们需要定义脱敏注解:

@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Desensitize { DesensitizeType type(); }

其中待脱敏字段有:

public enum DesensitizeType { PHONE, EMAIL, ID_CARD }

AOP 统一处理返回结果:

@Aspect @Component public class DesensitizeAspect { @Around("execution(* com.xxx.controller..*(..))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { Object result = joinPoint.proceed(); handle(result); return result; } private void handle(Object obj) throws IllegalAccessException { if (obj == null) return; if (obj instanceof Collection<?> list) { for (Object item : list) { handle(item); } return; } for (Field field : obj.getClass().getDeclaredFields()) { if (!field.isAnnotationPresent(Desensitize.class)) { continue; } field.setAccessible(true); Object value = field.get(obj); if (value instanceof String str) { DesensitizeType type = field.getAnnotation(Desensitize.class).type(); field.set(obj, mask(str, type)); } } } }

手机号码字段使用示例:

@Desensitize(type = DesensitizeType.PHONE) private String phone;

5. 脱敏设计中的注意事项

  • 不要在 Entity 层脱敏
    Entity 是原始数据模型,不应被污染。

  • 不要修改数据库中的值
    脱敏只用于展示。

  • 注意 List / Page / Tree 结构的递归处理

  • 权限高的用户可以不脱敏
    可与权限系统结合控制。

总结一下:数据脱敏是后端数据安全设计的基础能力,它≠ 加密,二者职责不同。推荐使用 注解 + AOP 实现统一、可维护的脱敏方案,并将脱敏逻辑放在接口返回阶段。

你,学废了吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 20:35:26

Java双向链表实现教程:插入操作与节点结构详解

双向链表是数据结构中链表的一种重要形式&#xff0c;它在每个节点中除了存储数据外&#xff0c;还包含两个引用分别指向前一个节点和后一个节点。这种结构相比单向链表&#xff0c;能够实现双向遍历&#xff0c;为某些特定场景下的数据操作提供了更高的效率。在Java中实现双向…

作者头像 李华
网站建设 2026/5/28 16:14:50

什么是TextStream流处理?它如何实现实时数据分析

TextStream作为一种新兴的数据处理范式&#xff0c;正在重塑我们处理信息的方式。其核心在于将信息视为持续的、不间断的字符流&#xff0c;从而实现实时的分析、转换与响应。这区别于传统批处理模式&#xff0c;更适应如今高速产生、需要即时洞察的数据环境&#xff0c;例如金…

作者头像 李华
网站建设 2026/5/28 18:06:42

vss2026客户端安装步骤与条件详解

vss2026客户端是企业级版本控制的重要工具&#xff0c;正确安装是保证团队协作效率的基础。本文将详细介绍安装前的准备工作、具体安装步骤以及常见问题的解决方法&#xff0c;帮助您顺利完成部署。 vss2026 客户端安装需要什么条件 在开始安装前&#xff0c;请确保您的计算机满…

作者头像 李华
网站建设 2026/5/28 22:27:11

【SOLIDWORKS 练习题】草图专题:2.GAME BOY

&#x1f525;小龙报&#xff1a;个人主页 &#x1f3ac;作者简介&#xff1a;C研发&#xff0c;嵌入式&#xff0c;机器人等方向学习者 ❄️个人专栏&#xff1a;《SOLIDWORKS 练习题》 ✨ 永远相信美好的事情即将发生 文章目录前言一、GAME BOY1.1 题目来源1.2 作图灵感1.3 范…

作者头像 李华
网站建设 2026/5/30 2:38:35

一文给你讲清楚,什么是红蓝对抗?红蓝对抗需要掌握什么技术?

什么是红蓝对抗&#xff1f; 我们现在所处的时代&#xff0c;有人称为网络时代&#xff0c;有人称为信息时代&#xff0c;也有人称为数据时代&#xff0c;不管名字怎么叫吧&#xff0c;我想有一件事已经成为了共识&#xff0c;那就是我们的安全观念得要跟上时代发展。 都知道重…

作者头像 李华
网站建设 2026/5/28 21:17:17

当知识池不再泛起涟漪

朋友&#xff0c;你是否也有这样的时刻&#xff1f;打开文档&#xff0c;光标在空白的页面上闪烁&#xff0c;像一位等待指示的士兵&#xff0c;而你的大脑司令部却一片寂静。键盘上的手指悬停在空中&#xff0c;不知道第一个字母应该落在哪里。想写点什么&#xff0c;却发现脑…

作者头像 李华