Spring Boot 中的 MySQL 数据脱敏

在如今的数据驱动世界中,数据的安全性和隐私性变得愈发重要。尤其是在处理敏感数据时,如身份证号、电话号码等,数据脱敏技术成为数据保护中的一项重要措施。本文将探讨如何在 Spring Boot 中实现数据脱敏,并通过代码示例使概念更加清晰。

1. 数据脱敏概述

数据脱敏是指在不影响数据使用的情况下,将敏感数据进行隐藏、修改或替换。常见的数据脱敏技术包括:

  • 掩码:用特定字符替代敏感信息,例如,将身份证号的后四位替换为星号 ****
  • 哈希:通过哈希函数将敏感数据转为不可逆的格式。
  • 随机化:对敏感数据进行随机更改,例如将年龄随机化为 20-30 岁区间。

在这篇文章中,我们将实现一种简单的掩码脱敏功能。

2. 系统设计

2.1 类图设计

我们首先设计一个数据模型类,包含一些敏感信息。同时,我们还将创建一个服务类用于处理数据脱敏。

classDiagram
    class User {
        +Integer id
        +String name
        +String email
        +String phoneNumber
    }
    
    class UserService {
        +String maskPhoneNumber(String phoneNumber)
        +User getUserById(Integer id)
    }
    
    User --> UserService : utilizes

2.2 数据库设计

为了保存用户信息,我们使用 MySQL 数据库。假设我们有一个 users 表,结构如下:

users
------
id INT PRIMARY KEY AUTO_INCREMENT
name VARCHAR(100)
email VARCHAR(100)
phone_number VARCHAR(15)

在操作数据库时,我们会将一条用户信息读取出来,并在向外输出之前进行数据脱敏。

2.3 ER 图设计

一个概念性的 ER 图如下:

erDiagram
    USER {
        INT id PK
        VARCHAR name
        VARCHAR email
        VARCHAR phone_number
    }

3. 实现步骤

3.1 创建 Spring Boot 项目

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

  • Spring Web
  • Spring Data JPA
  • MySQL Driver

3.2 配置 application.properties

src/main/resources/application.properties 文件中,配置 MySQL 数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false
spring.datasource.username=root
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3.3 创建实体类

创建 User 类表示用户信息:

package com.example.demo.model;

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private String email;

    private String phoneNumber;

    // Getters and Setters
}

3.4 创建数据访问层

使用 Spring Data JPA,我们可以创建一个简单的 Repository 接口:

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Integer> {
}

3.5 创建服务类

我们将实现一个 UserService 类,用于处理数据脱敏逻辑:

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber.length() < 4) {
            return phoneNumber;
        }
        String maskedNumber = phoneNumber.substring(0, phoneNumber.length() - 4) + "****";
        return maskedNumber;
    }

    public User getUserById(Integer id) {
        return userRepository.findById(id).orElse(null);
    }
}

3.6 创建控制器

最后,我们可以创建一个控制器来获取用户信息并返回脱敏后的手机号码:

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.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;

    @GetMapping("/{id}")
    public User getUser(@PathVariable Integer id) {
        User user = userService.getUserById(id);
        if (user != null) {
            user.setPhoneNumber(userService.maskPhoneNumber(user.getPhoneNumber()));
        }
        return user;
    }
}

4. 测试数据脱敏功能

在数据库中插入一条用户数据,然后运行你的 Spring Boot 应用。你可以通过访问 GET /users/{id} 来获取用户信息,其中的手机号码将会被脱敏。

例如,假设我们插入了一条手机号码为 12345678901 的用户信息,通过访问 /users/1,将会收到如下 JSON 响应:

{
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com",
    "phoneNumber": "1234567890****"
}

5. 结尾

数据脱敏是一项关键的技术,能够在保证数据使用的同时,保护用户的隐私。在本文中,我们使用 Spring Boot 和 MySQL 实现了一个简单的数据脱敏示例,你可以将其扩展到更多的敏感信息处理场景。希望这篇文章能为你的项目提供有价值的参考和帮助。数据安全任重道远,只有不断改进和完善,才能更好地保护用户的信息安全。