目录
信息脱敏工具:信息脱敏工具-DesensitizedUtil | Hutool
Hutool:Hutool
简介:在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作,因此Hutool针对常用的信息封装了一些脱敏方法。
现阶段支持的脱敏数据类型包括:
- 用户id
- 中文姓名
- 身份证号
- 座机号
- 手机号
- 地址
- 电子邮件
- 密码
- 中国大陆车牌,包含普通车辆、新能源车辆
- 银行卡
1、引入依赖
-
依赖:hutool+springboot自带的Jackson序列化
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
2、定义序列化器
- 身份证序列化器
/**
* 身份证号脱敏反序列化
*/
public class IdCardDesensitizationSerializer extends JsonSerializer<String> {
@Override
public void serialize(String idCard, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String phoneDesensitization = DesensitizedUtil.idCardNum(idCard, 4, 4);
jsonGenerator.writeString(phoneDesensitization);
}
}
- 手机号序列化器
/**
* 手机号脱敏反序列化
*/
public class PhoneDesensitizationSerializer extends JsonSerializer<String> {
@Override
public void serialize(String phone, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String phoneDesensitization = DesensitizedUtil.mobilePhone(phone);
jsonGenerator.writeString(phoneDesensitization);
}
}
3、 敏感字段上添加自定义序列化器。
@Data
@Accessors(chain = true)
public class UserRespDTO {
/**
* 证件号码
*/
@JsonSerialize(using = IdCardDesensitizationSerializer.class)
private String idCard;
/**
* 手机号
*/
@JsonSerialize(using = PhoneDesensitizationSerializer.class)
private String phone;
}
4、模拟测试用例
- 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_user")
public class UserDO {
// ID
private Long id;
// 用户名
private String username;
// 密码
private String password;
// 真实姓名
private String realName;
// 手机号
private String phone;
// 邮箱
private String mail;
// 注销时间戳
private Long deletionTime;
// 创建时间
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 修改时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
// 删除标识 0:未删除 1:已删除
@TableField(fill = FieldFill.INSERT)
private Integer delFlag;
}
- 响应脱敏实体
@Data
public class UserDTO {
// ID
private Long id;
// 用户名
private String username;
// 真实姓名
private String realName;
// 手机号
@JsonSerialize(using = PhoneDesensitizationSerializer.class)
private String phone;
// 邮箱
private String mail;
// 删除标识 0:未删除 1:已删除
private Integer delFlag;
}
- Controller层
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
/**
* 根据用户名查询用户脱敏信息
*/
@GetMapping("/user/{username}")
public Result<UserDTO> getUserByUsername(@PathVariable("username") String username){
return Results.success(userService.getUserByUserName(username));
}
}
- Service层
public interface UserService extends IService<UserDO> {
/**
* 根据用户名查询用户信息
* @param username
* @return 返回用户信息实体
*/
UserDTO getUserByUserName(String username);
}
- ServiceImpl层
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {
/**
* 通过用户名查询用户信息
* @param username
* @return
*/
@Override
public UserDTO getUserByUserName(String username) {
LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDO::getUsername,username);
UserDO userDO = baseMapper.selectOne(wrapper);
UserDTO userDTO = new UserDTO();
BeanUtils.copyProperties(userDO,userDTO);
return userDTO;
}
}
5、用例测试
- 发起测试请求
- 可以看到手机号成功脱敏