0
点赞
收藏
分享

微信扫一扫

数据脱敏​

数据脱敏

背景

数据脱敏是一种保护敏感数据(例如手机号、银行卡、用户姓名)的方法,它通过对数据进行加密、替换、删除等操作,使得数据在不影响其可用性的前提下,无法被直接识别和使用

接口数据返回脱敏

作用域

针对用于展示用户一些敏感数据的查询接口(注意:不含编辑时回显数据的接口),将敏感数据部分以"*"代替

实现方案

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的字段

  1. 判断字段是否存在@Desensitize注解
  2. 存在,则根据脱敏策略对该字段数据进行脱敏
  3. 不存在,返回原数据

使用

开发人员只需要在需要脱敏的返回参数上增加@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;

举报

相关推荐

0 条评论