当前位置: 首页 > news >正文

SpringBoot敏感数据脱敏怎么处理

在Spring Boot中处理敏感数据脱敏,可以通过以下几种方式实现,确保敏感信息在接口返回、日志输出、数据库存储等环节得到保护:


1. 使用注解 + Jackson序列化脱敏

通过自定义注解和Jackson的JsonSerializer实现数据脱敏,适合接口返回敏感数据时动态处理。

实现步骤:
  1. 定义脱敏策略枚举
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;
    }
}
  1. 自定义脱敏注解
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerialize.class)
public @interface Sensitive {
    SensitiveStrategy strategy();
}
  1. 自定义序列化器
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));
    }
}
  1. 在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)对敏感字段进行加密存储。

实现步骤:
  1. 添加依赖
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
  1. 配置加密密钥
jasypt.encryptor.password=your_secret_key
  1. 在实体类中使用加密注解
public class User {
    @Encrypted
    private String phone;

    @Encrypted
    private String idCard;
}

4. 其他注意事项

  • 全局性处理:结合AOP对所有Controller返回结果进行统一脱敏。
  • 深度脱敏:处理嵌套对象(如集合、Map中的敏感数据)。
  • 性能优化:避免在高频接口中使用复杂正则匹配。
  • 测试验证:确保脱敏后的数据不可逆且符合业务需求。

总结

根据场景选择合适方案:

  • 接口脱敏:使用Jackson自定义序列化。
  • 日志安全:配置日志替换规则。
  • 存储安全:数据库字段加密。
  • 传输安全:启用HTTPS + 数据加密传输。

通过组合以上方法,可系统性地保护敏感数据,满足GDPR等数据安全法规要求。

相关文章:

  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-loss.py
  • 反激变压器的相关参数,磁芯选择,电感系数,气隙,绕线方式,
  • 【已解决】pyodbc 5.2 [ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
  • Linux下用route命令修改默认网关,不用重启网络
  • 分布式系统和集群式系统
  • Spring Boot + MyBatis 实现 RESTful API 的完整流程
  • CSS—选择器详解:5分钟动手掌握选择器
  • LeetCode第57题_插入区间
  • eclipse SVN: ‘0x00400006:踩坑之旅
  • 【2025】企业信息查询接口解析
  • 陕西省地标-DB61/T 1121-2018 政务服务中心建设和运营规范
  • sam-vit-base 辅助检测卡车的可拽雨覆完全覆盖
  • leetcode_字典树 139. 单词拆分
  • 性能测试分析和调优
  • 【Linux】Linux的进程控制
  • Flutter系列教程之(8)——CheckBox多选框及动态更改多选框
  • VSCode大的JSON数据不能折叠问题
  • Spring Boot 消息队列(以RabbitMQ为例)
  • 【AI论文】MedVLM-R1:通过强化学习激励视觉语言模型(VLMs)的医疗推理能力
  • 基于STM32语音识别的智能家居
  • 服装网站建设背景/同城广告发布平台
  • 关键词优化搜索引擎/优化网哪个牌子好
  • wordpress站点进入时弹窗/上海百度推广
  • 济南 手机网站制作/保定网站推广公司
  • 人事怎么做招聘网站比对分析/谷歌搜索引擎seo
  • 帝国做的网站打开速度/怎么给自己的公司建立网站