SpringBoot中实现数据脱敏处理的方法详解

 更新时间:2025年03月31日 09:07:30   作者:风象南  
项目开发中,在处理敏感信息时,数据脱敏是一项重要的安全措施,本文主要为大家介绍了如何在SpringBoot项目中进行数据脱敏处理,有需要的可以了解下

项目开发中,在处理敏感信息时,数据脱敏是一项重要的安全措施。数据脱敏可以防止敏感信息在非授权情况下被泄露,同时在数据共享和分析时保护用户隐私。

一、数据脱敏的必要性

保护隐私:防止敏感信息(如身份证号、手机号等)被泄露。

合规要求:遵循数据保护法规(如 GDPR、CCPA 等)。

增强安全性:降低数据被滥用的风险。

二、常用的数据脱敏策略

替换脱敏:用特定字符替换敏感信息的一部分,如用 * 替换手机号中间部分。

哈希脱敏:使用哈希算法对敏感信息进行处理,无法恢复原值。

模糊化:对数据进行模糊处理,使其不易识别,但保留一定的可用性。

加密脱敏:对敏感信息进行加密存储,只在授权情况下解密。

三、实现步骤

3.1 创建脱敏注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Sensitive {
    String type(); // 脱敏类型
    String pattern() default ""; // 可选的模式参数
}

3.2 策略接口设计

首先,定义一个脱敏策略接口,所有的脱敏策略都将实现这个接口:

public interface MaskingStrategy {
    String mask(String value, String pattern);
}

3.3 具体脱敏策略实现

接下来,为每种脱敏类型创建具体的实现类:

public class PhoneMaskingStrategy implements MaskingStrategy {
    @Override
    public String mask(String value, String pattern) {
        return value.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2");
    }
}

public class IdCardMaskingStrategy implements MaskingStrategy {
    @Override
    public String mask(String value, String pattern) {
        return value.replaceAll("(\d{6})\d{8}(\d{4})", "$1****$2");
    }
}

public class CustomMaskingStrategy implements MaskingStrategy {
    @Override
    public String mask(String value, String pattern) {
        return value.replaceAll(pattern, "****");
    }
}

3.4 策略工厂

创建一个策略工厂,根据脱敏类型返回相应的策略实例:

import java.util.HashMap;
import java.util.Map;

public class MaskingStrategyFactory {
    private static final Map<String, MaskingStrategy> strategies = new HashMap<>();

    static {
        strategies.put("phone", new PhoneMaskingStrategy());
        strategies.put("idCard", new IdCardMaskingStrategy());
        strategies.put("custom", new CustomMaskingStrategy());
    }

    public static MaskingStrategy getStrategy(String type) {
        return strategies.getOrDefault(type, (value, pattern) -> value.replaceAll(".", "*")); // 默认脱敏
    }
}

3.5 通用脱敏处理器

import org.springframework.stereotype.Component;
import java.lang.reflect.Field;

@Component
public class GeneralDataMaskingProcessor {

    public void maskSensitiveData(Object obj) throws IllegalAccessException {
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            if (field.isAnnotationPresent(Sensitive.class)) {
                field.setAccessible(true);
                Object value = field.get(obj);
                if (value != null) {
                    String maskedValue = maskValue(value.toString(), field.getAnnotation(Sensitive.class));
                    field.set(obj, maskedValue);
                }
            }
        }
    }

    private String maskValue(String value, Sensitive sensitive) {
        String type = sensitive.type();
        String pattern = sensitive.pattern();
        
        MaskingStrategy strategy = MaskingStrategyFactory.getStrategy(type);
        return strategy.mask(value, pattern);
    }
}

3.6 使用示例

1. 创建用户实体类

public class User {

    private Long id;

    @Sensitive(type = "phone")
    private String phoneNumber;

    @Sensitive(type = "idCard")
    private String idCard;

    @Sensitive(type = "custom", pattern = "\d{3}-\d{4}") // 自定义模式
    private String customField;

    private String name;

    // Getters and Setters
}

2. 在服务层调用脱敏处理器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private GeneralDataMaskingProcessor dataMaskingProcessor;

    public User getUser(Long id) {
        User user = findUserById(id); // 假设这是从数据库获取用户信息
        try {
            dataMaskingProcessor.maskSensitiveData(user);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return user;
    }

    private User findUserById(Long id) {
        // 模拟从数据库获取用户
        return new User(id, "13812345678", "123456789012345678", "123-4567", "John Doe");
    }
}

3. 测试脱敏功能

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testGetUser() {
        User user = userService.getUser(1L);
        assertThat(user.getPhoneNumber()).isEqualTo("138****5678");
        assertThat(user.getIdCard()).isEqualTo("123456****5678");
        assertThat(user.getCustomField()).isEqualTo("123-****"); // 自定义脱敏
    }
}

四、总结

通过以上步骤,在Spring Boot 项目中实现了数据脱敏功能。使用自定义注解和处理器并结合策略模式,可以灵活地对敏感信息进行脱敏处理。

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

相关文章

  • java递归实现复制一个文件夹下所有文件功能

    java递归实现复制一个文件夹下所有文件功能

    这篇文章主要介绍了java递归实现复制一个文件夹下所有文件功能n次,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Redisson分布式闭锁RCountDownLatch的使用详细讲解

    Redisson分布式闭锁RCountDownLatch的使用详细讲解

    分布式锁和我们java基础中学习到的synchronized略有不同,synchronized中我们的锁是个对象,当前系统部署在不同的服务实例上,单纯使用synchronized或者lock已经无法满足对库存一致性的判断。本次主要讲解基于rediss实现的分布式锁
    2023-02-02
  • Java ArrayList与Vector和LinkedList的使用及源码分析

    Java ArrayList与Vector和LinkedList的使用及源码分析

    ArrayList、Vector、LinkedList类均在java.util包中,均为可伸缩数组,即可以动态改变长度的数组。ArrayList 和 Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的内存来存储
    2022-11-11
  • 浅析如何使用xstream实现javaBean与xml互转

    浅析如何使用xstream实现javaBean与xml互转

    XStream 是一个用于将 Java 对象与 XML 之间进行转换的库,它非常简单易用,下面将详细介绍如何使用 XStream 实现 JavaBean 与 XML 之间的互转,需要的可以了解下
    2025-05-05
  • java 实现切割文件和合并文件的功能

    java 实现切割文件和合并文件的功能

    这篇文章主要介绍了java 实现切割文件和合并文件的功能的相关资料,这里实现文件的切割的实现代码和文件合并的实现代码,需要的朋友可以参考下
    2017-07-07
  • 使用Spring Framework 时常犯的十大错误(小结)

    使用Spring Framework 时常犯的十大错误(小结)

    这篇文章主要介绍了使用Spring Framework 时常犯的十大错误(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • MyBatis通过JDBC数据驱动生成的执行语句问题

    MyBatis通过JDBC数据驱动生成的执行语句问题

    这篇文章主要介绍了MyBatis通过JDBC数据驱动生成的执行语句问题的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • java CompletableFuture异步任务编排示例详解

    java CompletableFuture异步任务编排示例详解

    这篇文章主要为大家介绍了java CompletableFuture异步任务编排示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • java求余的技巧汇总

    java求余的技巧汇总

    这篇文章主要给大家介绍了关于java求余技巧的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Mybatis千万级数据查询的解决方式,避免OOM问题

    Mybatis千万级数据查询的解决方式,避免OOM问题

    这篇文章主要介绍了Mybatis千万级数据查询的解决方式,避免OOM问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论