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

别再手写了!SpringBoot 6 种数据脱敏方案,第 5 种直接封神!

沉默是金,总会发光

大家好,我是沉默

在日常开发中,你一定遇到过这种需求:

手机号中间四位要打星
身份证号要隐藏中间
邮箱只能露前缀
银行卡只能看头尾

比如

手机号:13812345678 → 138****5678
身份证:430101199003078888 → 430101********8888
姓名:张三四 → 张*四
邮箱:12345678@qq.com → 1234****@qq.com
银行卡:6230351888852405 → 6230********2405

于是问题来了:

  • 写在 Controller?太乱

  • 写在 Service?污染业务

  • 写在 SQL?维护地狱

  • 写在 VO?嵌套一多就炸

这就是数据脱敏(Data Masking)

今天这篇文章,我直接把我在真实项目里用过的 6 种脱敏方案一次性讲清楚,Spring Boot 拿来就能用。

-01-

1-2

方案一|Hutool 工具库(懒人必备)

如果你不想造轮子,那就一句话:

直接用 Hutool

依赖

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.0</version>
</dependency>

使用示例

String phone= DesensitizedUtil.mobilePhone("13812345678");
String idCard= DesensitizedUtil.idCardNum("430101199003078888", 6, 4);
String name= DesensitizedUtil.chineseName("张三四");
String email= DesensitizedUtil.email("12345678@qq.com");
String bankCard= DesensitizedUtil.bankCard("6230351888852405");

  • 开箱即用

  • 灵活性有限

  • 适合小项目 / 原型 / 快速交付

方案二|正则工具类(最直观)

不想引第三方?那就自己写工具类

思路很简单:
输入原值 → 正则替换 → 返回脱敏值

使用方式

user.setPhone(SensitiveUtil.maskPhone(user.getPhone()));
user.setIdCard(SensitiveUtil.maskIdCard(user.getIdCard()));

  • 好理解、好调试

  • 每个地方都要手动调

  • 字段少、结构简单的场景

-02-

3-4

方案三|注解 + Jackson(工程化第一步)

很多人做到这里会开始意识到一个问题:

“我不想每个接口都手动脱敏”

那就该用注解 + Jackson 序列化了。

思路:

在字段上标注
JSON 序列化时自动脱敏
业务代码 0 感知

@Sensitive(SensitiveType.PHONE)
private String phone;

优点很明显:

  • 统一出口

  • 性能好(只在序列化阶段)

  • 对嵌套对象无能为力

但是,真正的难题出现了。

痛点|嵌套对象脱敏,前面方案全失效

来看一个真实结构

public class User {
@Sensitive(SensitiveType.PHONE)
private String phone;

private UserDetail detail;
}

public class UserDetail {
@Sensitive(SensitiveType.ID_CARD)
private String idCard;
}

结果:

  • phone脱敏

  • detail.idCard明文

这在真实项目里,是事故级风险


-03-

5-6

方案五|AOP 深度脱敏(架构级推荐)

这才是中大型项目的正确解法

不是“在哪脱敏”,而是“统一在出口治理”

  • Controller / Service 返回值

  • 无论是:

    • 单对象

    • List

    • Map

    • Page

    • 多层嵌套

全部递归处理

核心流程图

请求 → Controller → ServiceAOP 环绕拦截递归扫描返回对象找到@Sensitive字段执行脱敏返回

效果

{
"name":"张*四",
"phone":"138****5678",
"detail":{
"emergencyPhone":"139****8765"
}
}

为什么我强烈推荐它?

  • 一次配置,全局生效

  • 支持任意嵌套

  • 业务代码零侵入

  • 后期统一治理

这已经是**“安全架构层”的方案**了。

方案六|MySQL 层脱敏(DB 视角)

这是完全不同的思路

在数据库层就不让你看到明文

SELECT
CONCAT(LEFT(phone,3),'****',RIGHT(phone,4)) AS phone
FROM users;

适合谁?

  • 报表系统

  • 只读账号

  • DBA 安全视图

  • 数据分析场景

-04-

总结

六种方案对比表

方案

优点

缺点

场景

Hutool

不灵活

小项目

工具类

简单

手动多

少量字段

Jackson

自动化

不支持深层

API 输出

Getter

轻量

重复代码

VO 控制

AOP 深度脱敏

⭐⭐⭐⭐⭐

实现复杂

中大型项目

MySQL

DB 安全

SQL 复杂

报表

最佳实践建议(面试 & 实战通吃)

  • 新手 / 小项目:方案一、二

  • 标准 REST API:方案三

  • 复杂对象 + 统一治理方案五(AOP)

  • 数据安全隔离:方案六(DB)

数据脱敏不是“字符串处理”,而是“安全架构设计”

当你的系统开始考虑:

  • 合规

  • 安全

  • 数据最小暴露原则

那你就已经不是在写 CRUD 了,而是在做工程设计

如果这篇文章对你有帮助,
欢迎点赞 / 收藏 / 转发

-05-

粉丝福利

我这里创建一个程序员成长&副业交流群,

和一群志同道合的小伙伴,一起聚焦自身发展

可以聊:

技术成长与职业规划,分享路线图、面试经验和效率工具,

探讨多种副业变现路径,从写作课程到私活接单,

主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。

如果你对这个特别的群,感兴趣的,

可以加一下,微信通过后会拉你入群,

但是任何人在群里打任何广告,都会被我T掉。

http://www.jsqmd.com/news/216797/

相关文章:

  • 工业级IoT库房温湿度实时监测系统:从感知到管控的全链路方案
  • 小白别踩坑:async-await真能保证顺序执行?搞懂调用时机才不翻
  • 电商数据质量的智能监测
  • spss 性别类似的二分类变量 多分类变量 做线性回归分析
  • 多云架构下的Z-Image-Turbo:如何实现高可用图像生成服务
  • “补贴”能烧出未来吗?“排队免单”模式的价值与隐忧
  • 2026年国产数据库客户成功案例与迁移成本综合对比分析
  • 信息流广告点击率提升300%丨实战案例解析
  • 跨平台创作无忧:Z-Image-Turbo云端服务+多终端访问方案
  • 库卡机器人气保焊智能节气阀
  • 背调软件:重塑企业招聘风控的高效工具
  • 计算机等级考试CMMI考试高频考点速记表
  • AI创作马拉松:从环境搭建到作品提交的全流程指南
  • 智慧交通铁路巡检钢轨轨道裂纹检测数据集VOC+YOLO格式698张1类别
  • 想入FreeClip2的宝子注意啦,这样买超划算!
  • CLIP 的双编码器架构是如何优化图文关联的?
  • 钢管X射线图像缺陷识别分割数据集labelme格式3337张8类别
  • 推荐一个「本地」开源平替版Manus:AiPy,不会跑路
  • Z-Image-Turbo模型监控:云端环境下的性能与资源使用分析
  • 导师不会说的论文秘密:9款AI工具实测,PaperTan交叉引文献超高效!
  • C ++和三维平台环境
  • FDA、NMPA注册合规与安全并重:医药包装ASTMD4169运输测试的必要性
  • 录制下载而不是收藏资料的原因
  • 告别CUDA噩梦:阿里通义Z-Image-Turbo WebUI云端GPU环境10分钟搭建教程
  • Z-Image-Turbo对比测试:如何用云端环境快速评估不同模型
  • SQL踩坑终结者!飞算JavaAI纠错功能,让数据库操作精准不翻车
  • Spring4Shell CVE-2022-22965原理及复现
  • 揭秘科哥二次开发套件:小白也能搭建专业级AI图像平台
  • 激光扫描共聚焦显微镜与转盘共聚焦显微镜的区别
  • Z-Image-Turbo商业授权无忧:合规部署与版权管理的完整方案