news 2026/7/14 22:21:15

一文搞懂后端数据脱敏:概念、场景与落地方案(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/6/30 22:09:15

Redis启用AOF持久化的利弊分析:安全与性能如何权衡

对于Redis的使用者来说&#xff0c;是否开启“appendonly yes”是一个关键的配置决策。它决定了数据持久化的方式&#xff0c;直接关系到数据安全性和系统性能的平衡。我将基于运维实践经验&#xff0c;分享这一配置的核心考量与实际影响。 appendonly yes如何保证数据安全 开启…

作者头像 李华
网站建设 2026/7/13 14:14:24

unix shell编程 pdf 教程推荐与学习指南

对于Unix/Linux系统管理员和开发者来说&#xff0c;掌握shell编程是必备技能之一。PDF格式的学习资料因其便于保存、打印和离线阅读的特点&#xff0c;成为许多人系统学习shell编程的首选。通过精心整理的PDF资源&#xff0c;我们可以从基础语法到高级技巧&#xff0c;逐步构建…

作者头像 李华
网站建设 2026/7/14 19:27:29

Python 判断是否为空:字符串、列表等常用方法详解

在Python编程中&#xff0c;判断变量或数据结构是否为空是一项基础但至关重要的操作。它直接关系到程序的健壮性&#xff0c;能有效避免因处理空值而引发的运行时错误。理解不同数据类型&#xff08;如字符串、列表、字典&#xff09;的空值判断方法&#xff0c;是编写可靠代码…

作者头像 李华
网站建设 2026/7/13 19:51:46

最强AI竟不如6岁儿童水平?BabyVision揭示大模型「视觉推理」困境

人类幼崽在牙牙学语前&#xff0c;是通过观察绘本中的世界、探索积木的堆叠、追踪蝴蝶的踪迹&#xff0c;是在视觉探索中逐步建立起对世界的认知的。 然而&#xff0c;一项实证结果和人工评估表明&#xff0c;当撇开依赖的文字推理&#xff0c;领先的多模态大语言模型&#xff…

作者头像 李华
网站建设 2026/7/14 1:03:16

Java毕设选题推荐:基于物联网技术的宠物定位与监控系统设计小程序基于SpringBoot物联网技术的宠物定位与监控系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华