数据脱敏详解
# 数据脱敏
在企业级应用中,保护用户隐私和敏感数据非常重要。当接口返回包含敏感信息的数据时,通常需要进行数据脱敏处理。数据脱敏的常用手段是使用 *
隐藏一部分数据,例如脱敏后的手机号码显示为 158****8888
。若依框架基于 Jackson 提供了便捷的字段脱敏注解,只需在字段上添加对应的注解,即可实现数据脱敏。
# 一、数据脱敏的常见类型
以下是一些常见的数据脱敏类型及其示例:
类型 | 原始数据 | 脱敏数据 |
---|---|---|
USERNAME | 若依 | 若* |
PASSWORD | 123456 | ****** |
ID_CARD | 430602198812136666 | 4306**********6666 |
PHONE | 15888888888 | 158****8888 |
EMAIL | ruoyi@163.com | r****@163.com |
BANK_CARD | 6211222200008888666 | *************8666 |
CAR_LICENSE | 湘F88888 | 湘F8***8 |
# 二、如何实现数据脱敏
若依框架通过在字段上添加 @Sensitive
注解来实现数据脱敏,开发者只需定义脱敏策略并在需要脱敏的字段上应用该注解即可。
# 1. 在实体类字段上添加脱敏注解
在需要进行脱敏处理的字段上添加 @Sensitive
注解,并指定脱敏策略类型。
import com.ruoyi.common.annotation.Sensitive;
import com.ruoyi.common.enums.DesensitizedType;
public class User extends BaseEntity
{
// 手机号码字段,使用PHONE类型脱敏策略
@Sensitive(desensitizedType = DesensitizedType.PHONE)
private String phonenumber;
// 身份证号字段,使用ID_CARD类型脱敏策略
@Sensitive(desensitizedType = DesensitizedType.ID_CARD)
private String idCard;
// 邮箱字段,使用EMAIL类型脱敏策略
@Sensitive(desensitizedType = DesensitizedType.EMAIL)
private String email;
// 密码字段,使用PASSWORD类型脱敏策略
@Sensitive(desensitizedType = DesensitizedType.PASSWORD)
private String password;
// Getter 和 Setter 方法
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
说明:
@Sensitive
注解用于标注需要脱敏的字段。desensitizedType
参数指定脱敏的类型,例如PHONE
、ID_CARD
等。
# 2. 定义脱敏策略
若依框架在 DesensitizedType
枚举类中定义了多种脱敏策略,开发者可以根据需要扩展新的脱敏策略。
package com.ruoyi.common.enums;
/**
* 数据脱敏类型
*
* @author ruoyi
*/
public enum DesensitizedType
{
// 用户名类型,显示首字
USERNAME,
// 密码类型,全部脱敏
PASSWORD,
// 身份证号,显示前4位和后4位
ID_CARD,
// 手机号码,显示前三位和后四位
PHONE,
// 邮箱地址,显示前一位和@后的域名
EMAIL,
// 银行卡号,显示后4位
BANK_CARD,
// 车牌号,显示前2位和最后1位
CAR_LICENSE
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 3. 实现脱敏逻辑
在实现数据脱敏时,实际的脱敏逻辑通常是在数据序列化为JSON时生效的。若依框架通过在 Jackson 中自定义序列化器来实现脱敏。开发者可以自定义序列化器,也可以扩展现有的脱敏策略。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.ruoyi.common.enums.DesensitizedType;
import java.io.IOException;
public class SensitiveSerializer extends JsonSerializer<String>
{
private final DesensitizedType type;
public SensitiveSerializer(DesensitizedType type) {
this.type = type;
}
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException
{
String result = value;
if (value != null && !value.isEmpty()) {
switch (type) {
case USERNAME:
result = value.charAt(0) + "*";
break;
case PASSWORD:
result = "******";
break;
case ID_CARD:
result = value.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1**********$2");
break;
case PHONE:
result = value.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
break;
case EMAIL:
result = value.replaceAll("(\\w?)(\\w+)(@.*)", "$1****$3");
break;
case BANK_CARD:
result = value.replaceAll("\\d{12}(\\d{4})", "************$1");
break;
case CAR_LICENSE:
result = value.replaceAll("(\\w{2})(\\w+)(\\w{1})", "$1***$3");
break;
default:
break;
}
}
gen.writeString(result);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
说明:
SensitiveSerializer
是一个自定义的序列化器,根据传入的脱敏类型对数据进行脱敏处理。- 通过匹配正则表达式的方式替换敏感数据,生成脱敏后的字符串。
# 4. 配置 Jackson 使用自定义序列化器
在 Spring Boot 项目中,通常通过配置 Jackson 的 ObjectMapper
来注册自定义的序列化器,以便在全局范围内应用脱敏逻辑。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.ruoyi.common.enums.DesensitizedType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(String.class, new SensitiveSerializer(DesensitizedType.PHONE));
objectMapper.registerModule(module);
return objectMapper;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 三、扩展脱敏策略
若依框架已经提供了常见的脱敏策略,但开发者可以根据业务需求,进一步扩展自定义的脱敏策略。
- 在
DesensitizedType
枚举中添加新的策略类型,例如添加ADDRESS
类型用于脱敏地址信息。
public enum DesensitizedType
{
// 其他类型省略...
// 地址类型,显示前3位和最后2位
ADDRESS
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 在
SensitiveSerializer
中实现新的脱敏逻辑。
switch (type) {
// 其他类型省略...
case ADDRESS:
result = value.replaceAll("(\\S{3})\\S*(\\S{2})", "$1****$2");
break;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
通过以上步骤,便可以为新的字段类型实现定制化的数据脱敏。
# 四、总结
数据脱敏是保护用户隐私的关键措施,若依框架通过注解和 Jackson 自定义序列化器实现了简洁高效的数据脱敏机制。
- 基础脱敏: 通过在字段上使用
@Sensitive
注解,结合内置的DesensitizedType
,可以轻松实现常见的脱敏需求。 - 自定义扩展: 开发者可以通过扩展
DesensitizedType
枚举和自定义序列化器来实现特殊的脱敏逻辑。 - 全局配置: 通过配置 Jackson 的
ObjectMapper
,可以将脱敏逻辑全局化,确保数据在序列化为JSON时自动进行脱敏处理。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08