如何用Java实现数据脱敏处理_Java敏感信息保护方案说明

Java数据脱敏核心是识别敏感字段、定义规则、适时替换;支持手机号、身份证、姓名、银行卡、邮箱等类型注解标记,通过反射工具类自动处理,并借助ResponseBodyAdvice实现Spring MVC响应前统一脱敏。

Java中实现数据脱敏,核心是**识别敏感字段 + 定义脱敏规则 + 在合适时机执行替换**,不依赖第三方框架也能快速落地。

明确常见敏感字段类型和脱敏方式

不同字段适用不同脱敏策略,需按业务安全等级选择:

  • 手机号:保留前3位和后4位,中间用*代替(如 138****1234)
  • 身份证号:保留前6位和后4位,中间掩码(如 110101****1234)
  • 姓名:只显示姓氏,名用*替代(如 张*);多人名可统一处理为“某先生/某女士”
  • 银行卡号:保留后4位,其余用*填充(如 **** **** **** 5678)
  • 邮箱:保留@前首字符和域名部分(如 z***@example.com)

在实体类中声明脱敏标记(轻量级注解方案)

自定义一个 @Desensitize 注解,标注需要脱敏的字段,并指定脱敏类型:

@Target({FIELD})
@Retention(RUNTIME)
public @interface Desensitize {
    DesensitizeType value() default DesensitizeType.DEFAULT;
}

再定义枚举 DesensitizeType 包含 PHONE、ID_CARD、NAME、EMAIL 等值。这样既清晰又便于后续统一处理。

通过反射 + 注解实现实体自动脱敏

写一个工具类 DesensitizeUtil,遍历对象所有字段,检查是否含 @Desensitize 注解,根据类型调用对应脱敏方法:

  • 使用 Fiel

    d.setAccessible(true)
    访问私有字段
  • 对字符串类型字段做掩码替换,非字符串跳过
  • 支持嵌套对象(递归处理)和集合(遍历每个元素)
  • 脱敏逻辑集中管理,新增类型只需扩展枚举和 switch 分支

结合Spring MVC在响应前统一脱敏

利用 ResponseBodyAdvice 接口,在 Controller 返回响应体之前拦截并脱敏:

@ControllerAdvice
public class DesensitizeResponseAdvice implements ResponseBodyAdvice {
    @Override
    public Object beforeBodyWrite(Object body, ... ) {
        return DesensitizeUtil.desensitize(body);
    }
}

这样所有返回 JSON 的接口自动生效,无需每个 Controller 手动调用,也避免脱敏逻辑散落在业务代码中。