行业资讯 2025年08月6日
0 收藏 0 点赞 953 浏览 3281 个字
摘要 :

文章目录 方案1:SQL 数据脱敏实现 方案2:使用Jackson库中的JsonSerializer 2.1. 创建自定义脱敏序列化器 2.2. 使用自定义序列化器 2.3. 扩展性 – 支持多类型数……




  • 方案1:SQL 数据脱敏实现
  • 方案2:使用Jackson库中的JsonSerializer
    • 2.1. 创建自定义脱敏序列化器
    • 2.2. 使用自定义序列化器
    • 2.3. 扩展性 – 支持多类型数据脱敏
  • 方案3:自定义注解实现
  •  总结

在处理敏感数据时,数据脱敏是一种常用的技术,用于保护个人隐私和企业数据安全。本文将介绍如何在Spring Boot中实现数据脱敏,如手机号、邮箱、身份证等,涉及到这些数据的查询接口返回的信息,都必须进行脱敏操作,而实现数据脱敏的方式有许多种,这里我们重点介绍如下几种SpringBoot相关的数据脱敏方法。

顺带说下,所谓数据脱敏比如原手机号为18566668909,就脱敏处理为185****8909,类似这样的操作。

方案1:SQL 数据脱敏实现

我们可以在数据库查询的时候就进行脱敏处理,类似如下:

-- CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现
 
-- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串
-- LEFT(str,len):返回从字符串str 开始的len 最左字符
-- RIGHT(str,len):从字符串str 开始,返回最右len 字符
 
-- 电话号码脱敏sql:
 
SELECT mobilePhone AS oldPhone, CONCAT(LEFT(mobilePhone,3), \'********\' ) AS newPhone FROM t_s_user
 
-- 身份证号码脱敏sql:
 
SELECT idcard AS oldIdCard, CONCAT(LEFT(idcard,3), \'****\' ,RIGHT(idcard,4)) AS newIdCard FROM t_s_user

方案2:使用Jackson库中的JsonSerializer

2.1. 创建自定义脱敏序列化器

首先,创建一个继承自JsonSerializer<String>的序列化器。以MobileSerializer为例,代码如下:

import cn.hutool.core.util.DesensitizedUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 自定义手机序列号器
 */
public class MobileSerializer extends JsonSerializer<String> {

    /**
     * 自定义序列化方法,用于对手机号进行脱敏处理并写入JSON生成器。
     *
     * @param mobile             要序列化的手机号
     * @param jsonGenerator      JSON生成器,用于写入序列化后的数据
     * @param serializerProvider 序列化提供者,提供序列化所需的服务
     * @throws IOException 如果在序列化过程中发生I/O错误
     */
    @Override
    public void serialize(String mobile, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // 检查手机号是否为null或者是否是有效的手机号
        if (mobile == null || !isValidMobile(mobile)) {
            // 如果手机号无效,直接输出原始手机号
            jsonGenerator.writeString(mobile);
            return;
        }
        // 调用脱敏工具类对手机号进行脱敏处理
        String mobileDesensitized = DesensitizedUtil.mobilePhone(mobile);
        // 将脱敏后的手机号字符串写入到JSON生成器jsonGenerator中
        jsonGenerator.writeString(mobileDesensitized);
    }

    /**
     * 检查手机号的合法性
     *
     * @param mobile 手机号
     * @return 如果手机号合法则返回true,否则返回false
     */
    private boolean isValidMobile(String mobile) {
        // 在此处添加对手机号合法性的检查逻辑
        return true;
    }
}

其中,serialize方法用于处理数据的脱敏逻辑,isValidMobile用于检查数据的合法性。

2.2. 使用自定义序列化器

在实体类中,使用@JsonSerialize注解指定字段使用自定义序列化器。例如,对于一个用户的手机号,我们在实体类中如下使用:

/**
 * 实体类
 */
public class User {

    @JsonSerialize(using = MobileSerializer.class)
    private String mobile;

    // 其他字段和getter、setter
}

2.3. 扩展性 – 支持多类型数据脱敏

为支持多类型数据(如邮箱、身份证等)脱敏,你可以为每种数据类型创建对应的序列化器类,类似于MobileSerializer

例如,创建一个EmailSerializer处理邮箱脱敏:

public class EmailSerializer extends JsonSerializer<String> {
    // 实现邮箱的脱敏逻辑
}

在实体类中,对应字段使用@JsonSerialize注解指定使用EmailSerializer

public class User {
    
    @JsonSerialize(using = EmailSerializer.class)
    private String email;

    // 其他字段和getter、setter
}

方案3:自定义注解实现

在Spring Boot中,可以使用自定义注解来标记需要进行数据脱敏的方法。然后,在数据访问层(如DAO)中,对该方法进行拦截和处理,实现数据脱敏。

例如,创建一个自定义注解@SensitiveData

@Target({ElementType.METHOD, ElementType.FIELD})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface SensitiveData {  
}

然后,在需要进行数据脱敏的方法上添加该注解:

@Service  
public class UserService {  
    @Autowired  
    private UserDao userDao;  
      
    @SensitiveData  
    public User getUserById(Long id) {  
        return userDao.getUserById(id);  
    }  
}

在数据访问层(如使用MyBatis),编写拦截器来拦截@SensitiveData注解的方法,并实现数据脱敏:

@Component  
public class SensitiveDataInterceptor implements Interceptor {  
    @Override  
    public Object intercept(Invocation invocation) throws Throwable {  
        Method method = invocation.getMethod();  
        if (method.isAnnotationPresent(SensitiveData.class)) {  
            // 进行数据脱敏处理  
            Object result = invocation.proceed();  
            // 对返回结果进行数据脱敏处理,例如使用StringUtil.mask(result, \"****\");  
            return result;  
        } else {  
            return invocation.proceed();  
        }  
    }  
    // 其他方法省略...  
}

 总结

以上就是SpringBoot项目如何实现数据脱敏的全部内容,当然还有很多其他的实现方式,欢迎留言讨论。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9665.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号