SpringBoot敏感数据脱敏怎么处理
在Spring Boot中处理敏感数据脱敏,可以通过以下几种方式实现,确保敏感信息在接口返回、日志输出、数据库存储等环节得到保护:
1. 使用注解 + Jackson序列化脱敏
通过自定义注解和Jackson的JsonSerializer
实现数据脱敏,适合接口返回敏感数据时动态处理。
实现步骤:
- 定义脱敏策略枚举
public enum SensitiveStrategy {
// 不同脱敏策略
USERNAME(s -> s.replaceAll("(.).", "$1**")),
PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1****$2"));
private final Function<String, String> desensitizer;
SensitiveStrategy(Function<String, String> desensitizer) {
this.desensitizer = desensitizer;
}
public Function<String, String> getDesensitizer() {
return desensitizer;
}
}
- 自定义脱敏注解
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerialize.class)
public @interface Sensitive {
SensitiveStrategy strategy();
}
- 自定义序列化器
public class SensitiveSerialize extends JsonSerializer<String> {
private SensitiveStrategy strategy;
public SensitiveSerialize(SensitiveStrategy strategy) {
this.strategy = strategy;
}
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(strategy.getDesensitizer().apply(value));
}
}
- 在DTO字段上使用注解
public class UserDTO {
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phone;
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
}
2. 日志脱敏处理
使用日志框架(如Logback或Log4j2)的替换规则,避免敏感信息写入日志。
Logback配置示例(通过正则替换):
<configuration>
<conversionRule conversionWord="msg" converterClass="com.example.LogMaskConverter"/>
</configuration>
自定义转换器:
public class LogMaskConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent event) {
return event.getMessage()
.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2") // 手机号
.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1****$2"); // 身份证
}
}
3. 数据库加密存储
使用加密工具(如Jasypt)对敏感字段进行加密存储。
实现步骤:
- 添加依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
- 配置加密密钥
jasypt.encryptor.password=your_secret_key
- 在实体类中使用加密注解
public class User {
@Encrypted
private String phone;
@Encrypted
private String idCard;
}
4. 其他注意事项
- 全局性处理:结合AOP对所有Controller返回结果进行统一脱敏。
- 深度脱敏:处理嵌套对象(如集合、Map中的敏感数据)。
- 性能优化:避免在高频接口中使用复杂正则匹配。
- 测试验证:确保脱敏后的数据不可逆且符合业务需求。
总结
根据场景选择合适方案:
- 接口脱敏:使用Jackson自定义序列化。
- 日志安全:配置日志替换规则。
- 存储安全:数据库字段加密。
- 传输安全:启用HTTPS + 数据加密传输。
通过组合以上方法,可系统性地保护敏感数据,满足GDPR等数据安全法规要求。