环境:SpringBoot2.4.12
概述
项目中开发的API接口,可能有些接口返回的字段信息不能以明文的形式传输,这时候我们该如何进行处理呢?以下给出3中方式:
在SQL查询的时候进行处理,但这种效率不高,一般不会这样处理。如下:
SELECTCONCAT(LEFT( idNo, 6), '********', RIGHT (idNo, 4)) as idNoFROMusers where id = 7;
查询结果:
以掩码的方式处理部分数据
该种方式就是将你需要处理的字段完全通过对称加密或者HASH算法进行处理。
API接口在生成JSON字符串的时候(序列化时)将敏感信息进行掩码处理或者加密处理
接下来将介绍第三种方式"Json序列化时处理"
JSON序列化处理脱敏
使用jackson时在对对象序列化时进行敏感字段的处理,为了简单我们通过自定义注解的方式来实现该功能。
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)// 该注解必须,不然jackson不会识别该注解@JacksonAnnotationsInside// 指定我们需要序列化字段的实现@JsonSerialize(using = SensitiveSerializer.class)public @interface Sensitive {* 正则表达式* @returnString pattern() default "" ;* 正则表达式的第几个分组;该分组将被替换为掩码mask* @returnint group() default 0 ;* 掩码* @returnString mask() default "*" ;public interface Pattern {/**身份证*/String ID = "(\w{5})(\w+)(\w{3})" ;/**电话*/String PHONE = "(\w){3}(\w+)(\w{2})" ;/**私密*/String KEY = "(\w+)" ;
自定义序列化实现
public class SensitiveSerializer extends JsonSerializer implements ContextualSerializer {private Sensitive sensitive ;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {String val = value ;if (sensitive != null) {String pattern = sensitive.pattern() ;int groupIndex = sensitive.group() ;String mask = sensitive.mask() ;if (pattern.length() > 0) {Pattern pa = Pattern.compile(pattern) ;Matcher matcher = pa.matcher(value) ;if (matcher.matches()) {String group = matcher.group(groupIndex) ;if (mask.length() > 0 && group.length() > 0) {val = val.replace(group, String.join("", Collections.nCopies(group.length(), mask))) ;gen.writeObject(val) ;@Overridepublic JsonSerializer createContextual(SerializerProvider prov, BeanProperty property)throws JsonMAppingException {sensitive = property.getAnnotation(Sensitive.class) ;return this ;
该类实现了ContextualSerializer通过该类的回调方法能够用来读取当前字段上的注解信息。
public class Users {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+10")private Date birthday ;private Integer age ;private String name ;// 在需要处理的字段上加入上面定义的注解,这里我们也可以自定义表达式@Sensitive(pattern = Sensitive.Pattern.ID)private String idNo
运行效果:
idNo按照指定的规则进行了掩码处理
完毕!!!