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

数据脱敏是保护敏感信息的一种有效方法,特别是在处理用户数据时,确保数据的隐私和安全至关重要。在本篇文章中,我们将介绍如何在SpringBoot项目中实现数据脱敏方案,重点是通过配置文件(YAML)来管理敏感数据的脱敏规则,而不是使用传统的AOP和注解方式。此方案适用于需要灵活配置和扩展的数据脱敏场景。

1. 数据脱敏的必要性

数据脱敏技术用于隐藏或替换敏感信息,以确保在数据处理、存储和传输过程中不暴露用户的私人信息。敏感数据如身份证号码、信用卡信息、电子邮箱等,容易被不法分子利用。因此,在数据共享或分析时,脱敏处理是必要的。

2. 项目准备

2.1 创建Spring Boot项目

使用Spring Initializr创建一个新的Spring Boot项目,添加以下依赖:

  • Spring Web
  • Spring Boot DevTools
  • Spring Configuration Processor

2.2 项目结构

项目结构如下:

data-masking
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── datamasking
│   │   │               ├── controller
│   │   │               │   └── UserController.java
│   │   │               ├── service
│   │   │               │   └── UserService.java
│   │   │               ├── model
│   │   │               │   └── User.java
│   │   │               └── DataMaskingApplication.java
│   │   └── resources
│   │       ├── application.yml
│   │       └── data-masking-config.yml
└── pom.xml

3. YAML配置文件

3.1 application.yml

src/main/resources/application.yml文件中,配置应用的基本信息:

spring:
  application:
    name: data-masking
  profiles:
    active: dev

3.2 data-masking-config.yml

src/main/resources/data-masking-config.yml文件中,定义数据脱敏规则:

data-masking:
  rules:
    email: 
      type: "mask"
      value: "****@example.com"
    phone:
      type: "prefix"
      value: "139****"
    idCard:
      type: "partial"
      value: "****1234"

4. 实现数据脱敏逻辑

4.1 数据模型

User.java模型类中定义用户属性:

package com.example.datamasking.model;

public class User {
    private String name;
    private String email;
    private String phone;
    private String idCard;

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

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getIdCard() {
        return idCard;
    }

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

4.2 服务类

UserService.java中实现脱敏逻辑:

package com.example.datamasking.service;

import com.example.datamasking.model.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.Map;

@Service
public class UserService {

    @Value("${data-masking.rules}")
    private Map<String, Object> maskingRules;

    public User maskUserData(User user) {
        if (user.getEmail() != null) {
            user.setEmail(applyMasking(user.getEmail(), maskingRules.get("email")));
        }
        if (user.getPhone() != null) {
            user.setPhone(applyMasking(user.getPhone(), maskingRules.get("phone")));
        }
        if (user.getIdCard() != null) {
            user.setIdCard(applyMasking(user.getIdCard(), maskingRules.get("idCard")));
        }
        return user;
    }

    private String applyMasking(String data, Object rule) {
        // 解析脱敏规则
        String maskingType = (String) ((Map<String, Object>) rule).get("type");
        String maskValue = (String) ((Map<String, Object>) rule).get("value");

        switch (maskingType) {
            case "mask":
                return maskValue;
            case "prefix":
                return data.substring(0, 3) + maskValue.substring(4);
            case "partial":
                return maskValue.replace("****", data.substring(4, 8));
            default:
                return data; // 默认不脱敏
        }
    }
}

4.3 控制器

UserController.java中,创建一个REST API来测试数据脱敏功能:

package com.example.datamasking.controller;

import com.example.datamasking.model.User;
import com.example.datamasking.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

    @Autowired
    private UserService userService;

    @PostMapping("/mask")
    public User maskUserData(@RequestBody User user) {
        return userService.maskUserData(user);
    }
}

5. 启动应用

使用以下命令启动Spring Boot应用:

mvn spring-boot:run

6. 测试脱敏功能

我们可以使用Postman或者cURL工具测试我们的脱敏功能。发送一个POST请求到http://localhost:8080/users/mask,请求体如下:

{
    "name": "张三",
    "email": "zhangsan@example.com",
    "phone": "13912345678",
    "idCard": "1234567890123456"
}

6.1 预期响应

返回的JSON对象将会是:

{
    "name": "张三",
    "email": "****@example.com",
    "phone": "139****",
    "idCard": "****1234"
}

7. 总结

通过不使用AOP和注解的方式,我们实现了一个灵活的Spring Boot数据脱敏方案。通过YAML文件配置脱敏规则,使得该方案具有较好的可扩展性和可维护性。可以根据需要轻松添加或修改脱敏规则,满足不同场景的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只蜗牛儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值