Springboot+Hutool自定义注解实现数据脱敏

 更新时间:2023年10月10日 14:52:08   作者:掉发的小王  
我们在项目中会处理敏感数据时,通常需要对这些数据进行脱敏,本文主要使用了Springboot整合Hutool来自定义注解实现数据脱敏,感兴趣的可以理解下

一、前言

我们在项目中会处理敏感数据(如手机号、身份证号、姓名、地址等)时,通常需要对这些数据进行脱敏,以确保数据隐私和安全。

我们本次使用 Hutool 库来轻松实现数据脱敏,如果项目中不让使用,可以自己防着hutool来写一些工具类。

本次使用Springboot整合Hutool来自定义注解实现数据脱敏!

二、什么是数据脱敏

数据脱敏(Data Masking) ,也称为数据遮蔽或数据隐藏,是一种 数据保护技术 ,用于处理和存储敏感数据时,以减少或消除数据中的敏感信息,从而保护数据的隐私和安全。数据脱敏的主要目的是在保持数据可用性的同时,减少数据泄露和滥用的风险。

数据脱敏一般指数据库正常存储,返回前端时进行数据库处理!

三、Hutool简介

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

虽然Hutool可能会有一些bug,比起小编写的还是强上不少的,所以选定它来!

现在最新版为: 5.8.16 ,我们直接使用最新的,bug会少一些,功能会完善一些!

支持的脱敏规则:

  • 用户id
  • 中文姓名
  • 身份证号
  • 座机号
  • 手机号
  • 地址
  • 电子邮件
  • 密码
  • 中国大陆车牌,包含普通车辆、新能源车辆
  • 银行卡

四、实战整合

1. 导入依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

2. 自定义注解

@JsonSerialize(using = SensitiveInfoSerializer.class) 用于指定在序列化时应该使用哪个自定义序列化器类

需要和下面的注解搭配使用 SensitiveInfoSerializer 我们自定义的序列化器才会生效

@JacksonAnnotationsInside 主要用于标记其他自定义注解,这意味着你可以在一个 Jackson 注解内部使用其他自定义注解,以组合各种注解来实现更复杂的序列化和反序列化逻辑。

/**
 * @author wangzhenjun
 * @date 2023/9/11 14:15
 */
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveInfoSerializer.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Desensitization {
    DesensitizationType type() default DesensitizationType.DEFAULT;
    /**
     * 前置不需要打码的长度
     */
    int prefixLen() default 0;
    /**
     * 后置不需要打码的长度
     */
    int suffixLen() default 0;
    /**
     * 遮罩字符
     */
    String maskingChar() default "*";
}

3. 支持类型枚举

/**
 * @author wangzhenjun
 * @date 2023/9/11 14:43
 */
public enum DesensitizationType {
    // 自定义规则
    CUSTOMIZE_RULE,
    // 默认的
    DEFAULT,
    //用户id
    USER_ID,
    //中文名
    CHINESE_NAME,
    //身份证号
    ID_CARD,
    //座机号
    FIXED_PHONE,
    //手机号
    MOBILE_PHONE,
    //地址
    ADDRESS,
    //电子邮件
    EMAIL,
    //密码
    PASSWORD,
    //中国大陆车牌,包含普通车辆、新能源车辆
    CAR_LICENSE,
    //银行卡
    BANK_CARD
}

4. 自定义序列化器

关于自定义的规则,大家可以根据自己的需求来写工具类,我这里简单使用Hutool的工具来了!

StrUtil.replace(value, prefixLen, suffixLen, maskingChar) StrUtil.hide(value, prefixLen, suffixLen)

createContextual 方法首先在序列化过程开始时被调用,返回的序列化器实例将用于后续的序列化过程。

serialize 方法责实际的序列化逻辑,将字段的值转换为JSON,并可以在其中执行自定义的脱敏逻辑。

/**
 * 数据脱敏序列化器
 *
 * @author wangzhenjun
 * @date 2023/9/11 14:16
 */
public class SensitiveInfoSerializer extends JsonSerializer<String> implements ContextualSerializer {
    private boolean useMasking = false;
    private DesensitizationType type;
    private int prefixLen;
    private int suffixLen;
    private String maskingChar;
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (useMasking && value != null) {
            switch (type) {
                case MOBILE_PHONE:
                    gen.writeString(DesensitizedUtil.mobilePhone(value));
                    break;
                case ID_CARD:
                    gen.writeString(DesensitizedUtil.idCardNum(value, prefixLen, suffixLen));
                    break;
                case CUSTOMIZE_RULE:
//                    gen.writeString(StrUtil.replace(value, prefixLen, suffixLen, maskingChar));
                    gen.writeString(StrUtil.hide(value, prefixLen, suffixLen));
                    break;
                case CHINESE_NAME:
                    gen.writeString(DesensitizedUtil.chineseName(value));
                    break;
                case DEFAULT:
                    gen.writeString(value);
                default:
                    gen.writeString(value);
            }
        } else {
            gen.writeObject(value);
        }
    }
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
        if (property != null) {
            Desensitization desensitization = property.getAnnotation(Desensitization.class);
            if (desensitization != null) {
                this.type = desensitization.type();
                this.prefixLen = desensitization.prefixLen();
                this.suffixLen = desensitization.suffixLen();
                this.maskingChar = desensitization.maskingChar();
                useMasking = true;
            }
        }
        return this;
    }
}

5. 实体类应用

/**
 * @author wangzhenjun
 * @date 2023/9/12 9:15
 */
@Data
public class User {
    @Desensitization(type = DesensitizationType.ID_CARD,prefixLen = 6,suffixLen = 16)
    private String cardId;
    @Desensitization(type = DesensitizationType.CHINESE_NAME)
    private String name;
    @Desensitization(type = DesensitizationType.MOBILE_PHONE)
    private String phone;
    @Desensitization(type = DesensitizationType.CUSTOMIZE_RULE,prefixLen = 3,suffixLen = 6)
    private String info;
}

6. 测试

@GetMapping("/getUser")
public Result getUser(){
    User user = new User();
    user.setCardId("372911111111111111");
    user.setPhone("15822229999");
    user.setName("赵飞燕");
    user.setInfo("这是机密文件,该打码打码");
    return Result.success(user);
}

完美脱敏,此次应该有掌声!

五、总结

本文通过Spring Boot与Hutool库的结合使用自定义注解,提供了一个简单而强大的方式来实现数据脱敏。希望能帮助到你,成功地实现数据脱敏功能,并提高应用程序的安全性。

本次例子脱敏选项没有演示全,大家可以自行补充完成,成为你们需要的数据脱敏策略,从而完美的处理用户数据脱敏问题!

可以试着使用AOP来完成脱敏,有兴趣的可以试一下哈!

以上就是Springboot+Hutool自定义注解实现数据脱敏的详细内容,更多关于Springboot Hutool数据脱敏的资料请关注脚本之家其它相关文章!

相关文章

  • DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

    DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

    这篇文章主要介绍了DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息,首先自定义一个过滤器 DubboLoggerFilter.java,本文结合示例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-12-12
  • SpringCloud中使用webclient(get和post)请求微服务接口数据

    SpringCloud中使用webclient(get和post)请求微服务接口数据

    在SpringCloud项目中使用WebClient调用微服务时,涉及配置WebClient、发起get和post请求等操作,如请求头设置、服务地址配置、数据转换处理、异常处理等,避免在循环中使用WebClient请求、路径设置细节以及数据返回处理技巧,本文旨在帮助理解和应用WebClient进行微服务调用
    2024-10-10
  • 一文详解Java中的JSON数据处理指南

    一文详解Java中的JSON数据处理指南

    JSON作为一种轻量级的数据交换格式,在Web服务和应用程序之间广泛使用,本文详细介绍了在Java中解析和操作JSON数据的步骤,包括导入库、创建JSON对象和数组、读取数据、创建和序列化JSON对象,以及错误处理等,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • 说说@ModelAttribute在父类和子类中的执行顺序

    说说@ModelAttribute在父类和子类中的执行顺序

    这篇文章主要介绍了@ModelAttribute在父类和子类中的执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringMVC中日期格式的转换

    SpringMVC中日期格式的转换

    本文主要介绍了SpringMVC中日期格式转换的相关知识:用来解决日期提交转换异常的问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 配置SpringBoot方便的切换jar和war的方法示例

    配置SpringBoot方便的切换jar和war的方法示例

    这篇文章主要介绍了配置SpringBoot方便的切换jar和war的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    这篇文章主要介绍了IDEA2020 1.1中Plugins加载不出来的问题,本文还给大家提到了IDEA 2020.1.1 找不到程序包和符号的问题,感兴趣的朋友跟随小编一起看看吧
    2020-06-06
  • Java实现读取CSV文件数据内容(含逗号处理)

    Java实现读取CSV文件数据内容(含逗号处理)

    这篇文章主要为大家详细介绍了如何使用Java实现读取CSV文件数据内容,包含了逗号处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Java POI实现将导入Excel文件的示例代码

    Java POI实现将导入Excel文件的示例代码

    这篇文章主要介绍了Java POI实现将导入Excel文件的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Mybatis-plus的service通用接口解读

    Mybatis-plus的service通用接口解读

    这篇文章主要介绍了Mybatis-plus的service通用接口解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论