Java 中数据脱敏的实现
数据脱敏
首先,要思考一个问题,SpringBoot 查询到的一条数据是一个 Java 对象,为什么返回给前端时候,前端拿到的却是 JSON 格式的数据呢?
是因为 SpringBoot 默认采用了 Jackson 作为序列化器,而 Jackson 序列化框架会自动把 Java 对象转换成 JSON 格式的数据,然后返回。
通过这个思路,就可以得到一个方案,就是在 JSON 序列化这个层面,去解决这个问题,从而对数据进行脱敏。
1. 自定义一个 Jackson 序列化器
public class IdNumberJsonSerializer extends JsonSerializer<String> {
/**
* 举例:身份证号脱敏处理
*
* @return: String 脱敏后的结果
* @param: value 需要被序列化的字符串对象
* @param: jsonGenerator Json 生成器对象,用于生成 JSON 字符串
* @param: serializerProvider 序列化提供者,用于提供序列化相关的上下文信息
*/
@Override
public void serialize(
String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider
) throws IOException {
if(value != null) {
value = value.replaceAll("(\\d{6})\\d{10}(\\w{2})", "$1********$2");
jsonGenerator.writeString(value);
return;
}
jsonGenerator.writeNull();
}
}
这里以身份证号进行举例
2. 把自定义序列化器应用到对应字段
在需要脱敏的字段上添加 @JsonSerialize
注解
public class User {
/** 姓名 */
private String name;
/** 年龄 */
private int age;
/** 身份证号 */
@JsonSerialize(using = IdNumberJsonSerializer.class)
private String idCard;
}
优点:使用灵活方便