2. 字段级脱敏核心概念
做数据脱敏,我见过不少团队一上来就买工具、定策略,结果跑了两周就卡住了。卡在哪?就是核心概念没理清。你想想看,连哪些数据是敏感的、要脱到什么颗粒度、用哪种方法脱,都没想明白,怎么可能落地呢?
这一章,咱们就把这三个根基打牢:敏感字段怎么识别、脱敏粒度怎么选、脱敏策略怎么定。搞懂了这些,后面写规则、调性能,你心里就有谱了。
2.1 敏感字段识别
敏感字段识别是个老话题,但我发现很多人还在用最笨的办法——找业务部门要字段列表。结果呢?业务给了两百多个字段,里面一半不敏感,真敏感的反倒漏了。
敏感字段的典型特征其实很简单:
- 个人身份:能直接定位到具体人的,比如身份证号、手机号、微信号。
- 财务财产:银行卡号、交易金额、账户余额。
- 行为偏好:位置轨迹、购物记录、搜索历史。
- 系统安全:密码、密钥、、Session ID。
那怎么识别呢?我一般用三种手段结合:
- 正则匹配:身份证号、手机号这类有固定格式的,写几条正则快速扫描。
- 字典匹配:字段名里带 "passwd"、"card"、"ssn" 的,直接命中。
- 机器学习分类:实在拿不准的,用训练好的模型对字段内容做分类。
我曾在项目中遇到过这样一个坑:业务方信誓旦旦说某个系统没有敏感数据,结果我们用正则一扫,发现一个备注字段里藏着大段身份证号字符串。这种就属于非结构化敏感数据,最难识别,也最容易出事。
2.2 脱敏粒度
脱敏粒度这个问题,我刚开始做的时候也纠结过。说白了,就是你要管到哪个级别。
| 粒度 | 作用范围 | 优点 | 缺点 |
|---|---|---|---|
| 行级 | 整行不可见 | 实现简单,性能好 | 太过粗暴,丢失大量上下文 |
| 列级 | 整列脱敏 | 粒度比行级细 | 一列只有一个策略,不够灵活 |
| 字段级 | 单个字段值 | 最灵活,可按需配置 | 规则复杂,性能开销大 |
举个例子你就明白了。假设一张用户表,有姓名、手机号、余额三列。
- 行级脱敏:普通运维直接看不到某行记录,连姓名都看不到。
- 列级脱敏:手机号整列全部打码,但姓名和余额还是明的。
- 字段级脱敏:同一个手机号,财务看到完整版,客服看到尾号四位——这就牛了。
我个人偏好字段级脱敏。为什么?因为你想想看,一个客服和一个审计员,他们对同一笔交易的数据可见权限应该是不同的。字段级能精准控制,不会一刀切。
2.3 脱敏策略
策略选不对,脱敏等于没做。常见的脱敏策略有这些:
- 掩盖:像 "138****5678" 这样,部分展示。
- 替换:用假名/假数据替换真实数据,常用于测试库。
- 加密:数据保持密文,使用时解密。
- 截断:只取前几位或后几位,扔掉其他。
- 令牌化:用无意义替换真实值,映射表单独存储。
选哪种策略,要看你的业务场景。我给你画个对比表:
| 策略 | 适用场景 | 可逆性 | 数据失真度 |
|---|---|---|---|
| 掩盖 | 报表展示、客服查询 | 不可逆 | 中 |
| 替换 | 测试环境、培训环境 | 不可逆 | 高 |
| 加密 | 传输、存储全链路保护 | 可逆 | 无 |
| 截断 | 日志审计、统计计算 | 不可逆 | 高 |
| 令牌化 | 支付、跨系统数据共享 | 可逆(有映射表) | 无 |
你可能会问,那加密和令牌化有什么区别?我习惯这么讲:加密是算法可逆,密钥丢了就全完了;令牌化是映射可逆,映射表没了你也还原不了,但一张表被攻击和一套算法被破解,风险等级完全不同。
// 一个字段级掩盖策略的例子
// 手机号:保留前3位和后4位,中间用*代替
function maskPhone(phone) {
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}
实际落地时,我建议不要只选一种策略。你可以根据字段角色组合使用:
- 公共展示场景:掩盖
- 数据加工场景:替换
- 存储传输场景:加密 / 令牌化
核心要点:
- 敏感字段识别靠正则+字典+人工校核,三重保险
- 脱敏粒度按需选择,字段级最灵活但也最耗性能
- 脱敏策略要根据场景定,别拿一个策略打天下
最后我想说,这三个概念不是孤立的。识别、粒度、策略,三者要放到一起考虑。你识别出了一个敏感字段,决定了要用字段级粒度,然后选了掩盖策略——这样一条完整的规则才真正能用起来。