数据脱敏方案:不使用 AOP + 注解,使用 SpringBoot + YAML 实现

引言

在现代应用中,数据安全性是一个不可忽视的话题。特别是在处理用户敏感信息(如身份证号码、手机号码等)时,如何实现数据脱敏是一个重要的需求。传统方法多依赖于面向切面编程(AOP)和注解,但在某些情况下,我们可能会选择使用更简单的方式来实现这样的功能。本文将介绍如何在 Spring Boot 应用中,利用 YAML 配置来实现数据脱敏。

方案设计

我们将创建一个简单的 Spring Boot 应用,来演示如何根据 YAML 配置对敏感数据进行脱敏。我们假设有一个用户对象,其中包含一些敏感信息,如姓名、手机号和身份证号等。

1. 创建数据模型

首先,我们定义一个用户类,包含需要脱敏的字段。

public class User {
    private String name;
    private String phoneNumber;
    private String idCard;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }
}

2. YAML 配置文件

接下来,我们定义一个 YAML 配置文件,指定需要脱敏的字段和脱敏规则。

# application.yaml
data:
  mask:
    name: true
    phoneNumber: true
    idCard: true

在这个配置中,我们简单地用布尔值来表示各个字段是否需要脱敏。

3. 创建数据脱敏服务

我们可以创建一个服务类来处理数据脱敏的逻辑。通过读取 YAML 配置文件,决定如何脱敏每个字段。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class DataMaskingService {

    @Value("${data.mask.name}")
    private boolean maskName;

    @Value("${data.mask.phoneNumber}")
    private boolean maskPhoneNumber;

    @Value("${data.mask.idCard}")
    private boolean maskIdCard;

    public User maskUser(User user) {
        if (maskName) {
            user.setName(maskName(user.getName()));
        }
        if (maskPhoneNumber) {
            user.setPhoneNumber(maskPhoneNumber(user.getPhoneNumber()));
        }
        if (maskIdCard) {
            user.setIdCard(maskIdCard(user.getIdCard()));
        }
        return user;
    }

    private String maskName(String name) {
        return name.charAt(0) + "**";
    }

    private String maskPhoneNumber(String phoneNumber) {
        return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
    }

    private String maskIdCard(String idCard) {
        return idCard.substring(0, 6) + "********";
    }
}

4. 使用数据脱敏服务

最后,我们可以在 Controller 中使用这个脱敏服务,将敏感数据返回给客户端之前执行脱敏处理。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private DataMaskingService dataMaskingService;

    @GetMapping("/info")
    public User getUserInfo() {
        User user = new User();
        user.setName("张三");
        user.setPhoneNumber("13812345678");
        user.setIdCard("420XXXXXXXXXXXX");

        return dataMaskingService.maskUser(user);
    }
}

总结

通过以上示例,我们展示了一种简单便捷的方式,不依赖 AOP 和注解,通过 Spring Boot 和 YAML 配置实现数据脱敏。此方案的优点是实现简单,易于理解,适用于较为简单的数据脱敏需求。在实际应用中,脱敏逻辑可以根据具体情况进行扩展。同时,这种方式也使得脱敏策略的修改变得更加灵活,只需调整 YAML 配置即可,无需改动代码。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部