文
章
目
录
章
目
录
在处理敏感数据时,数据脱敏是一种常用的技术,用于保护个人隐私和企业数据安全。本文将介绍如何在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项目如何实现数据脱敏的全部内容,当然还有很多其他的实现方式,欢迎留言讨论。