java字符串脱敏核心是保留可识别特征并隐藏关键部分,如手机号保留前3后4位、身份证号保留前6后4位,需结合长度校验与正则实现安全合规的展示。

Java 中对 String 类型的敏感信息做展示脱敏,核心是“保留可识别特征 + 隐藏关键部分”,不是简单删掉或全替换成星号,而是按业务规则有选择地显示首尾、段落或结构化字段。下面分几种典型场景讲清楚怎么写、怎么选、怎么用。
手机号:保留前3位和后4位
这是最常见也最规范的做法(符合《个人信息安全规范》推荐)。11位手机号只暴露开头号段和尾号,中间4位打码:
- 用 substring 最直观:`phone.substring(0, 3) + "****" + phone.substring(7)`
- 加长度校验更稳妥:先判断 `phone != null && phone.length() == 11`,避免空指针或错位
- 正则方式更灵活(适配带区号或分隔符的格式):
`phone.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2")`
身份证号:保留前6位和后4位
18位身份证前6位是地址码,后4位含校验和出生年份片段,中间10位属于强隐私字段:
- 基础写法:
`idCard.length() == 18 ? idCard.substring(0, 6) + "**********" + idCard.substring(14) : idCard` - 正则更简洁(且兼容15位旧证):
`idCard.replaceAll("(?——意思是:匹配位于“开头6位数字之后、结尾4位数字之前”的每一个数字,全替成 *
通用字符串:只留首尾,中间全掩码
适用于姓名、地址、用户名等不定长文本,要求最小化暴露又保持可读性:
- 逻辑清晰的 StringBuilder 方式:
if (str == null || str.length() new StringBuilder().append(str.charAt(0))
.append("*".repeat(Math.max(0, str.length() - 2)))
.append(str.charAt(str.length() - 1)).toString(); - 一行函数式写法(JDK 11+):
`str == null || str.length()
邮箱和银行卡号:按结构分段脱敏
这类字段有固定格式,脱敏要尊重语义,不能破坏可识别性:
-
邮箱:保留用户名首字母和域名,中间隐藏
`email.replaceAll("(\w{1})\w+(@\w+\.\w+)", "$1***$2")` → `z***@example.com` -
银行卡号:通常只显示后4位,前面用 * 分组遮盖(每4位一组)
`card.replaceAll("\d(?=\d{4})", "*")` → `**** **** **** 1234` - 注意:银行卡号脱敏后建议加空格分隔,提升可读性,前端或工具类里补上即可
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











