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

java项目数据脱敏工具类实现

实现思路

  • 手机号脱敏:保留前3位和后4位,中间4位替换为 ****
  • 邮箱脱敏:保留 @ 后的域名,前缀替换为 ****
  • 身份证脱敏:保留前6位和后4位,中间8位(出生年月日)替换为 ********

代码实现

定义脱敏工具类 SensitiveDataUtils
public class SensitiveDataUtils {/*** 手机号脱敏(中间4位替换为****)* @param phone 原始手机号(11位)* @return 脱敏后的手机号*/public static String maskPhone(String phone) {if (phone == null || phone.length() != 11) {return phone;}return phone.substring(0, 3) + "****" + phone.substring(7);}/*** 邮箱脱敏(@前的前缀替换为****)* @param email 原始邮箱地址* @return 脱敏后的邮箱*/public static String maskEmail(String email) {if (email == null || !email.contains("@")) {return email;}int atIndex = email.indexOf('@');return "****" + email.substring(atIndex);}/*** 身份证号脱敏(第7-14位替换为********)* @param idCard 原始身份证号(18位)* @return 脱敏后的身份证号*/public static String maskIDCard(String idCard) {if (idCard == null || idCard.length() != 18) {return idCard;}return idCard.substring(0, 6) + "********" + idCard.substring(14);}
}
使用示例
public class Demo {public static void main(String[] args) {// 测试数据String phone = "13812345678"; // → 138****5678String email = "example123@example.com"; // → ****@example.comString idCard = "11010219490811123X"; // → 110102********123X// 脱敏处理String maskedPhone = SensitiveDataUtils.maskPhone(phone);String maskedEmail = SensitiveDataUtils.maskEmail(email);String maskedIdCard = SensitiveDataUtils.maskIDCard(idCard);// 输出结果System.out.println(maskedPhone); // 输出:138****5678System.out.println(maskedEmail); // 输出:****@example.comSystem.out.println(maskedIdCard); // 输出:110102********123X}
}

关键点说明

  • 边界条件处理:对于 null 或格式不正确的数据(如手机号非11位、身份证非18位),直接返回原值,避免空指针或索引越界。邮箱必须包含 @ 符号才进行处理,否则返回原值。
  • 性能优化:使用 substring 方法进行字符串截取,时间复杂度为 O(n),适合短字符串处理。工具方法均为 static,可直接调用无需实例化,符合 Java 工具类设计规范。
  • 扩展性:可通过修改 substring 参数和掩码字符串,快速适配其他脱敏规则(如手机号尾号显示3位)。

适用场景

  • 用户隐私保护:在用户信息展示、日志输出、API 接口返回时进行脱敏。
  • 数据合规性要求:符合《个人信息保护法》对敏感信息的处理规范。
http://www.dtcms.com/a/342689.html

相关文章:

  • 【离线安装】CentOS Linux 7 上离线部署Oracle 19c(已成功安装2次)
  • 【数据可视化-96】使用 Pyecharts 绘制主题河流图(ThemeRiver):步骤与数据组织形式
  • 如何使用 DeepSeek 助力工作​
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述-下篇)
  • 阿里云的centos8 服务器安装MySQL 8.0
  • 【LeetCode 415】—字符串相加算法详解
  • Java学习历程14——制作一款五子棋游戏(4)
  • R 语言科研配色 --- 第 85 期 (附免费下载的配色绘图PPT)
  • 全屋WiFi强电款WiFi6 86面板一站式测试解决方案
  • leetcode 904 水果成篮
  • 从零开始理解 K 均值聚类:原理、实现与应用
  • Grafana侧重可视化,那多数据源告警呢?
  • Linux的奇妙冒险——进程间通信(管道、SystemV IPC)
  • 【实战记录】麒麟服务器操作系统安装KSC-Defender安全中心全指南
  • EagleTrader交易员采访|交易是一场概率游戏
  • 免费DirectX修复工具?游戏运行异常?【图文详解】dll修复工具?D3DX9_43.dll丢失
  • 【科研绘图系列】R语言绘制序列分析图
  • Rust 的流程控制与函数
  • SQL 中 DISTINCT 的全方位指南:从基础用法到性能优化
  • 【51单片机】【protues仿真】基于51单片机温度烟雾控制系统
  • C++项目实战——高性能内存池(一)
  • Redis面试精讲 Day 26:Redis源码分析:事件循环与网络模型
  • docker使用和部署深化学习
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第一章知识点问答(21题)
  • 华为AUTOSAR质量目标与开发实践
  • LeetCode100 -- Day3
  • 常德二院全栈国产化实践:KingbaseES 数据库的关键作用
  • 机器学习聚类算法学习报告
  • Spring容器Bean的创建流程
  • 使用jwt+redis实现单点登录