脱敏数据的质量校验
脱敏不是把字段改掉就结束,脱敏前后要校验三件事:脱敏后字段仍符合格式规则(长度、字符集、前缀);业务键的稳定映射保持——同一明文每次都应得到同一脱敏值,跨表关联才不会丢行;统计分布不被破坏(均值、分位数、唯一值数量在容忍范围内)。做法是用固定样本比对脱敏前后的可比指标,并把校验脚本本身也纳入权限管理:它接触的是敏感数据,输出里不能带明文样本。
基本信息
| 格式校验 | 长度、字符集、前缀与校验位规则是否符合字典 |
|---|---|
| 映射稳定性 | 同一明文得到同一脱敏值,支持跨表关联 |
| 分布校验 | 均值、分位数、唯一值数量在容忍范围内 |
| 样本方式 | 用固定样本比对脱敏前后可比指标 |
| 权限要求 | 校验脚本与映射表按敏感资产管理,输出不含明文 |
典型使用场景
- 用户表脱敏后交付分析团队前,确认关联键仍可用于 join
- 跨库迁移时确认脱敏算法一致,避免同一用户在两库里对不上
- 脱敏规则升级(如更换算法或加盐)后做前后分布对比
- 合规检查:证明脱敏后无法还原原始信息且关联性保留
- 下游反馈 join 丢行时,排查映射是否稳定
映射冲突与分布校验
映射冲突与分布校验
-- 校验一:一个脱敏值对应多个明文即为冲突(映射不稳定)
SELECT md5_val, COUNT(DISTINCT raw_val) AS raw_cnt
FROM tmp_mask_mapping
GROUP BY md5_val
HAVING COUNT(DISTINCT raw_val) > 1;
-- 校验二:脱敏前后可比指标对比(均值与唯一值数量)
SELECT 'raw' AS src, AVG(amount) AS avg_amt, COUNT(DISTINCT user_id) AS uv FROM ods_user_raw
UNION ALL
SELECT 'masked' AS src, AVG(amount) AS avg_amt, COUNT(DISTINCT user_id) AS uv FROM dwd_user_masked;
-- 注意:结果输出不要带明文样例;映射表单独授权与留存三项校验对照
| 校验项 | 判据 | 不通过的后果 | 常见原因 |
|---|---|---|---|
| 格式规则 | 符合长度与字符集规范 | 下游校验或解析失败 | 脱敏算法与字段不匹配 |
| 映射稳定性 | 一明文一密文 | join 丢行、指标偏小 | 算法带随机盐或时间戳 |
| 分布保持 | 分位数与均值在容忍内 | 分析与模型结论偏移 | 替换方式破坏数值分布 |
| 唯一值数量 | 与原表量级一致 | 去重统计失真 | 分桶过粗导致大量碰撞 |
校验脚本本身不要输出明文样本;脱敏映射表属于敏感资产,权限与留存周期要单独管理,否则脱敏只是换了个地方泄漏。
脱敏后不验证关联键稳定性时,下游 join 会大量丢行,指标偏小却很难被发现,因为数据看起来是完整的。
脱敏算法变更要当成一次数据变更来管理:明确生效范围与历史是否回刷,否则新旧算法混用会让关联在时间轴上断掉。