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

下面是关于“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日

相关文章

  • JSP一句话木马代码

    首先,需要注意的是,编写和传播木马代码是违法的,本文仅用于学习和研究用途。 JSP一句话木马是一种常见的web后门,可以通过在服务器上运行的JSP文件中注入一段恶意代码的方式,让攻击者可以远程控制服务器,获取敏感信息等。以下是攻击过程的详细说明: 扫描漏洞:攻击者扫描要攻击的目标服务器,尤其是针对常见的web应用程序,如JavaWeb开发中常用的Tomcat…

    Java 2023年6月15日
    00
  • 深入分析java与C#底层控制能力区别及示例详解

    深入分析Java与C#底层控制能力区别及示例详解 介绍 Java与C#作为两种常用的面向对象编程语言,在诸多方面都有其自身的优势和特点。本文将主要探讨Java与C#的底层控制能力的差异。通过具体的示例,展示Java和C#在底层内存控制、指针使用等方面的异同点。 Java与C#的底层控制能力对比 内存管理 Java和C#都是通过垃圾回收机制进行生命周期的管理的…

    Java 2023年5月27日
    00
  • spark通过kafka-appender指定日志输出到kafka引发的死锁问题

    问题描述: 在使用Spark通过Kafka Appender框架将日志输出到Kafka时,会出现死锁问题。 死锁问题是由于Spark任务读取Kafka Appender写入的Kafka主题时,发生了写锁争用导致的。 解决方案: 通过分离处理流程解决死锁 遇到死锁问题的常见解决方案是将日志输出到不同的Kafka主题。在Spark Streaming任务中,将日…

    Java 2023年6月2日
    00
  • 使用springboot打包成zip部署,并实现优雅停机

    使用springboot打包成zip部署可以方便地将应用程序部署到任何环境中。配合优雅停机功能可以在应用程序需要停止运行时,平滑地关闭运行中的所有任务,确保应用程序不会因为意外关机而出现问题。下面是实现这一目标的完整攻略。 准备工作 在开始之前,需要先准备好以下环境和工具:- JDK 1.8 或以上版本- Maven 3.3 或以上版本- SpringBoo…

    Java 2023年5月20日
    00
  • Spring Boot中slf4j日志依赖关系示例详解

    好的!首先,我们来看一下如何在Spring Boot中使用slf4j日志依赖关系。 1. 什么是SLF4J? SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它允许应用程序在运行时使用任何日志框架,并且可以在不修改应用程序代码的情况下更改底层的日志框架。 2. 添加slf4j的依赖关系 要在Sprin…

    Java 2023年5月31日
    00
  • weblogic的集群与配置图文方法

    关于“weblogic的集群与配置图文方法”的攻略,我可以提供以下内容: 1、什么是Weblogic集群 Weblogic集群是指多个Weblogic服务器通过特定的配置方式进行的一种有序的组合,使之能够共同处理同一应用的请求。通过集群方式,可以将业务和请求合理分配到不同的服务器上,从而实现高性能、高可用的应用架构。 在Weblogic集群中,有一个Mast…

    Java 2023年5月20日
    00
  • Hibernate分页的两种实现方法

    Hibernate是目前最为流行的ORM框架之一,提供了非常便捷的持久化操作,而在实际应用中,我们经常需要对数据进行分页,以免一次性将所有数据全部加载到内存中,影响系统性能。那么Hibernate分页的实现方法有哪些呢?接下来我将详细阐述两种实现方法,其中一种是使用Criteria API的方式,另一种是使用SQL语句的方式。 使用Criteria API实…

    Java 2023年5月20日
    00
  • 常见的Java调试器有哪些?

    Java调试器是一种用于调试Java应用程序和Java虚拟机(JVM)的工具,它可以帮助开发人员在开发Java应用程序时快速定位和解决程序中的错误。常见的Java调试器有以下几种: Eclipse调试器 IntelliJ IDEA调试器 NetBeans调试器 JDB调试器 以下是常见的Java调试器的详细使用攻略: 1. Eclipse调试器使用攻略 Ec…

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