Spring Boot 数据脱敏实现

SpringBoot接口返回数据脱敏(Mybatis、Jackson) J数据脱敏有以下几种做法: 1、通过自定义Jackson注解,实现在属性序列化过程中处理数据 2、通过Mybatis查询数据时处理 3、其他方式 Jackson是Spring默认的序列化框架,以下将通过自定义Jackson注解,实现在序列化过程中对属性值进行处理。 对于数据库数据的加密解密将采用Mybatis的TypeHandler处理,在我们为数据库提供数据后,会根据我们的需求,对部分数据进行加密。在读取后数据最终到我们手上前,会对读取到数据进行解密。 阅读详情

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

一、数据脱敏的必要性

  • 保护隐私:防止敏感信息(如身份证号、手机号等)被泄露。
  • 合规要求:遵循数据保护法规(如 GDPR、CCPA 等)。
  • 增强安全性:降低数据被滥用的风险。

二、常用的数据脱敏策略

  1. 替换脱敏:用特定字符替换敏感信息的一部分,如用 * 替换手机号中间部分。
  2. 哈希脱敏:使用哈希算法对敏感信息进行处理,无法恢复原值。
  3. 模糊化:对数据进行模糊处理,使其不易识别,但保留一定的可用性。
  4. 加密脱敏:对敏感信息进行加密存储,只在授权情况下解密。

三、实现步骤

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 项目中实现了数据脱敏功能。使用自定义注解和处理器并结合策略模式,可以灵活地对敏感信息进行脱敏处理。

Spring Boot实现数据加密脱敏:注解 + 反射 + AOP 通过结合注解、反射和AOP,我们成功实现了Spring Boot项目中对敏感数据的加密和脱敏。这一方案不仅提高了数据的安全性,也保障了业务开发的灵活性。在实际项目中,应该根据具体需求选择合适的加密算法,并考虑动态配置的方式,以便更好地适应业务变化。希望本文对你在Spring Boot项目中实现数据加密和脱敏提供了一些有用的思路。😊🙏Java面试技巧Java面试八股文 - 掌握面试必备知识(目录篇)Java学习路线2023年完整版Java学习路线图AIGC人工智能。 阅读详情

相关推荐

springboot实现数据脱敏

springboot整合secure

weixin_73375551的博客 528

【SpringBoot】三种常见的数据脱敏方案

大家可以根据自己的想法添加其它的脱敏规则(我只想脱敏一部分数据,并指明从哪开始,从哪结束)。要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多。定义数据脱敏注解和数据脱敏逻辑的接口, 在返回类上,对需要进行脱敏的属性加上,并指定对应的脱敏策略操作。4、自定义 AnnotationIntrospector,适配我们自定义注解返回相应的Serializer。由于 Java 8 中新增了许多函数式接口,所以,这里就不需要我们自定义接口了,可以直接使用函数式接口。方案三、自定义注解实现。.

sco5282的博客 1万+

Spring Boot + Sharding-JDBC实现读写分离和数据脱敏

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

weixin_40553490的博客 6041

springboot项目中实现数据脱敏

创建自定义脱敏枚举类:这里定义一个敏感字段的枚举,并设定各个字段的脱敏策略。/*** 用户名* 身份证* 手机号* 地址} }创建序列化类:SensitiveSerializer:} }定义SensitiveData注解定义返回结果实体类创建包含敏感数据字段的实体类,并在需要脱敏的字段上添加 @SensitiveData 注解。创建Conrtoller测试返回结果u . setUsername("张老三");

weixin_44727769的博客 3073

Spring Boot 中使用 JsonSerializer 和 AOP 实现可控数据脱敏

数据脱敏是指在不影响业务逻辑的情况下,对外部展示或传输的数据进行处理,使其不包含敏感信息的过程。通过上面的步骤,你已经学会了如何在 Spring Boot 中使用 JSON 序列化和 AOP 来实现可控的数据脱敏。无论是法律法规的要求,还是企业自身对用户隐私的尊重,数据脱敏都是必不可少的。通过对敏感数据进行适当的处理,可以在保证数据可用性的同时,减少泄露风险。此外,如果需要更复杂的脱敏逻辑,可以考虑使用更专业的数据脱敏工具或库。亲爱的读者们,在实现数据脱敏时,你遇到过哪些挑战?

java专栏 1294

【Java】Spring Boot和MyBatis框架实现返回数据的脱敏处理

在 Spring Boot 和 MyBatis 中实现返回数据的脱敏处理是一种常见的需求,特别是在处理敏感数据时。数据脱敏是一种对数据进行部分隐藏或修改以保护隐私的方法。本文将详细介绍如何在 Spring Boot 和 MyBatis 中实现数据脱敏,并使用 Hutool 工具库来简化脱敏处理,并提供示例代码。

wjianwei666的专栏 437

spring boot实现接口数据脱敏,整合jackson实现敏感信息隐藏脱敏

jackson、接口数据脱敏

zhangfuping123456789的博客 1068

Spring Boot(六十一):实现接口返回数据脱敏实现

当返回对象比较复杂,需要递归去反射,性能一下子就会降低,于是换种思路,我想到平时使用的 @JsonFormat,跟我现在的场景很类似,通过自定义注解跟字段解析器,对字段进行自定义解析,tql。(1)要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多,很显然违背了“多写一行算我输”的程序员规范。思来想去,定义数据脱敏注解和数据脱敏逻辑的接口, 在返回类上,对需要进行脱敏的属性加上,并指定对应的脱敏策略操作。3.4 覆盖ObjectMapper。3.6 编写测试接口。

u013938578的博客 744

使用Spring Boot实现数据脱敏

使用Spring Boot实现数据脱敏大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代信息系统中,数据安全和隐私保护变得越来越重要。数据脱敏是一种有效保护敏感信息的技术,通过对数据进行遮掩或变形,使其在不影响使用的前提下失去敏感性。本文将介绍如何在Spring Boot项目中实现数据脱敏...

weixin_41302930的博客 252

Spring Boot中实现数据脱敏的自定义注解实战指南

Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它使用“约定优于配置”的原则,提供了一系列大型项目中常见的默认配置,帮助开发者快速启动和运行Spring应用程序。注解(Annotation)是Java提供的一种对元数据(metadata)的定义方式。在Java 5.0 版本之后,引入了注解的概念,它是一种能够被编译器识别的特殊标记。通过这些标记,我们可以提供代码的额外信息,从而用于编译器或者其他工具的处理。

weixin_35995661的博客 1096

Sciter教程_00_创建HelloWorld工程

本教程记录Sciter工程的创建和编译运行的过程。

qq_36707072的博客 2277

Spring Boot如何实现数据脱敏?

数据脱敏是一种数据安全技术,用于保护敏感数据,以防止未经授权的访问和使用。数据脱敏通过对敏感数据进行一定程度的修改或替换,以隐藏敏感信息,同时保留数据的完整性和可用性,通常应用于测试、开发和演示环境中。desensitization是基于Java反射邮箱手机号码中文名称身份证号码银行卡号码密码统一社会信用代码任意CharSequence类型的值级联脱敏。

HBLOG 708

详解ReID的各部分组成及Trick——基于FastReID

这一系列博客将基于京东开源的FastReID进行扩充,详细介绍了ReID的各个组成部分,一些有用的Trick,评价指标,常用数据集等,详细内容见下方的链接,总结不易,如有理解不正确之处,麻烦各位批评指正。 一、FastReID的中的baseline文件配置 二、Training strategy 三、Pre-processing 四、Backbone 五、Aggregation 六、Head 七、Loss 八、Distance Metric 九、Post-processing 十、Evaluation 十一

藏晖的博客 9165

spring boot实现数据脱敏+注解参数校验

数据脱+参数校验

m0_74347016的博客 610

基于PUMA实现DOA估计-附Matlab代码

具体而言,PUMA算法将接收的信号分别在时域和频域上进行处理,并结合平稳合成(SS)和平稳子空间(SSP)方法,以提高估计精度。该算法将传统的基于协方差矩阵的最大似然(ML)和最小二乘(LS)方法扩展到了非均匀线性阵列(ULA)上,并通过对信号分离和DOA估计的优化,达到了高精度和高分辨率的效果。方位角(DOA)估计是信号处理中的一个重要问题,它的目的是确定从多个传感器接收到的信号的方向。本文将介绍如何使用基于PUMA的方位角估计算法来实现DOA估计,并附有相应的Matlab代码实现。

Byte_O_O的博客 496

华为OD机试真题:明日之星选举 (Java/Py/C/ C++/JS/GO)

华为OD机试(机考)双机位C卷 【明日之星选举】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 明日之星选举。

qq_45776114的博客 919

Spring Boot + Jackson 实现优雅的接口数据脱敏方案

Spring Boot + Jackson 实现优雅的接口数据脱敏方案

s20050830的博客 383

Qwen2-VL出现RuntimeError: CUDA error: too many resources requested for launch CUDA kernel errors的解决方案

本文主要介绍了Qwen2-VL出现RuntimeError: CUDA error: too many resources requested for launch CUDA kernel errors的解决方案,希望能对使用Qwen2-VL的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+
上一篇: SpringBoot实战:七种统计方法耗时的实现方式
下一篇: MySQL调优到底有多难,为什么大厂面试官总是偏爱这个问题
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值