Hutool:一行代碼搞定數(shù)據(jù)脫敏
1.1 數(shù)據(jù)脫敏的定義
1.2 常用脫敏規(guī)則
2.1 引入Maven配置
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>
2.2 Hutool包含的組件

2.3 Hutool支持的脫敏數(shù)據(jù)類型
-
用戶id -
中文姓名 -
身份證號(hào) -
座機(jī)號(hào) -
手機(jī)號(hào) -
地址 -
電子郵件 -
密碼 -
中國(guó)大陸車牌,包含普通車輛、新能源車輛 -
銀行卡
3.1 使用Hutool工具類一行代碼實(shí)現(xiàn)脫敏
import cn.hutool.core.util.DesensitizedUtil;import org.junit.Test;import org.springframework.boot.test.context.SpringBootTest;/**** @description: Hutool實(shí)現(xiàn)數(shù)據(jù)脫敏*/public class HuToolDesensitizationTest {public void testPhoneDesensitization(){String phone="13723231234";System.out.println(DesensitizedUtil.mobilePhone(phone)); //輸出:137****1234}public void testBankCardDesensitization(){String bankCard="6217000130008255666";System.out.println(DesensitizedUtil.bankCard(bankCard)); //輸出:6217 **** **** *** 5666}public void testIdCardNumDesensitization(){String idCardNum="411021199901102321";//只顯示前4位和后2位System.out.println(DesensitizedUtil.idCardNum(idCardNum,4,2)); //輸出:4110************21}public void testPasswordDesensitization(){String password="www.jd.com_35711";System.out.println(DesensitizedUtil.password(password)); //輸出:****************}}
3.2 配合JackSon通過(guò)注解方式實(shí)現(xiàn)脫敏
/*** @author* @description:脫敏策略枚舉*/public enum DesensitizationTypeEnum {//自定義MY_RULE,//用戶idUSER_ID,//中文名CHINESE_NAME,//身份證號(hào)ID_CARD,//座機(jī)號(hào)FIXED_PHONE,//手機(jī)號(hào)MOBILE_PHONE,//地址ADDRESS,//電子郵件EMAIL,//密碼PASSWORD,//中國(guó)大陸車牌,包含普通車輛、新能源車輛CAR_LICENSE,//銀行卡BANK_CARD}
-
@Retention(RetentionPolicy.RUNTIME):運(yùn)行時(shí)生效。 -
@Target(ElementType.FIELD):可用在字段上。 -
@JacksonAnnotationsInside:此注解可以點(diǎn)進(jìn)去看一下是一個(gè)元注解,主要是用戶打包其他注解一起使用。 -
@JsonSerialize:上面說(shuō)到過(guò),該注解的作用就是可自定義序列化,可以用在注解上,方法上,字段上,類上,運(yùn)行時(shí)生效等等,根據(jù)提供的序列化類里面的重寫方法實(shí)現(xiàn)自定義序列化。
/*** @author*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@JsonSerialize(using = DesensitizationSerialize.class)public @interface Desensitization {/*** 脫敏數(shù)據(jù)類型,在MY_RULE的時(shí)候,startInclude和endExclude生效*/DesensitizationTypeEnum type() default DesensitizationTypeEnum.MY_RULE;/*** 脫敏開(kāi)始位置(包含)*/int startInclude() default 0;/*** 脫敏結(jié)束位置(不包含)*/int endExclude() default 0;}
/*** @author* @description: 自定義序列化類*/public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {private DesensitizationTypeEnum type;private Integer startInclude;private Integer endExclude;public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {switch (type) {// 自定義類型脫敏case MY_RULE:jsonGenerator.writeString(CharSequenceUtil.hide(str, startInclude, endExclude));break;// userId脫敏case USER_ID:jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));break;// 中文姓名脫敏case CHINESE_NAME:jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));break;// 身份證脫敏case ID_CARD:jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str), 1, 2));break;// 固定電話脫敏case FIXED_PHONE:jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));break;// 手機(jī)號(hào)脫敏case MOBILE_PHONE:jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str)));break;// 地址脫敏case ADDRESS:jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str), 8));break;// 郵箱脫敏case EMAIL:jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str)));break;// 密碼脫敏case PASSWORD:jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str)));break;// 中國(guó)車牌脫敏case CAR_LICENSE:jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str)));break;// 銀行卡脫敏case BANK_CARD:jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str)));break;default:}}public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {if (beanProperty != null) {// 判斷數(shù)據(jù)類型是否為String類型if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {// 獲取定義的注解Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);// 為nullif (desensitization == null) {desensitization = beanProperty.getContextAnnotation(Desensitization.class);}// 不為nullif (desensitization != null) {// 創(chuàng)建定義的序列化類的實(shí)例并且返回,入?yún)樽⒔舛x的type,開(kāi)始位置,結(jié)束位置。return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(),desensitization.endExclude());}}return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);}return serializerProvider.findNullValueSerializer(null);}}
/**** @description:*/public class TestPojo {private String userName;(type = DesensitizationTypeEnum.MOBILE_PHONE)private String phone;(type = DesensitizationTypeEnum.PASSWORD)private String password;(type = DesensitizationTypeEnum.MY_RULE, startInclude = 0, endExclude = 2)private String address;}
public class TestController {public TestPojo testDesensitization(){TestPojo testPojo = new TestPojo();testPojo.setUserName("我是用戶名");testPojo.setAddress("地球中國(guó)-北京市通州區(qū)京東總部2號(hào)樓");testPojo.setPhone("13782946666");testPojo.setPassword("sunyangwei123123123.");System.out.println(testPojo);return testPojo;}}
4.1 Apache ShardingSphere
4.2 FastJSON
-
基于注解@JSONField實(shí)現(xiàn):需要自定義一個(gè)用于脫敏的序列化的類,然后在需要脫敏的字段上通過(guò)@JSONField中的serializeUsing 指定為我們自定義的序列化類型即可。 -
基于序列化過(guò)濾器:需要實(shí)現(xiàn)ValueFilter接口,重寫process方法完成自定義脫敏,然后在JSON轉(zhuǎn)換時(shí)使用自定義的轉(zhuǎn)換策略。
4.3 Mybatis-mate
# Mybatis Mate 配置:cert:grant: jxftsdfggggxlicense: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ==
參考資料:
[1] Hutool工具官網(wǎng):https://hutool.cn/docs/#/?id=%f0%9f%93%9a%e7%ae%80%e4%bb%8b
[2] 聊聊如何自定義數(shù)據(jù)脫敏:https://juejin.cn/post/7046567603971719204
[3] FastJSON實(shí)現(xiàn)數(shù)據(jù)脫敏:https://juejin.cn/post/7067916686141161479
評(píng)論
圖片
表情
