SpringBoot 自定义注解实现涉密字段脱敏

yizhihongxing

下面是关于“SpringBoot 自定义注解实现涉密字段脱敏”的完整攻略。

目录

  • 需求分析
  • 脱敏实现思路
  • 注解类编写
  • 注解使用及脱敏处理
  • 测试示例1
  • 测试示例2

需求分析

现实生活中,很多敏感信息,如用户的身份信息、密码等,为了保障用户数据的安全,需要进行脱敏处理。本文将实现一个自定义的注解,用于对敏感信息进行脱敏处理。

脱敏实现思路

脱敏处理的方法有很多,本文将采用常见的替换处理方法。对于一个字符串,脱敏处理可以分为以下几个步骤:

  1. 对字符串进行判空处理,如果为空则直接返回空字符串
  2. 根据需求,选择需要脱敏的方式,如全脱敏、部分脱敏等
  3. 对脱敏区域进行替换处理,替换的字符可以选择“*”、“x”等
  4. 返回脱敏后的字符串

注解类编写

我们需要编写一个注解类,用于标记需要进行脱敏处理的字段。在该注解类上还需要指定脱敏规则,如全脱敏、部分脱敏等。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SensitiveInfo {

    /**
     * 脱敏规则
     *
     * @return 脱敏规则
     */
    SensitiveType type() default SensitiveType.ALL;

    /**
     * 脱敏字符
     *
     * @return 脱敏字符
     */
    String mask() default "*";

    /**
     * 前缀保留位数
     *
     * @return 前缀保留位数
     */
    int prefixNoMaskLen() default 0;

    /**
     * 后缀保留位数
     *
     * @return 后缀保留位数
     */
    int suffixNoMaskLen() default 0;
}

在该注解类中,我们定义了脱敏规则、脱敏字符、前缀保留位数、后缀保留位数等属性,并在注解类上使用了@Retention和@Target标识。

SensitiveType为脱敏规则枚举类,该类中包含了常见的脱敏规则,如全脱敏、部分脱敏等。

```java
public enum SensitiveType {

/**
 * 全部脱敏
 */
ALL,

/**
 * 邮件地址脱敏
 */
EMAIL,

/**
 * 手机号码脱敏
 */
MOBILE,

/**
 * 身份证号码脱敏
 */
ID_CARD_NO,

/**
 * 银行卡号脱敏
 */
BANK_CARD_NO,

/**
 * 自定义脱敏
 */
CUSTOM;

}
```

SensitiveType枚举类中,定义了几种常见的脱敏规则。

注解使用及脱敏处理

下面,我们来看一下如何使用该注解类:

public class UserEntity {

    @SensitiveInfo(type = SensitiveType.MOBILE)
    private String mobile;

    @SensitiveInfo(type = SensitiveType.CUSTOM, mask = "#", prefixNoMaskLen = 3, suffixNoMaskLen = 4)
    private String custom;

    // 省略其他字段及getter/setter方法

}

我们在UserEntity类中使用了该注解类,对两个字段进行了脱敏处理。其中,mobile字段需要进行手机号脱敏处理,custom字段需要进行自定义脱敏处理,脱敏规则为“#”,保留前3位和后4位。

在脱敏处理时,我们可以根据注解中的脱敏规则和脱敏字符,完成相应的脱敏处理。具体代码实现可以参考以下示例:

public class SensitiveInfoUtils {

    /**
     * 获取脱敏后的字符串
     *
     * @param value 字符串
     * @param type  脱敏规则
     * @param mask  脱敏字符
     * @param prefixNoMaskLen    前缀保留位数
     * @param suffixNoMaskLen    后缀保留位数
     * @return 脱敏后的字符串
     */
    public static String getSensitiveInfo(String value, SensitiveType type, String mask, int prefixNoMaskLen, int suffixNoMaskLen) {
        if (StringUtils.isBlank(value)) {
            return "";
        }
        switch (type) {
            case ALL:
                return mask;
            case EMAIL:
                return value.replaceAll("(\\w+)\\w{2}@(\\w+)", "$1***@$2");
            case MOBILE:
                return value.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
            case ID_CARD_NO:
                return value.replaceAll("(\\d{4})\\d{10}(\\w{4})","$1**** **** ****$2");
            case BANK_CARD_NO:
                return value.replaceAll("(\\d{4})\\d{8,12}(\\d{4})","$1 **** **** $2");
            case CUSTOM:{
                if(value.length()<=prefixNoMaskLen+suffixNoMaskLen){
                    return value;
                }
                int maskLen=value.length()-prefixNoMaskLen-suffixNoMaskLen;
                String maskStr="";
                for(int i=0;i<maskLen;i++){
                    maskStr+=mask;
                }
                return value.substring(0,prefixNoMaskLen)+maskStr+value.substring(value.length()-suffixNoMaskLen);
            }
            default:
                return value;
        }
    }
}

SensitiveInfoUtils工具类中,我们编写了一个方法,该方法用于获取脱敏后的字符串。

在该方法中,我们首先对字符串进行了判空处理,然后根据注解中的脱敏规则,选择相应的处理方法进行脱敏(如手机号脱敏、银行卡号脱敏等),最后将处理后的脱敏字符串返回。

测试示例1

在这个示例中,我们将对一个UserEntity对象进行脱敏处理。

public class Test1 {

    public static void main(String[] args) {

        UserEntity userEntity = new UserEntity();

        userEntity.setMobile("13812345678");
        userEntity.setCustom("abcdefghijklmnopqrstuvwzyz");

        System.out.println(userEntity.getMobile());  //输出结果:138****5678
        System.out.println(userEntity.getCustom());  //输出结果:abc#######wzyz
    }
}

在这个示例中,我们对userEntity对象的mobile字段进行了手机号脱敏,结果输出为“138****5678”;对userEntity对象的custom字段进行了自定义脱敏,结果输出为“abc#######wzyz”。

测试示例2

在这个示例中,我们将对一个List对象进行脱敏处理。

public class Test2 {

    public static void main(String[] args) {

        List<UserEntity> userList = new ArrayList<>();
        UserEntity userEntity1 = new UserEntity();
        userEntity1.setMobile("13812345678");
        userEntity1.setCustom("abcdefghijklmnopqrstuvwzyz");
        userList.add(userEntity1);

        UserEntity userEntity2 = new UserEntity();
        userEntity2.setMobile("13987654321");
        userEntity2.setCustom("1234567890");
        userList.add(userEntity2);

        for (UserEntity userEntity : userList) {
            userEntity.setMobile(SensitiveInfoUtils.getSensitiveInfo(userEntity.getMobile(), userEntity.getSensitiveInfo().type(), userEntity.getSensitiveInfo().mask(), userEntity.getSensitiveInfo().prefixNoMaskLen(), userEntity.getSensitiveInfo().suffixNoMaskLen()));
            userEntity.setCustom(SensitiveInfoUtils.getSensitiveInfo(userEntity.getCustom(), userEntity.getSensitiveInfo().type(), userEntity.getSensitiveInfo().mask(), userEntity.getSensitiveInfo().prefixNoMaskLen(), userEntity.getSensitiveInfo().suffixNoMaskLen()));
        }

        for (UserEntity userEntity : userList) {
            System.out.println(userEntity.getMobile());
            System.out.println(userEntity.getCustom());
        }
    }
}

在这个示例中,我们对userList集合中的两个UserEntity对象进行了脱敏处理。在脱敏处理时,我们使用了SensitiveInfoUtils工具类中的方法进行处理。

最终,我们将处理后的结果输出到控制台上。输出结果为:

138****5678
abc#######wzyz
139****4321
123######890

总结

在本文中,我们实现了一个自定义注解,用于对敏感信息进行脱敏处理,并提供了两个使用示例。这样,在我们需要对敏感信息进行脱敏处理时,只需要使用该注解,即可完成脱敏处理的工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 自定义注解实现涉密字段脱敏 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 微信小程序授权登陆及每次检查是否授权实例代码

    下面我将详细讲解微信小程序授权登陆及每次检查是否授权的方法以及提供两条示例说明。 微信小程序授权登陆的方法 在小程序中调用 wx.getSetting 方法获取用户的授权状态。 wx.getSetting({ success: function(res) { if (res.authSetting[‘scope.userInfo’]) { // 用户已授权,…

    Java 2023年5月23日
    00
  • 如何实现线程安全的缓存?

    以下是关于线程安全的缓存的完整使用攻略: 什么是线程安全的缓存? 线程安全的缓存是指在多线程环下,多个线程可以同时访问缓存的数据而不会出不一致或程序崩溃等问题。在多线程编程中,程安全的缓存是非常重要的,因为多个线程访问缓存,会出现线程争用的问题,导致数据不一致或程序崩溃。 如何实现线程安全的缓存? 为了实现线程安全缓存,需要使用同步制来保证多个线程对缓存的访…

    Java 2023年5月12日
    00
  • 一文带你了解Java中的Object类及类中方法

    一文带你了解Java中的Object类及类中方法 什么是Object类? 在Java中,所有的类都继承自Object类,Object类是Java中所有类的祖先类,其定义了所有类都有的基本方法。 Object类中的常用方法 equals()方法 equals()方法用于判断两个对象是否相等。如果两个对象的内容相同,equals方法返回true,否则返回fals…

    Java 2023年5月26日
    00
  • 关于JWT与cookie和token的区别说明

    关于“关于JWT与cookie和token的区别说明”的完整攻略,我将分几个方面进行讲解。 什么是JWT、cookie和token? JWT JWT是一种基于JSON的开放标准(RFC 7519),用于在网络上传输安全可靠的声明,主要用于身份认证和授权。它实际上就是一个字符串,在前端和后端之间传递,其中包含了一些信息,比如用户的ID和角色等,并通过数字签名的…

    Java 2023年5月26日
    00
  • 一文掌握IDEA中的Maven集成与创建

    下面我将详细讲解“一文掌握IDEA中的Maven集成与创建”的完整攻略。 IDEA中Maven集成 第一步:安装Maven 打开IDEA,选择Preferences,然后在搜索框中输入Maven,找到Maven设置选项,查看当前是否已经安装了Maven,如果没有,请点击“+”来安装Maven。 第二步:创建Maven项目 在IDEA中选择“新建项目” -&g…

    Java 2023年5月20日
    00
  • Java利用Phantomjs实现生成图片的功能

    如何利用Java和PhantomJS实现生成图片的功能? PhantomJS是一个基于Webkit的无界面浏览器。它可以执行JavaScript脚本,模拟浏览器行为,并生成网页截图、PDF文件以及SVG等我们所需要的格式。 下面是Java利用Phantomjs实现生成图片的详细攻略。 下载Phantomjs 下载最新版的PhantomJS。在终端中输入以下命…

    Java 2023年6月16日
    00
  • SpringBoot Validation提示信息国际化配置方式

    以下是“SpringBoot Validation提示信息国际化配置方式”的完整攻略。 1. 添加依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • MVC异常处理详解

    下面是关于“MVC异常处理详解”的完整攻略,包含两个示例说明。 MVC异常处理详解 在MVC(Model-View-Controller)架构中,异常处理是一个非常重要的问题。在应用程序中,可能会发生各种各样的异常,如空指针异常、数据库异常、网络异常等等。如果不进行适当的异常处理,这些异常可能会导致应用程序崩溃或者无法正常工作。本文将详细介绍如何在MVC架构…

    Java 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部