头部右侧文字
头部左侧文字
当前位置:网站首页 > 科技 > 正文

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

cndao cndao ⋅ 2022-12-10 11:31:41

环境:SpringBoot2.4.12


概述

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

  • 数据库层面处理

在SQL查询的时候进行处理,但这种效率不高,一般不会这样处理。如下:

SELECT	CONCAT(LEFT( idNo, 6), '********', RIGHT (idNo, 4)) as idNoFROM	users where id = 7;

查询结果:

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

以掩码的方式处理部分数据

  • 数据加密处理

该种方式就是将你需要处理的字段完全通过对称加密或者HASH算法进行处理。

  • JSON序列化时处理

API接口在生成JSON字符串的时候(序列化时)将敏感信息进行掩码处理或者加密处理

接下来将介绍第三种方式"JSON序列化时处理"

JSON序列化处理脱敏

使用jackson时在对对象序列化时进行敏感字段的处理,为了简单我们通过自定义注解的方式来实现该功能。

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)// 该注解必须,不然jackson不会识别该注解@JacksonAnnotationsInside// 指定我们需要序列化字段的实现@JsonSerialize(using = SensitiveSerializer.class)public @interface Sensitive {  /**   * 正则表达式   * @return   */  String pattern() default "" ;    /**   * 正则表达式的第几个分组;该分组将被替换为掩码mask   * @return   */  int group() default 0 ;    /**   * 掩码   * @return   */  String 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<String> implements ContextualSerializer {  private Sensitive sensitive ;    @Override  public 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) ;  }    @Override  public 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按照指定的规则进行了掩码处理

完毕!!!

SpringMVC参数统一验证方法
SpringMVC内嵌Tomcat零配置
SpringMVC中的这些接口注解属性你都了解了吗?
SpringMVC的父子容器你都了解了吗?
完全自定义实现SpringMVC核心组件
完全自定义实现SpringMVC核心组件
SpringMVC自定义注解实现接口调用
SpringMVC自定义注解实现接口调用
SpringMVC请求原理源码分析
SpringMVC的父子容器你都了解了吗?

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

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

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

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

cndao

cndao

TA太懒了...暂时没有任何简介

精彩新闻