1、简述
数据脱敏(Desensitization)是指通过对敏感数据进行部分或完全隐藏处理,保护敏感信息在存储和使用过程中的安全性。常见的应用场景包括日志记录、接口返回、报表展示、数据分析等,特别是在涉及用户隐私、支付信息和企业数据的系统中至关重要。
2、数据脱敏的意义
- 保护隐私
防止敏感数据泄露,如身份证号、银行卡号、手机号等。 - 符合合规要求
符合《个人信息保护法 (PIPL)》和《通用数据保护条例 (GDPR)》等法规。 - 降低数据风险
数据在传输和使用中即便泄露,敏感信息也不会暴露。
常见的脱敏场景:
- 手机号脱敏
示例:13912345678 -> 139****5678 - 身份证号脱敏
示例:123456789012345678 -> 123456********5678 - 邮箱脱敏
示例:example@gmail.com -> ex****@gmail.com - 银行卡号脱敏
示例:6222020400112568888 -> 6222 **** **** 8888
3、数据脱敏的实现样例
3.1 自定义脱敏实现
添加脱敏工具类DesensitizationUtils:
public class DesensitizationUtils {
// 手机号脱敏
public static String maskPhone(String phone) {
if (phone == null || phone.length() != 11) {
return phone;
}
return phone.substring(0, 3) + "****" + phone.substring(7);
}
// 身份证号脱敏
public static String maskIdCard(String idCard) {
if (idCard == null || idCard.length() < 15) {
return idCard;
}
return idCard.substring(0, 6) + "********" + idCard.substring(idCard.length() - 4);
}
// 邮箱脱敏
public static String maskEmail(String email) {
if (email == null || !email.contains("@")) {
return email;
}
int atIndex = email.indexOf("@");
if (atIndex <= 1) {
return email;
}
return email.substring(0, 2) + "****" + email.substring(atIndex);
}
// 银行卡号脱敏
public static String maskBankCard(String bankCard) {
if (bankCard == null || bankCard.length() < 16) {
return bankCard;
}
return bankCard.substring(0, 4) + " **** **** " + bankCard.substring(bankCard.length() - 4);
}
}
脱敏使用样例:
public class Main {
public static void main(String[] args) {
String phone = "13912345678";
String idCard = "123456789012345678";
String email = "example@gmail.com";
String bankCard = "6222020400112568888";
System.out.println("脱敏后的手机号: " + DesensitizationUtils.maskPhone(phone));
System.out.println("脱敏后的身份证号: " + DesensitizationUtils.maskIdCard(idCard));
System.out.println("脱敏后的邮箱: " + DesensitizationUtils.maskEmail(email));
System.out.println("脱敏后的银行卡号: " + DesensitizationUtils.maskBankCard(bankCard));
}
}
3.1 引用 red.zyc 组件脱敏实现
以下是使用 red.zyc.desensitization 提供的 Maven 包实现数据脱敏功能的完整方案,包括 Maven 依赖和实现步骤。
red.zyc.desensitization 是一个专门用于数据脱敏的库,支持多种脱敏策略。以下是相关依赖:
<!-- data desensitization-->
<dependency>
<groupId>red.zyc</groupId>
<artifactId>desensitization</artifactId>
<version>2.4.3</version>
</dependency>
red.zyc.desensitization 提供了基于注解的脱敏机制,首先为需要脱敏的字段添加注解:
package com.example.springbootclient.entry;
import red.zyc.desensitization.annotation.*;
public class User {
@ChineseNameSensitive
private String name;
@IdCardNumberSensitive
private String idCard;
@PhoneNumberSensitive
private String phone;
@EmailSensitive
private String email;
@PasswordSensitive
private String password;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
利用库中的Sensitive 工具类进行脱敏:
public class DesensitizationController {
public static void main(String[] args) {
User user = new User();
user.setEmail("admin@gmail.com");
user.setPassword("89144552522");
user.setName("admin");
user.setPhone("13845988146");
user.setIdCard("6222020400112568888");
user = Sensitive.desensitize(user);
System.out.println("脱敏后的用户信息: " + JSON.toJSONString(user));
}
}
输出示例:
脱敏后的用户信息: {"email":"a****@gmail.com","idCard":"622202*********8888","name":"a****","password":"***********","phone":"138****8146"}
red.zyc.desensitization 提供了基于注解和处理器的灵活脱敏功能,支持多种场景下的敏感数据保护,特别适合需要动态脱敏的 Java 项目。
4、总结
数据脱敏是保护敏感信息的关键技术,既可以通过简单的工具类实现常见场景的脱敏,也可以利用注解和反射实现灵活的自动脱敏。在实际开发中,建议根据业务需求和性能要求选择合适的脱敏方案,确保敏感信息安全。
应用场景:
- 用户隐私展示:订单信息中的用户手机号或姓名。
- 日志记录:记录错误信息时隐藏用户敏感数据。
- 数据分析:在数据导出或共享时避免敏感信息泄露。
通过合理的脱敏策略,可以有效降低数据泄露的风险,同时符合隐私保护的法律要求。
评论区