数据脱敏是保护敏感信息的一种有效方法,特别是在处理用户数据时,确保数据的隐私和安全至关重要。在本篇文章中,我们将介绍如何在SpringBoot项目中实现数据脱敏方案,重点是通过配置文件(YAML)来管理敏感数据的脱敏规则,而不是使用传统的AOP和注解方式。此方案适用于需要灵活配置和扩展的数据脱敏场景。
数据脱敏技术用于隐藏或替换敏感信息,以确保在数据处理、存储和传输过程中不暴露用户的私人信息。敏感数据如身份证号码、信用卡信息、电子邮箱等,容易被不法分子利用。因此,在数据共享或分析时,脱敏处理是必要的。
使用Spring Initializr创建一个新的Spring Boot项目,添加以下依赖:
项目结构如下:
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
在src/main/resources/application.yml
文件中,配置应用的基本信息:
spring:
application:
name: data-masking
profiles:
active: dev
在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"
在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;
}
}
在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; // 默认不脱敏
}
}
}
在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);
}
}
使用以下命令启动Spring Boot应用:
mvn spring-boot:run
我们可以使用Postman或者cURL工具测试我们的脱敏功能。发送一个POST请求到http://localhost:8080/users/mask
,请求体如下:
{
"name": "张三",
"email": "zhangsan@example.com",
"phone": "13912345678",
"idCard": "1234567890123456"
}
返回的JSON对象将会是:
{
"name": "张三",
"email": "****@example.com",
"phone": "139****",
"idCard": "****1234"
}
通过不使用AOP和注解的方式,我们实现了一个灵活的Spring Boot数据脱敏方案。通过YAML文件配置脱敏规则,使得该方案具有较好的可扩展性和可维护性。可以根据需要轻松添加或修改脱敏规则,满足不同场景的需求。
因篇幅问题不能全部显示,请点此查看更多更全内容