在软件开发中,保护用户隐私和数据安全是至关重要的。敏感词脱敏是一种常见的数据保护手段,它通过对敏感信息进行变形处理,确保隐私数据的安全性。本文将深入探讨在Java项目中如何实现敏感词脱敏,包括常用的脱敏策略、工具类库的使用以及具体的代码实现。
敏感词脱敏的概念与重要性
敏感词脱敏是指对某些敏感信息通过预定义的规则进行数据的变形处理。常见的脱敏规则包括:
-
替换:将敏感数据中的部分字符替换为其他字符(如星号*)。
-
删除:随机删除敏感数据中的部分内容。
-
重排:打乱原始数据中字符或字段的顺序。
-
加噪:在数据中注入误差或噪音,以实现脱敏效果。
常用的脱敏策略
在实际应用中,替换是最常见的脱敏策略。例如,将用户的部分个人信息(如身份证号、手机号等)中的字符替换为星号或其他占位符,以隐藏关键信息。
Hutool + Jackson 实现脱敏
Hutool是一个Java工具包,提供了丰富的工具类,其中就包括脱敏工具类DesensitizedUtil
。结合Jackson,可以通过注解的方式实现数据脱敏。
1. 引入Hutool依赖
首先,需要在项目中引入Hutool的依赖。如果使用Maven,可以在pom.xml
中添加如下依赖:
xml复制
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
2. 使用DesensitizedUtil进行脱敏
Hutool的DesensitizedUtil
类支持多种脱敏类型,包括用户ID、中文姓名、身份证号等。脱敏规则是隐藏信息中的一部分关键信息,用*代替。
java复制
import cn.hutool.ext.json.JSONUtil;
import cn.hutool.util.DesensitizedUtil;
public class DesensitizationExample {
public static void main(String[] args) {
String sensitiveInfo = "张三 123456789012 13800138000 67890123456789";
String desensitizedInfo = DesensitizedUtil.desensitize(sensitiveInfo);
System.out.println(desensitizedInfo);
}
}
3. 结合Jackson进行脱敏
如果项目基于Spring Boot开发,可以利用Jackson自定义序列化实现,在JSON序列化渲染给前端时进行脱敏。
定义一个脱敏注解Desensitization
:
java复制
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonDeserialize;
import com.fasterxml.jackson.annotation.JsonSerialize;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Desensitization {
// 定义脱敏策略
DesensitizationTypeEnum value() default DesensitizationTypeEnum.DEFAULT;
}
// 枚举类型定义脱敏策略
public enum DesensitizationTypeEnum {
DEFAULT,
ID_CARD_NO,
CHINESE_NAME,
MOBILE_NO,
EMAIL,
BANK_CARD_NO
}
自定义序列化类继承JsonSerializer
,实现serialize
和createContextual
方法:
java复制
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
public class DesensitizationSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value == null) {
gen.writeNull();
return;
}
String desensitizedValue = DesensitizedUtil.desensitize(value);
gen.writeString(desensitizedValue);
}
public static class Provider extends SerializerProvider.Base implements ContextualSerializer {
@Override
public JsonSerializer<?> createSerializer(SerializationConfig config, BeanProperty property, Type jacksonType, Class<?> deserializeType) {
return new DesensitizationSerializer();
}
}
}
使用脱敏注解:
java复制
import com.fasterxml.jackson.annotation.JsonFormat;
public class User {
@Desensitization(DesensitizationTypeEnum.CHINESE_NAME)
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING)
private String id;
// getters and setters
}
Apache ShardingSphere 实现脱敏
Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案,提供了数据脱敏模块。通过对用户输入的SQL进行解析,并依据用户提供的脱敏配置对SQL进行改写,从而实现对原文数据进行加密,并将原文数据(可选)及密文数据同时存储到底层数据库。
1. ShardingSphere 脱敏规则配置
ShardingSphere的脱敏配置主要分为四部分:数据源配置、加密器配置、脱敏表配置以及查询属性配置。
yaml复制
encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd:
cipherColumn: pwd_cipher
encryptor: aes_encryptor
props:
query.with.cipher.column: false
2. 使用ShardingSphere进行脱敏
ShardingSphere通过Encrypt-JDBC实现数据脱敏,用户只需提供脱敏规则即可。Encrypt-JDBC将用户发起的SQL进行拦截,并通过SQL语法解析器进行解析、理解SQL行为,再依据用户传入的脱敏规则,找出需要脱敏的字段和所使用的加解密器对目标字段进行加解密处理后,再与底层数据库进行交互。
Mybatis-Mate 实现脱敏
Mybatis-Mate 是 MyBatis-Plus 的企业级模块,支持敏感词脱敏,内置手机号、邮箱、银行卡号等9种常用脱敏规则。
1. 引入Mybatis-Mate依赖
在项目中引入Mybatis-Mate的依赖:
xml复制
<dependency>
<groupId>com.ibytecode</groupId>
<artifactId>mybatis-mate-spring-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
2. 使用@ColumnMask注解进行脱敏
Mybatis-Mate 提供了 @ColumnMask
注解,以及内置的9种脱敏规则。
java复制
import com.ibytecode.mybatis.ext.annotations.ColumnMask;
import com.ibytecode.mybatis.ext.annotations.Table;
@Table("tb_account")
public class Account {
@Id(keyType = KeyType.Auto)
private Long id;
@ColumnMask(Masks.CHINESE_NAME)
private String userName;
@ColumnMask(Masks.EMAIL)
private String email;
}
如果内置的脱敏规则不满足需求,可以自定义脱敏规则。
java复制
import com.ibytecode.mybatis.ext.mask.MaskManager;
import com.ibytecode.mybatis.ext.mask.MaskProcessor;
public class CustomMaskProcessor implements MaskProcessor {
@Override
public Object mask(Object data) {
// 自定义脱敏规则
return data;
}
}
// 注册自定义脱敏规则
MaskManager.registerMaskProcessor("自定义规则名称", new CustomMaskProcessor());
MyBatis-Flex 实现脱敏
MyBatis-Flex 是一个 MyBatis 增强框架,提供了数据脱敏功能,并且可以免费使用。
1. 引入MyBatis-Flex依赖
在项目中引入MyBatis-Flex的依赖:
xml复制
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>mybatis-flex</artifactId>
<version>3.3.1</version>
</dependency>
2. 使用@ColumnMask注解进行脱敏
MyBatis-Flex 提供了 @ColumnMask
注解,以及内置的9种脱敏规则。
java复制
import com.github.houbb.mybatis.flex.annotation.ColumnMask;
import com.github.houbb.mybatis.flex.annotation.Table;
@Table("tb_account")
public class Account {
@Id(keyType = KeyType.Auto)
private Long id;
@ColumnMask(Masks.CHINESE_NAME)
private String userName;
@ColumnMask(Masks.EMAIL)
private String email;
}
如果内置的脱敏规则不满足需求,可以自定义脱敏规则。
java复制
import com.github.houbb.mybatis.flex.mask.MaskManager;
import com.github.houbb.mybatis.flex.mask.MaskProcessor;
public class CustomMaskProcessor implements MaskProcessor {
@Override
public Object mask(Object data) {
// 自定义脱敏规则
return data;
}
}
// 注册自定义脱敏规则
MaskManager.registerMaskProcessor("自定义