跳转到主内容
版本发布

42md 本地优先(5)本地脱敏 tools redact:敏感信息不出本机

把访谈稿、会议纪要发出去前,最怕漏了手机号、身份证、真名。42md tools redact 一条命令:先扫 PII,再按你的映射表确定性替换真名,替换后强制反查、有残留就不产出。全程纯本地、免费、绝不上云。这篇讲透三种模式与映射表写法。

7 分钟
产品发布脱敏隐私本地处理PII

要把一份访谈稿、会议纪要、病历摘要发出去之前,你得先过一遍:真名换了没?手机号、身份证、邮箱、银行卡有没有漏?人工核一遍又慢又容易漏。

42md tools redact 把这件事做成一条命令——而且全程在你自己的电脑上,绝不上云

一、为什么要有本地脱敏

脱敏这件事,天然不该联网。你要保护的恰恰是敏感信息,结果为了脱敏先把原文传上云,等于本末倒置。所以 redact 从第一行代码就定了调:

  • 纯本地:检测、替换、反查全在本机,零外部依赖,绝不上云。
  • 免费:不消耗任何 AI 配额。
  • 失败不产出:只要反查还有残留,就一个字都不写出——宁可报错,不给你一份「以为脱干净了」的半成品。

二、三种模式

redact 有三个模式,对应脱敏工作的三步:

1. 检测(--scan,默认)

先看看有什么。什么都不加就是检测模式,只报告、不修改:

42md tools redact 访谈稿.md
扫描 访谈稿.md:3 处命中
  L12 [phone] 138****0042
  L18 [id-card] 3301**********0033
  L23 [email] li****@example.com

检出即以退出码 2 结束——方便接到脚本里做「有敏感信息就拦下」的守门。默认检测手机号、身份证、邮箱、银行卡(--rules 可调,all 再加上网址)。要留意:真名、机构名这类语义实体,正则认不出、不在默认检测里,得靠你的映射表——所以完整流程通常是「先 scan 看有哪些 PII,再把真名和别名写进映射表,然后 apply」。给 scan 带上 --map,它会连同映射表里的真名一起检查、并标出还没覆盖到的高危项;但没有映射表的 scan 不会识别人名——人名、机构名始终得靠你写进映射表。

2. 替换(--apply --map <表>

真正做替换,需要给它一张映射表,告诉它「谁换成什么」:

42md tools redact 访谈稿.md --apply --map 化名表.md
✅ 脱敏完成 → 访谈稿_redacted.md(已反查零残留)
  张三: G0462
  138****0042: [已删除]

替换是确定性的——同一个名字每次都换成同一个代号,可追踪、可复原(你手里有表)。替换完 redact 会强制反查一遍,只要还有残留(多是映射表没覆盖的别名),就以退出码 3 结束、不产出文件

❌ 访谈稿.md 替换后仍有 2 处残留(多为 map 未覆盖的别名),不产出

产物默认写成 <原名>_redacted.<后缀>,用临时文件加原子改名写出,不会写出半截文件。

这里要分清两种「没覆盖」:上面那种替换后反查仍有残留(映射表里的真名没换干净)是硬错误——退出码 3、不产出;而正则检出、但你还没写进映射表的 PII(比如一个没登记的手机号)是软提醒——默认(--on-miss warn)按遮罩符(--mask,默认 [已删除])盖掉并提示你补表,文件照常产出。想更严,用 --on-miss fail 让它一遇到未覆盖就退出、不产出。

3. 反查(--verify --map <表>

如果你手上有一份「应该已经脱敏」的文件,想独立确认它真的干净:

42md tools redact 已脱敏稿.md --verify --map 化名表.md
✅ verify 通过:已脱敏稿.md 零残留

有残留就报 ❌ verify 失败、退出码 3。适合在发布前做最后一道关卡。

三、映射表怎么写

映射表就是一张 Markdown 表,左边真实信息(多个别名用 / 隔开)、中间脱敏代号:

## 人物
| 真实信息 | 脱敏代号 | 说明 |
|----------|----------|------|
| 张三 / 小张 / zhangsan@example.com | G0462 | 含所有别名 |
| 李四 / 老李 | G0463 | |

## 公众人物(保留真名)
- 阳志平(方法论创始人)

两个细节很实用:

  • 别名合并:一个人的大名、小名、邮箱写在同一行,统一换成一个代号,不会各换各的。
  • 保留名单:标题含「公众人物」或「保留真名」的段落,里面的名字会被跳过——检测不当它命中、替换不动它、反查不查它。方法论创始人、通用术语这类该留的真名,不会被误伤。

也支持等价的 YAML 形态(entries / keep / patterns),按内容自动识别。

四、退出码:接脚本很顺手

redact 的退出码是设计过的,方便串进流水线:

退出码含义
0干净
1I/O / 用法错误(读写失败、空输入)
2scan 检出 PII(或 --apply --on-miss=fail 命中未覆盖)
3apply / verify 有残留(不产出)
4映射表 / 规则文件错误

比如 git 提交前跑一遍 --scan,检出(退出码 2)就拦下提交;或在导出脚本里 --verify 把关,有残留就中止发布。

怎么开始

  • 先扫一遍看有什么:42md tools redact 稿子.md
  • 备好化名表后替换:42md tools redact 稿子.md --apply --map 化名表.md
  • 发布前反查:42md tools redact 稿子.md --verify --map 化名表.md

脱敏这一步,配上本地引擎命令行只在本地处理,就是一条敏感信息全程不出本机的链路。下一篇讲最后一块拼图——登录一次管 90 天


42md — 你的知识快刀。更快地获取、更深地编译、更好地策展、更强的工具。

官网https://42md.cc · 活水模型https://42model.com