Java自定义注解实现数据脱敏

 更新时间:2023年07月21日 11:38:05   作者:Xiao5xiao122  
在实际开发中经常会遇到有一些信息不能全部展示用户,需要隐藏(可以叫脱敏),所以本文为大家分享了利用自定义注解实现数据脱敏的示例代码,需要的可以参考下

自定义注解实现数据脱敏,,国密加解密(sm4)

在实际开发中经常会遇到有一些信息不能全部展示用户,需要隐藏(可以叫脱敏)一部分的情况比如地址,电话,手机号,身份证等。脱敏的做法目前我知道的方法有:

1):业务代码脱敏:顾名思义就是拿到数据需要脱敏的那个字段进过一系列的脱敏规则替换成自己想要的格式。

2):自定义注解+aop切面的方式去完成字段脱敏的目的。

3):自定义注解+序列化的方式对数据进行脱敏。

其中效率最慢的当属于代码业务代码方式,最优的方式当属于自定义注解的方式,减少代码量,提高工作效率,需要脱敏的字段仅需要加一个注解就可以达到目的。

今天就记录下第三种方式,自定义注解+序列化的方式。

首先先定义一个需要脱敏的策略

/**
 * @description: 脱敏策略
 * @author: 
 * @date: 2023/6/18 19:45
 * @Version: 1.0
 */
public enum DesensitizationEnum {
    /**
     * 名称脱敏
     */
    USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2"))
    ,
    /**
     * 手机号脱敏
     */
    MOBILE_PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"))
    ,
    /**
     *地址脱敏
     */
    ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"))
    ;
    /**
     * 成员变量  是一个接口类型
     */
    private Function<String, String> function;
    DesensitizationEnum(Function<String, String> function) {
        this.function = function;
    }
    public Function<String, String> function() {
        return this.function;
    }
}

然后自定义一个注解

import com.chaozhou.test01.dingShiRenWu.Annontion.Aspect.DesensitizationEnum;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @description:
 * @author:
 * @date: 2023/6/18 17:23
 * @Version: 1.0
 */
@Target({ElementType.FIELD}) //表明作用在字段上
@Retention(RetentionPolicy.RUNTIME) //什么情况下生效
@JacksonAnnotationsInside //标明序列化
@JsonSerialize(using = DesensitizationDataSerialize.class)
public @interface DesensitizationData {
    DesensitizationEnum function();
}

然后自定义一个序列化器

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import lombok.NoArgsConstructor;
import java.io.IOException;
import java.util.Objects;
/**
 * @description: 数据脱敏序列化器
 * @author: 
 * @date: 2023/6/18 19:17
 * @Version: 1.0
 */
@NoArgsConstructor
public class DesensitizationDataSerialize extends JsonSerializer<String> implements ContextualSerializer {
    private DesensitizationEnum fuincation;
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        DesensitizationData annotation = beanProperty.getAnnotation(DesensitizationData.class);
        if(Objects.nonNull(annotation) && Objects.equals(beanProperty.getType().getRawClass(),String.class)){
            this.fuincation = annotation.function();
            return this;
        }
        return serializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
    }
    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(fuincation.function().apply(s));
    }
}

这样一个自定义脱敏注解就完成了。

使用方法:

只需要在返回参数需要脱敏的字段上加上响应注解就可以了

public class User implements Serializable {
    @TableId("id")
    private Integer id;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @ApiModelProperty(value = "出生年月")
    private Date birthday;
    @ApiModelProperty(value = "性别")
    private String gender;
    @ApiModelProperty(value = "姓名")
    private String username;
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "状态")
    private String station;
    @ApiModelProperty(value = "联系电话")
    //手机号脱敏
    @DesensitizationData(function = DesensitizationEnum.MOBILE_PHONE)
    private String telephone;
}

结果

手机号已经脱敏成功,该方法单条,多条数据都支持。

国密加解密

需要用到的依赖,可以直接用hutool整合的框架实现

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.16</version>
        </dependency>
        <!--以下依赖不加亲测也可以实现-->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.60</version>
        </dependency>

在以上方法中的策略中加入加解密规则

然后在需要加密或解密的字段中加入该注解,并注解标注正确的策略方式

修改一下上面的序列化器,防止需要需要解密的字段值我空的时候报“Null input buffer”的错

列表字段加密前

列表加密后

工具准备的好,代码效率高了不少。

到此这篇关于Java自定义注解实现数据脱敏的文章就介绍到这了,更多相关Java数据脱敏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中对象与C++中对象的放置安排的对比

    Java中对象与C++中对象的放置安排的对比

    这篇文章主要介绍了Java中对象与C++中对象的放置安排的对比的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Swagger3.0 整合spring boot2.7x避免swagger2.0与boot2.7冲突问题

    Swagger3.0 整合spring boot2.7x避免swagger2.0与boot2.7冲突

    这篇文章主要介绍了Swagger3.0 整合spring boot2.7x避免swagger2.0与boot2.7冲突问题,通过注释掉2.0引入的俩包,直接引入3.0,文中结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • Java基于分治算法实现的线性时间选择操作示例

    Java基于分治算法实现的线性时间选择操作示例

    这篇文章主要介绍了Java基于分治算法实现的线性时间选择操作,涉及java排序、比较、计算等相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Spring 父类变量注入失败的解决

    Spring 父类变量注入失败的解决

    这篇文章主要介绍了Spring 父类变量注入失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 浅谈foreach写失效的问题

    浅谈foreach写失效的问题

    下面小编就为大家带来一篇浅谈foreach写失效的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详解IDEA中SpringBoot整合Servlet三大组件的过程

    详解IDEA中SpringBoot整合Servlet三大组件的过程

    这篇文章主要介绍了详解IDEA中SpringBoot整合Servlet三大组件的过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java7钻石语法知识点总结

    java7钻石语法知识点总结

    在本篇文章里小编给大家整理的是关于java7钻石语法的相关知识点内容,有需要的朋友们参考下。
    2019-11-11
  • Java8 Stream 流常用方法合集

    Java8 Stream 流常用方法合集

    这篇文章主要介绍了 Java8 Stream 流常用方法合集,Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作,下文相关资料,需要的朋友可以参考一下
    2022-04-04
  • 用Java轻松读取Word文档内容的常用方法

    用Java轻松读取Word文档内容的常用方法

    这篇文章主要介绍了用Java轻松读取Word文档内容的常用方法,对于doc格式使用Apache POI库中的HWPFDocument和WordExtractor类,对于docx格式使用XWPFDocument类,并通过遍历段落和文本运行对象来提取文本内容,需要的朋友可以参考下
    2025-03-03
  • java数据结构与算法之桶排序实现方法详解

    java数据结构与算法之桶排序实现方法详解

    这篇文章主要介绍了java数据结构与算法之桶排序实现方法,结合具体实例形式详细分析了桶排序的概念、原理、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-05-05

最新评论