实现思路
- 手机号脱敏:保留前3位和后4位,中间4位替换为 ****
- 邮箱脱敏:保留 @ 后的域名,前缀替换为 ****
- 身份证脱敏:保留前6位和后4位,中间8位(出生年月日)替换为 ********
代码实现
定义脱敏工具类 SensitiveDataUtils
public class SensitiveDataUtils {public static String maskPhone(String phone) {if (phone == null || phone.length() != 11) {return phone;}return phone.substring(0, 3) + "****" + phone.substring(7);}public static String maskEmail(String email) {if (email == null || !email.contains("@")) {return email;}int atIndex = email.indexOf('@');return "****" + email.substring(atIndex);}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"; String email = "example123@example.com"; String idCard = "11010219490811123X"; String maskedPhone = SensitiveDataUtils.maskPhone(phone);String maskedEmail = SensitiveDataUtils.maskEmail(email);String maskedIdCard = SensitiveDataUtils.maskIDCard(idCard);System.out.println(maskedPhone); System.out.println(maskedEmail); System.out.println(maskedIdCard); }
}
关键点说明
- 边界条件处理:对于 null 或格式不正确的数据(如手机号非11位、身份证非18位),直接返回原值,避免空指针或索引越界。邮箱必须包含 @ 符号才进行处理,否则返回原值。
- 性能优化:使用 substring 方法进行字符串截取,时间复杂度为 O(n),适合短字符串处理。工具方法均为 static,可直接调用无需实例化,符合 Java 工具类设计规范。
- 扩展性:可通过修改 substring 参数和掩码字符串,快速适配其他脱敏规则(如手机号尾号显示3位)。
适用场景
- 用户隐私保护:在用户信息展示、日志输出、API 接口返回时进行脱敏。
- 数据合规性要求:符合《个人信息保护法》对敏感信息的处理规范。