【工作笔记】Springboot一个比较通用的数据脱敏处理办法

news/2024/11/20 7:47:47/

  背景

        个人信息中的手机号、邮箱等属于敏感数据,其中手机号需要加密存储,邮箱可以直接存储但是在获取和展示时要做脱敏处理;

        针对此类敏感数据, 介绍一种比较通用的脱敏方法。


基于注解

        1. 定义DataMask注解

        

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DataMask {DataMaskEnum value() default DataMaskEnum.NO_MASK;
}

        2. 定义DataMaskOperation接口

public interface DataMaskOperation {String mask(String content);
}

        3. 定义DataMaskEnum敏感数据类型枚举

public enum DataMaskEnum {NO_MASK(str -> str),PHONE_MASK(phone -> {return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");}),EMAIL_MASK(email -> {return email.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");});private final DataMaskOperation operation;DataMaskEnum(DataMaskOperation operation) {this.operation = operation;}public DataMaskOperation operation() {return this.operation;}}

        4. 定义ValueDensitizeFilter

public class ValueDesensitizeFilter implements ValueFilter {private final Map<Class<?>, Map<String, DataMask>> map = new ConcurrentHashMap<>();@Overridepublic Object process(Object object, String name, Object value) {if (ObjectUtils.isEmpty(value) || !(value instanceof String) || object instanceof Map || object instanceof Collection) {return value;}if (!map.containsKey(object.getClass())) {setFields(object.getClass());}Map<String, DataMask> stringDataMaskingMap = map.get(object.getClass());if (stringDataMaskingMap == null || stringDataMaskingMap.isEmpty()) {return value;}DataMask dataMask = stringDataMaskingMap.get(name);if (dataMask != null) {return dataMask.value().operation().mask((String) value);}return value;}private void setFields(Class<?> clazz) {Field[] declaredFields = clazz.getDeclaredFields();Map<String, DataMask> fieldMap = new ConcurrentHashMap<>();if (declaredFields != null && declaredFields.length > 0) {for (Field field : declaredFields) {String name = field.getName();DataMask dataMask = field.getAnnotation(DataMask.class);if (field.getType() == String.class && dataMask != null) {fieldMap.put(name, dataMask);}}}map.put(clazz, fieldMap);}
}

        5. 注册Filter

@Configuration
@ConditionalOnClass({JSON.class}) //项目中集成fastjson时才进行配置
public class FastJsonSpringBootConfig {@Beanpublic HttpMessageConverters fastJsonHttpMessageConverters(){//定义一个convert转换消息的对象FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();//添加fastjson的配置信息,比如是否要格式化返回的json数据;FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);fastJsonConfig.setSerializeFilters(new ValueDesensitizeFilter());//添加自己写的拦截器//附加:处理中文乱码List<MediaType> fastMedisTypes = new ArrayList<MediaType>();fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);fastConverter.setSupportedMediaTypes(fastMedisTypes);//日期格式化fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");//在convert中添加配置信息fastConverter.setFastJsonConfig(fastJsonConfig);HttpMessageConverter<?> converter=fastConverter;return new HttpMessageConverters(converter);}
}

        6. 为需要脱敏的字段添加注解

 

    //邮箱@DataMask(DataMaskEnum.EMAIL_MASK)private String email;//手机号@DataMask(DataMaskEnum.PHONE_MASK)private String phone;

        这样在后端接口返回数据做序列化时,会自动将敏感信息脱敏;


        一些场合下,传输的数据并非Java对象,而是例如List,Map,Array此类数据,针对此类数据,可以直接指定其序列化配置,达到脱敏效果:

        SerializeConfig serializeConfig = new SerializeConfig();serializeConfig.addFilter(UserEntity.class, new ValueDesensitizeFilter());Map<String, Object> userMap = JSON.parseObject(JSON.toJSONString(userEntity, serializeConfig()), Map.class);

        这样在生成的Map中,Value值也可以脱敏。


http://www.ppmy.cn/news/63457.html

相关文章

Maven 知识点总结

文章目录 核心点&#xff1a;Maven 能做什么&#xff1f;Maven的安装1、安装2、配置文件 Maven 的概念1、坐标&#xff1a;通过坐标唯一定位2、scope依赖范围3、maven的传递性依赖性质4、optional可选依赖5、exclusion排除依赖6、properties归类依赖7、优化依赖 Maven基本使用1…

125-Linux_守护进程

文章目录 1. 什么是Linux守护进程&#xff1f;2. 如何创建Linux守护进程&#xff1f;① 切换当前工作目录到根目录&#xff0c;这样可以避免守护进程在其它目录中的文件被占用。② 使用fork()函数创建子进程&#xff0c;并在父进程中退出。③ 在子进程中调用setsid()函数创建新…

喜报丨酷雷曼荣膺最佳创新品牌价值奖

2023年4月&#xff0c;“元力觉醒新浪VR 2022年度行业奖项”颁奖盛典成功举行&#xff0c;酷雷曼VR&#xff08;北京同创蓝天云科技有限公司&#xff09;荣获“最佳创新品牌价值奖”荣誉称号&#xff01; 本次大会由元宇宙产业的权威门户媒体新浪VR主办&#xff0c;中国民协元…

windows 下Node.js 版本管理工具

目录 1、概述&#xff1a; 2、下载安装 3、nvm命令 4、如何安装不在可用列表里面的版本 1、概述&#xff1a; 不同项目使用的nodejs版本和依赖等不同&#xff0c;需要进行nodejs的版本切换&#xff0c;使用nvm可以方便的切换当前的nodejs版本 windows可以使用 nvm-window…

虚拟化无法开启

虚拟化无法开启 开启虚拟机&#xff0c;突然出现以下报错&#xff1a; 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。 如果已在 BIOS/固件设置中禁用 Intel VT-x&#xff0c;或主机自更改此设置后从未重新启动&#xff0c;则 Intel VT-x 可能被禁用。 (1…

开关电源基础07:离线式开关电源变压器设计(2)

说在开头&#xff1a;关于那几年 1933年希特勒上台成为德国总理&#xff0c;纳粹党开始了针对犹太人的运动。英国的弗雷德里克.亚历山大.林德曼教授到访柏林&#xff0c;他制定了一份名单&#xff0c;开列的都是处境不妙的犹太科学家&#xff0c;趁机邀请他们离开德国&#xf…

慎入坑:腾讯云轻量2核2G3M服务器30元不建议选择

腾讯云轻量应用服务器2核2G3M带宽30元3个月不建议买&#xff0c;自带3M带宽&#xff0c;下载速度可达384KB/秒&#xff0c;100%CPU性能&#xff0c;系统盘为40GB SSD盘&#xff0c;200GB月流量&#xff0c;折合每天6.6G流量&#xff0c;地域节点可选上海/广州/北京&#xff0c;…

机器学习(二):线性回归之梯度下降法

文章目录 专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《机器学习案例》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分…