数据脱敏是一种保护隐私数据的技术,通过将敏感信息转化为非敏感信息来实现对数据的保护,以保护敏感隐私数据的可靠性和安全性。
数据脱敏可以分为可恢复和不可恢复两类:
在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。
在日常的开发中,除了数据脱敏外,还需要将一些敏感的数据从响应中进行剔除,不返回给前端,比如用户信息中的password字段。
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
可以通过这个注解对指定的字段不进行序列化,前端也就无法收到这个字段。
本文就以“截断”为案例进行展示。
使用截断的方式对数据进行脱敏是一种常见的脱敏方法。它主要是通过对敏感数据的某一部分或全部用特殊字符(如*)或固定字符(如“X”)进行替换,以隐藏敏感信息的真实内容。
这种脱敏方法的主要优点是操作简单,实施方便。同时,由于敏感信息被替换为非敏感字符,因此可以有效地保护敏感数据的隐私。
接口名称 | 描述 | 方法 |
---|---|---|
Function | 通常用于将一个类型的值转换为另一个类型的值。 | R apply(T t) |
Consumer | 通常用于消费一个参数然后执行一些操作 | void accept(T t) |
Supplier | 该接口可以作为数据提供者 | T get(); |
Predicate | 通常用于测试一个条件是否成立 | boolean test(T t); |
熟悉Java8所提供的函数接口,可以简化代码的同时也可以提升代码质量。
在枚举中直接使用Function
函数接口对数据进行截断替换。
import java.util.function.Function;
/**
* Created by Time Travel
* 2023/11/27 17:26
**/
public enum SensitiveStrategy {
// 身份证
ID_CARD(s -> s.replaceAll("(\\d{3})\\d{12}(\\w{3})", "$1*****$2")),
// 手机号
PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
// 地址
ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}\\S*(\\S{2})", "$1********$2"));
private final Function<String, String> serialize;
SensitiveStrategy(Function<String, String> serialize) {
this.serialize = serialize;
}
public Function<String, String> serialize() {
return serialize;
}
}
$1和$2分别匹配的是正则中的第一个括号和第二个括号里的内容。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
SensitiveStrategy strategy();
}
@JacksonAnnotationsInside:在Jackson中常被用于标记复合注解。当开发者需要将多个Jackson注解组合成一个自定义注解时,就会使用到这个注解。
@JsonSerialize:作用是将java对象序列化为json数据。它常用于字段或get方法上,作用于getter()方法,将java对象序列化为json数据。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import java.io.IOException;
import java.util.Objects;
/**
* Created by Time Travel
* 2023/11/27 17:27
**/
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
private SensitiveStrategy strategy;
// 进行序列化
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(strategy.serialize().apply(value));
}
// 获取属性上的注解属性
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
Sensitive annotation = property.getAnnotation(Sensitive.class);
if (Objects.nonNull(annotation) && Objects.equals(String.class,
property.getType().getRawClass())) {
this.strategy = annotation.strategy();
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String nickname;
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phone;
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String identifyCard;
@Sensitive(strategy = SensitiveStrategy.ADDRESS)
private String address;
}
使用数据脱敏方案可以有效地保护隐私和敏感数据的安全,同时满足数据处理和测试等需求,以下是使用数据脱敏方案的总结: