SpringBoot中实现处理API接口敏感数据的脱敏

环境:SpringBoot2.4.12
概述
项目中开发的API接口 , 可能有些接口返回的字段信息不能以明文的形式传输 , 这时候我们该如何进行处理呢?以下给出3中方式:
 

  • 数据库层面处理
 
在SQL查询的时候进行处理 , 但这种效率不高 , 一般不会这样处理 。如下:
SELECTCONCAT(LEFT( idNo, 6), '********', RIGHT (idNo, 4)) as idNoFROMusers where id = 7;
查询结果:
SpringBoot中实现处理API接口敏感数据的脱敏

文章插图
以掩码的方式处理部分数据
 
  • 数据加密处理
 
该种方式就是将你需要处理的字段完全通过对称加密或者HASH算法进行处理 。
 
  • JSON序列化时处理
 
【SpringBoot中实现处理API接口敏感数据的脱敏】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
运行效果:
SpringBoot中实现处理API接口敏感数据的脱敏

文章插图
idNo按照指定的规则进行了掩码处理
完毕!!!




    推荐阅读