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

这篇具有很好参考价值的文章主要介绍了【工作笔记】Springboot一个比较通用的数据脱敏处理办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  背景

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

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


基于注解

        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<>();

    @Override
    public 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 {

	@Bean
    public 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值也可以脱敏。文章来源地址https://www.toymoban.com/news/detail-438679.html

到了这里,关于【工作笔记】Springboot一个比较通用的数据脱敏处理办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

    物料准备: 1.hutool依赖 2.自定义的jackson序列化器 3.测试@JsonSerialize效果 因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。 如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖 自定义一个手机号脱敏序列化器 自定义一个邮箱脱敏序列化

    2024年02月12日
    浏览(57)
  • NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063

      nifi好用,但是对机器的性能要求也高,如果性能达不到,就会导致,问题发生,比如,队列里显示有内容,但是实际上队列是空的,清也清不掉,只能重启,很麻烦.   关于优化:1.配置前端页面刷新的间隔时间默认30秒,我们可以自己需要看的时候手动刷新我们改成300sec 2.修改CPU阻塞时间

    2024年02月06日
    浏览(35)
  • 图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

    2023-09-10 10:37:48 补充 注意:下面是旧版本的语法,如果你发现@NodeEntity这样的注解没有的话可以这样: 这里就要用@Node 另外如果@StartNode和@EndNode都没有了,那么说明是用法变了. 关于最新的用法,在官网有明确的说明和案例,很有用: 下面给出官网的案例:

    2024年02月12日
    浏览(37)
  • 图数据库_Neo4j和SpringBoot Data整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

    2023-09-10 10:37:48 补充 注意:下面是旧版本的语法,如果你发现@NodeEntity这样的注解没有的话可以这样: 这里就要用@Node 另外如果@StartNode和@EndNode都没有了,那么说明是用法变了. 关于最新的用法,在官网有明确的说明和案例,很有用: 下面给出官网的案例:

    2024年02月09日
    浏览(38)
  • SpringBoot进阶-SpringBoot如何实现配置文件脱敏

    SpringBoot进阶-SpringBoot如何实现配置文件脱敏? SpringBoot集成jasypt配置信息加密以及采坑 在很多开发场景中我们的SpringBoot应用是被打包成了一个Jar文件来使用的,利用解压缩工具可以将这个Jar包解压出来并且在对应的配置路径下找到数据库的访问地址以及数据库的登录密码等等

    2024年02月08日
    浏览(31)
  • SpringBoot配置文件脱敏

    SpringBoot集成Jasypt配置很简单,只需引入依赖,然后配置Jasypt相关属性参数即可: ● Maven ● 生成密文 ● 配置加解密bean ● 注册加解密bean ● 生成密文 ● 配置文件加密 密文使用ENC()包裹 ● 启动应用时,配置系统属性,idea配置VM选项

    2024年02月13日
    浏览(28)
  • 图数据库_Neo4j和SpringBoot整合使用_创建节点_删除节点_创建关系_使用CQL操作图谱---Neo4j图数据库工作笔记0009

    首先需要引入依赖   springboot提供了一个spring data neo4j来操作 neo4j   可以看到它的架构   这个是下载下来的jar包来看看 有很多cypher对吧   可以看到就是通过封装的驱动来操作graph database   然后开始弄一下 首先添加依赖

    2024年02月12日
    浏览(38)
  • 使用js编写一个函数判断所有数据类型的通用方法

    一、判断数据类型的方法 1、typeof 在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。 对于数组、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。 要想区别对象、数组单

    2024年02月22日
    浏览(39)
  • 什么是数据脱敏,数据脱敏有哪些方式

            数据脱敏又称数据去隐私化或数据变形,是在给定的规则、策略下对敏感数据进行变换、修改的技术机制,能够在很大程度上解决敏感数据在非可信环境中使用的问题。 静态脱敏 静态脱敏是指对敏感数据进行脱敏处理后,将数据从生产环境导入到其他非生产环境

    2024年02月11日
    浏览(45)
  • Java 版本号比较大小(思路通用)

    目的 :大于或者等于返回 true ,小于返回 false 。 思路 :开始用了比较基础的办法也实现这个功能,但是写三四个嵌套 if 不太友善,况且工作中这样写也会拉低代码质量,后面就用了循环,同时不论你的版本号有几位都适用。 自己想到的一个判断版本号的小方法,希望可以

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包