SpringBoot如何实现数据脱敏

后端 潘老师 6个月前 (11-07) 178 ℃ (0) 扫码查看

在处理敏感数据时,数据脱敏是一种常用的技术,用于保护个人隐私和企业数据安全。本文将介绍如何在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.panziye.com/back/10685.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】