Hutool:一行代码搞定数据脱敏
1.1 数据脱敏的定义
1.2 常用脱敏规则
2.1 引入Maven配置
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>
2.2 Hutool包含的组件

2.3 Hutool支持的脱敏数据类型
-
用户id -
中文姓名 -
身份证号 -
座机号 -
手机号 -
地址 -
电子邮件 -
密码 -
中国大陆车牌,包含普通车辆、新能源车辆 -
银行卡
3.1 使用Hutool工具类一行代码实现脱敏
import cn.hutool.core.util.DesensitizedUtil;import org.junit.Test;import org.springframework.boot.test.context.SpringBootTest;/**** @description: Hutool实现数据脱敏*/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通过注解方式实现脱敏
/*** @author* @description:脱敏策略枚举*/public enum DesensitizationTypeEnum {//自定义MY_RULE,//用户idUSER_ID,//中文名CHINESE_NAME,//身份证号ID_CARD,//座机号FIXED_PHONE,//手机号MOBILE_PHONE,//地址ADDRESS,//电子邮件EMAIL,//密码PASSWORD,//中国大陆车牌,包含普通车辆、新能源车辆CAR_LICENSE,//银行卡BANK_CARD}
-
@Retention(RetentionPolicy.RUNTIME):运行时生效。 -
@Target(ElementType.FIELD):可用在字段上。 -
@JacksonAnnotationsInside:此注解可以点进去看一下是一个元注解,主要是用户打包其他注解一起使用。 -
@JsonSerialize:上面说到过,该注解的作用就是可自定义序列化,可以用在注解上,方法上,字段上,类上,运行时生效等等,根据提供的序列化类里面的重写方法实现自定义序列化。
/*** @author*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@JsonSerialize(using = DesensitizationSerialize.class)public @interface Desensitization {/*** 脱敏数据类型,在MY_RULE的时候,startInclude和endExclude生效*/DesensitizationTypeEnum type() default DesensitizationTypeEnum.MY_RULE;/*** 脱敏开始位置(包含)*/int startInclude() default 0;/*** 脱敏结束位置(不包含)*/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;// 手机号脱敏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;// 中国车牌脱敏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) {// 判断数据类型是否为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) {// 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。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("地球中国-北京市通州区京东总部2号楼");testPojo.setPhone("13782946666");testPojo.setPassword("sunyangwei123123123.");System.out.println(testPojo);return testPojo;}}
4.1 Apache ShardingSphere
4.2 FastJSON
-
基于注解@JSONField实现:需要自定义一个用于脱敏的序列化的类,然后在需要脱敏的字段上通过@JSONField中的serializeUsing 指定为我们自定义的序列化类型即可。 -
基于序列化过滤器:需要实现ValueFilter接口,重写process方法完成自定义脱敏,然后在JSON转换时使用自定义的转换策略。
4.3 Mybatis-mate
# Mybatis Mate 配置:cert:grant: jxftsdfggggxlicense: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ==
参考资料:
[1] Hutool工具官网:https://hutool.cn/docs/#/?id=%f0%9f%93%9a%e7%ae%80%e4%bb%8b
[2] 聊聊如何自定义数据脱敏:https://juejin.cn/post/7046567603971719204
[3] FastJSON实现数据脱敏:https://juejin.cn/post/7067916686141161479
评论
