数据脱敏器
数据对外之前,先把不该露的遮掉。
触发规则
| 用户意图 | 处理 |
|----------|------|
| 这份数据要发给别人,先脱敏 | 用 --auto 全文自动识别 + 默认部分遮挡 |
| 把手机号/身份证遮掉 | --auto --types 手机号,身份证 |
| 姓名/地址这种没有固定格式的列也要遮 | 用 --columns 姓名,地址 指定列 |
| 脱敏后还要能按人做统计 | 用 --mode hash 一致化假名 |
| 只想看看会脱敏掉什么,先别改文件 | 加 --dry-run |
| 只是问本技能能干嘛 | 仅介绍,不执行任何操作 |
依赖
| 依赖 | 用途 |
|------|------|
| Python 3.8+ | 运行 scripts/mask_data.py(仅用标准库) |
无需联网、无需安装任何第三方包。
快速开始
# 先试运行,看看会命中什么(不写任何文件)
python3 scripts/mask_data.py data/ --auto --dry-run
# 自动识别脱敏,输出到指定目录(原文件不动)
python3 scripts/mask_data.py data/ --auto --out out/masked
# 只处理手机号与身份证
python3 scripts/mask_data.py data/ --auto --types 手机号,身份证 --out out/
# 指定列整列脱敏(姓名、地址等无固定格式字段)
python3 scripts/mask_data.py users.csv --columns 姓名,联系地址 --out out/
# 一致化假名:脱敏后仍可做关联分析
python3 scripts/mask_data.py orders.csv --auto --mode hash --salt <盐值> --out out/
# 就地覆盖(自动生成 .bak 备份)
python3 scripts/mask_data.py app.log --auto --inplace
参数
| 参数 | 说明 | 默认 |
|------|------|------|
| --auto | 自动识别五类敏感模式 | 关 |
| --columns A,B | 对表格指定列整列脱敏(逗号分隔) | — |
| --mode | partial / full / hash | partial |
| --keep-head N | 部分遮挡保留前 N 字符 | 3 |
| --keep-tail N | 部分遮挡保留后 N 字符 | 4 |
| --mask-char C | 遮挡字符 | * |
| --salt STR | 假名模式的盐值(需自行保管) | 内置默认 |
| --out DIR | 输出目录 | 同目录 + .masked |
| --inplace | 就地覆盖(先备份 .bak) | 关 |
| --types a,b | 自动识别时只处理指定类型 | 全部 |
| --dry-run | 只统计不写文件 | 关 |
| --report PATH | 输出 JSON 统计报告 | — |
| --preview N | 终端预览前 N 条替换样例 | 5 |
| --encoding ENC | 强制输入编码 | 自动探测 |
--auto 与 --columns 至少指定其一,否则工具报错退出(rc=2),避免"什么都没做却以为做了"。
--inplace 与 --out 互斥。
敏感模式与识别口径
| 类型 | 识别规则 | 占位符 |
|------|----------|--------|
| 身份证 | 18 位,首位非 0,含合法年月日段,末位数字或 X,前后非字母数字 | <ID> |
| 银行卡 | 16–19 位数字,允许空格/短横线分隔 | <BANKCARD> |
| 手机号 | 1[3-9] 开头共 11 位,可带 +86 / 86 前缀与分隔符 | <PHONE> |
| 邮箱 | 常规局部@域名.顶级域,顶级域至少 2 位字母 | <EMAIL> |
| IPv4 | 四段 0–255,前后非数字与点(避免匹配版本号片段) | <IP> |
扫描采用"站点式"重叠消解:所有模式先各自找出候选区间,再按起点排序、 起点相同取更长者,重叠的后到者丢弃。因此身份证不会被银行卡规则二次命中, 一段文本只被遮挡一次。
三种脱敏模式
| 模式 | 效果 | 适用 |
|------|------|------|
| partial | 13800138000 → 138****8000 | 默认。保留头尾,便于人工比对与排查 |
| full | zhang@example.com → <EMAIL> | 完全不保留原值特征,用于对外发布 |
| hash | 同值 → 同假名 P_def4cb922e | 脱敏后仍需按主体关联统计(复购率、活跃度等) |
hash 模式说明:
- 算法为
sha256(盐值 + 原值)取前 10 位十六进制,加盐后不可逆推; - 同一盐值下,同一原值恒定得到同一假名,同一文件内与跨文件均一致;
- 换不同盐值得到完全不同的假名,盐值不同则两份数据无法关联;
- 盐值需自行保管:同盐值可复现映射关系,盐值泄露则弱值(如手机号)可被字典碰撞反推。
保真写回
| 项 | 处理 |
|---|---|
| 编码 | 自动探测 UTF-8 / GBK / latin-1,按原编码写回 |
| BOM | 原有则保留、原无则不加(不引入多余 BOM) |
| 换行符 | 原样保留,LF 不被改写成 CRLF |
| 分隔符 | CSV 自动嗅探 , / TAB / ; / | 并原样写回 |
| 原文件 | 默认不动;--inplace 覆盖前先写 .bak 备份 |
Agent 执行要求
- 先试运行:任何写入前,先跑
--dry-run并把命中统计与样例给用户确认, 避免误伤(例如把订单号当作手机号遮掉)。 - 只读优先:用户没明确要求覆盖时,一律用
--out输出副本,不动原文件。 - 不臆断:
--columns指定的列名若不存在于表头,工具不会报错也不会默默改别的列—— Agent 应核对实际表头后重试,不得猜列名。 - 脱敏≠加密:向用户说明本工具降低的是"可直接阅读"的风险,不提供加密与访问控制; 高敏感数据仍需配合权限管理与传输加密。
- 盐值提示:使用
hash模式时提醒用户妥善保管盐值,不要把盐值一起对外提供。 - 结果复核:写盘后应抽查输出文件,确认敏感值确已遮蔽、非敏感值未被误改。
输出模板
## 数据脱敏结果
- 模式:partial(保留头 3 尾 4) 范围:自动识别 手机号/身份证/银行卡/邮箱/IPv4
- 共脱敏 14 处
| 类型 | 处数 |
|---|---|
| 手机号 | 4 |
| 邮箱 | 4 |
| 身份证 | 3 |
| IPv4 | 2 |
| 银行卡 | 1 |
### 替换样例
- 手机号:13800138000 → 138****8000
- 身份证:11010519900307891X → 110***********891X
- 邮箱:zhang@example.com → zha**********.com
(输出:out/masked/cust.csv、out/masked/app.log 原文件未改动)
注意事项
- 禁止在未备份的情况下就地覆盖;
--inplace会自动生成.bak,仍建议先试运行。 - 不处理二进制格式(.xlsx/.docx/.pdf),需先转为 CSV 或文本。
- 不读取与目标无关的目录,不扫描用户主目录。
- 不实现加密、水印、访问审计;不保证覆盖所有可能的敏感形态(如护照号、车牌、 自定义工号),特殊格式需用户提供正则或改用文本提取工具自行处理。
- 全程离线运行,脱敏结果不写入任何远端服务。
Scan to join WeChat group