环境:SpringBoot2.4.12
概述
项目中开发的API接口 , 可能有些接口返回的字段信息不能以明文的形式传输 , 这时候我们该如何进行处理呢?以下给出3中方式:
- 数据库层面处理
在SQL查询的时候进行处理 , 但这种效率不高 , 一般不会这样处理 。如下:
SELECTCONCAT(LEFT( idNo, 6), '********', RIGHT (idNo, 4)) as idNoFROMusers where id = 7;
查询结果:
文章插图
以掩码的方式处理部分数据
- 数据加密处理
该种方式就是将你需要处理的字段完全通过对称加密或者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
运行效果:
文章插图
idNo按照指定的规则进行了掩码处理
完毕!!!
推荐阅读
- 秋瓷炫|43岁秋瓷炫赤脚晒太阳,坐家中地板气质优雅,手拿咖啡十分惬意
- 中美互联网协议2020年到期 中美互联网论坛?
- 八款中秋月饼馅配方汇总 中秋月饼
- 美国服装巨头败走中国,关闭300多家门店,现已申请破产保护!
- 每日一中药——木瓜 木瓜的功效与作用禁忌!
- 中国茶艺表演36步骤 茶道表演
- 中国种植水稻四千年,3980年没能解决温饱,直到神农袁隆平的出现
- 电影|最美95花,大家评判一下她们在影像中的表现
- 洗发水|理发店中的洗发水,超市里为什么都没有卖?说出来你可能不信
- 诗经中执子之手 与子偕老是指什么感情 执子之手与子偕老出自诗经哪部分