数据脱敏
背景
数据脱敏是一种保护敏感数据(例如手机号、银行卡、用户姓名)的方法,它通过对数据进行加密、替换、删除等操作,使得数据在不影响其可用性的前提下,无法被直接识别和使用
接口数据返回脱敏
作用域
针对用于展示用户一些敏感数据的查询接口(注意:不含编辑时回显数据的接口),将敏感数据部分以"*"代替
实现方案
1. 创建一个注解类,用于标记需要进行数据脱敏的字段。
@Target(ElementType.FIELD) // 标注在字段上
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizeJsonSerializer.class)
public @interface Desensitize {
DesensitizeType type;
}
/**
* 脱敏策略,不同数据可选择不同的策略
*/
@Getter
public enum DesensitizeType {
/**
* 用户名脱敏
*/
USERNAME,
/**
* 身份证脱敏
*/
ID_CARD,
/**
* 手机号脱敏
*/
PHONE,
/**
* 银行卡号脱敏
*/
BANK_CARD,
/**
* 邮箱脱敏
*/
EMAIL,
/**
* 地址脱敏
*/
ADDRESS;
}
2. 定义一个Jackson序列化器,用于处理标记了自定义注解类@Desensitize的字段
- 判断字段是否存在@Desensitize注解
- 存在,则根据脱敏策略对该字段数据进行脱敏
- 不存在,返回原数据
使用
开发人员只需要在需要脱敏的返回参数上增加@Desensitize注解,并指定脱敏类型type即可
数据库存储脱敏
作用域
数据库中含有用户敏感数据的字段,将敏感数据字段存入加密数据
实现方案
定义Mybatis类型处理器,设置参数时对原数据进行加密,取数据时对数据库中的加密数据进行解密
public class EncryptTypeHandler extends BaseTypeHandler<String> {
/**
* 设置参数
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setString(i, null);
return;
}
ps.setString(i, DbDataUtil.encrypt(parameter));
}
/**
* 获取值
*/
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return DbDataUtil.decrypt(rs.getString(columnName));
}
/**
* 获取值
*/
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return DbDataUtil.decrypt(rs.getString(columnIndex));
}
/**
* 获取值
*/
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return DbDataUtil.decrypt(cs.getString(columnIndex));
}
}
使用
Mybatis
在数据库DO对象的字段上增加 @TypeHandler(EncryptTypeHandler.class)
@TypeHandler(EncryptTypeHandler.class)
private String name;
Mybatis-Plus
在数据库DO对象的字段上增加@TableField(value = "identity_card", typeHandler = EncryptTypeHandler.class)
@TableField(value = "identity_card", typeHandler = EncryptTypeHandler.class)
private String identityCard;