環境:SpringBoot2.4.12
概述
項目中開發的API接口,可能有些接口返回的字段信息不能以明文的形式傳輸,這時候我們該如何進行處理呢?以下給出3中方式:
- 數據庫層面處理
在SQL查詢的時候進行處理,但這種效率不高,一般不會這樣處理。如下:
SELECTCONCAT(LEFT( idNo, 6), '********', RIGHT (idNo, 4)) as idNoFROMusers where id = 7;
查詢結果:
以掩碼的方式處理部分數據
- 數據加密處理
該種方式就是將你需要處理的字段完全通過對稱加密或者HASH算法進行處理。
- JSON序列化時處理
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按照指定的規則進行了掩碼處理
完畢!!!