个人信息脱敏审查(privacy-audit)
用途
对本地技能包、代码库、数据目录执行个人信息脱敏合规审查,产出分级问题清单与标准审查报告。基于中国法域:《个人信息保护法》(主席令第91号)、《数据安全法》、《网络安全法》(2025修正)、GB/T 35273-2020、GB/T 45574-2025(2025-11-01 实施)、GB/T 43697-2024、《个人信息保护合规审计管理办法》(2025-05-01 施行)等。审查从严:凡无明确依据允许的处理一律按"不得"执行。
适用场景:AI 技能/代码/文档发布前安全检查、数据集对外分享前脱敏核验、日志与配置泄露排查、合规审计报告产出。 定位区分:本技能是"审查/审计"(发现 + 分级 + 整改建议 + 依据索引),不是"脱敏执行器"。需要直接掩码/替换数据的场景请使用脱敏工具类技能;本技能负责在事前判定"该不该发、哪里违规、依据哪条法规"。 商业化定位(v1.2.0):面向"AI 技能/应用发布前合规自查"场景,支持扣子等对话式平台使用(用户上传附件/粘贴文本即可扫描,无需本地目录),可作为付费技能上架。
触发词
- 脱敏审查 / 隐私审查 / 隐私合规检查 / 合规审查 / 隐私保护审计 / privacy audit / desensitization audit
- 敏感信息扫描 / PII 扫描 / PII scan / 敏感字段检测 / 个人信息扫描 / 数据泄露排查
- 扫描这个目录有没有个人信息 / 扫描这个技能有没有个人信息
- 身份证号扫描 / 检查代码里有没有手机号 / 代码里有没有身份证号 / 银行卡号泄露检查
- 仓库里有没有硬编码密钥 / 日志里有没有明文密码 / 上传文件有没有敏感信息
- 这个技能有没有泄露隐私 / 这个技能能不能发布 / 分享前要不要脱敏 / 数据集脱敏核查
- 脱敏整改建议 / 出一份合规审查报告 / 发布前安全检查 / 上架前合规审查
环境准备
# 依赖:Python 3.8+,纯标准库,无第三方依赖
export SKILL_DIR=~/.workbuddy/skills/privacy-audit # 技能安装路径
export TARGET_DIR=/path/to/待审查目录 # 待审查目录(代码/技能/数据)
export REPORT_DIR=/path/to/报告输出目录 # 建议在扫描目录之外,避免自我命中
执行流程
第一步:L1 自动扫描(先机器,后人工)
# 单目录扫描 + JSON 报告
python3 "$SKILL_DIR/scripts/privacy_audit.py" "$TARGET_DIR" \
--rules "$SKILL_DIR/scripts/字段检测正则库.json" \
--json "$REPORT_DIR/audit_result.json"
# v1.1.0 批量目录扫描(多个目录合并审计)+ HTML 可视化报告
python3 "$SKILL_DIR/scripts/privacy_audit.py" "$TARGET_DIR_A" "$TARGET_DIR_B" \
--rules "$SKILL_DIR/scripts/字段检测正则库.json" \
--json "$REPORT_DIR/audit_result.json" \
--html "$REPORT_DIR/audit_result.html"
- 扫描 17 类敏感字段:身份证号 / 手机号 / 银行卡号 / 邮箱 / IP / 精确地址 / 精确定位坐标 / 医师署名 / 医院机构名 / 密码明文 / 医疗健康信息 / 未成年人信息 / 车牌号 / 护照号 / 微信号 / QQ 号 / 统一社会信用代码(v1.1.0 新增)
- 检测 5 类硬编码凭证:SkillHub key / GitHub token / OpenAI key / 腾讯云 SecretId / COS 临时凭证
- 退出码(可接入 CI 门禁):
0=通过;1=高危命中(禁止发布);2=中敏感命中(需人工确认) --json:结构化报告(含 scanned_roots/summary/verdict/findings,CI 可消费);--html:自包含可视化报告(总览卡片 + 分级分布图 + 按文件分组命中清单,离线可看)--strict:一般级别命中也判失败;--quiet:仅输出结果行
对话式扫描(v1.2.0 新增,适配扣子等对话场景,无需本地目录):
# 单文件扫描(用户上传的附件,如 .py/.md/.json/.txt 等文本文件)
python3 "$SKILL_DIR/scripts/privacy_audit.py" --file /path/to/uploaded.py \
--rules "$SKILL_DIR/scripts/字段检测正则库.json" \
--json "$REPORT_DIR/audit_result.json"
# 文本内容扫描(用户粘贴的代码/文本片段)
python3 "$SKILL_DIR/scripts/privacy_audit.py" --text "待审文本内容" \
--rules "$SKILL_DIR/scripts/字段检测正则库.json"
# 标准输入扫描(管道传入)
echo "待审文本" | python3 "$SKILL_DIR/scripts/privacy_audit.py" --stdin \
--rules "$SKILL_DIR/scripts/字段检测正则库.json"
第二步:L2 完整审查(六维度人工对照)
以 references/个人信息脱敏审查规范.md 为执行依据,逐维度对照:
- 识别与分类:字段清单是否完整、敏感级别标注、组合重标识风险、未成年人特别标注
- 脱敏方式与场景:去标识化/匿名化选择是否与敏感度匹配(不可逆优先;可逆必须密钥管控)
- 字段级脱敏:逐字段核对存储/展示/传输/共享四环节(重点:身份证/银行卡必须加密存储;界面默认掩码;日志不得留明文)
- 流程与检查清单:33 项清单逐项勾选(A 前置识别 5 项 / B 存储 6 项 / C 展示 6 项 / D 日志 4 项 / E 共享 5 项 / F 测试 2 项 / G 技术保障 6 项)
- 违规场景排查:15 项高频违规场景逐项排查(明文存储、界面未掩码、超范围收集、自动勾选同意、强制人脸、日志明文、泄露未通知、开盒买卖、跨境未评估等)
- 合规依据核验:法规名称/文号/日期与国标编号以规范第六部分为准,不得改动
第三步:整改与验证
- 高风险(P0)必须修复:移除硬编码凭证 → 环境变量/密钥管理;明文敏感数据 → 加密存储 + 掩码展示
- 修复后重跑 L1 扫描,确认退出码降为 0(或仅剩低风险)
- 中风险(P1)建议下轮迭代修复;低风险(P2)记录后续优化
第四步:输出标准报告
以 references/审查报告模板.md 为结构生成报告:审查对象与数据画像 → 结果总览 → 分级问题清单(P0/P1/P2)→ 合规项核验 → 整改优先级 → 检查清单对照表 → 结论与免责声明。
依赖清单
- Python 3.8+(标准库:argparse / json / os / re / sys)
- 无第三方依赖;可选
--json输出结构化报告供 CI 消费
边界与安全(红线)
- 不构成法律意见:报告结论必须结合具体业务场景,高敏感场景建议人工复核 + 咨询合规律师
- 报告输出到扫描目录之外:避免审计报告被二次扫描命中,也避免报告落进待发布产物
- 全程本地:不调用任何云 API,不传输待审内容
- 二进制跳过:.zip/.png/.pdf/.docx/.xlsx/.pyc 等不扫描内容(如需扫描先解压/转文本)
- 禁止删除:本技能只报告,不删除、不修改任何被审文件
踩坑内嵌(经验教训,勿重蹈)
| 坑 | 根因 | 方案(已内建于脚本) |
|---|---|---|
| 坐标常量/随机长数字串被误报为身份证/银行卡 | 纯正则只匹配"形状"不校验"合法性" | 身份证 MOD 11-2 校验码验证、银行卡 Luhn 校验,校验不过即误报跳过 |
| 身份证内部数字被手机号/银行卡正则二次命中 | 正则优先级冲突 | 区间去重:命中区间完全落在更高优先级命中内 → 跳过(如 110101 开头 6 位不会误报手机号) |
| 长数字串(如 0.00669342162296594323 坐标常量)子串命中手机号 | 手机号正则无边界 | 手机号正则加前后数字边界 (?<![0-9])…(?![0-9]) |
| 审计报告写进扫描目录被二次命中 | 报告本身含"命中样例" | 报告输出到扫描目录之外(--json 指向外部目录) |
| Windows 下中文文件编码乱码 | 文件可能是 GBK 而非 UTF-8 | read_text 先试 UTF-8,失败按可打印字符比例兜底解码 |
| node_modules/.git 等大目录拖慢扫描 | 无过滤全扫 | 内置 SKIP_DIRS(.git/pycache/node_modules/.venv/dist/build 等) |
| 正则库 JSON 新增字段后脚本行为不一致 | 正则库与脚本分离导致失同步 | 正则库 JSON 是唯一事实源,脚本动态加载;新增字段类型先改 JSON 再跑脚本 |
| 正则库 JSON 中的 pattern 定义文本被自身命中(如"人民医院"字样出现在医院名正则里) | 规则定义本身就是敏感词样本 | 属正常现象,自审出现该命中时人工确认为 pattern 定义后忽略即可(保守方向,宁可 REVIEW 不漏报) |
| "北京市A12345"地名+数字被误报车牌号 | 车牌正则无边界,子串"京A12345"命中 | 车牌正则加前后汉字/字母数字边界 (?<!…)(?<![\u4e00-\u9fa5])…(?![…]),结构校验器(省+字母+长度7/8)双保险 |
| 随机 18 位数字串有约 1/31 概率通过统一社会信用代码 GB 32100 校验 | 模 31 校验对随机串天然放行概率 | USCC 定位"中敏感"(REVIEW 需人工确认)而非高敏感,正是为此留的兜底;负控制测试用真实非法末位 |
| 测试样例标签自命中(如"伪微信号: xxx"被微信号正则命中) | 标签本身含触发前缀+合法格式 | 属正确行为(真实场景"微信号: xxx"就该命中);测试样例设计时避免在标签中复现触发前缀 |
evals/ 用例含虚构敏感样本导致 preflight --strict 报 phone/email 告警 | 测试用例必须有真实形态的样本才能测出检测能力,而发布门禁的敏感扫描不区分真假 | 发布自检时用 --waive phone --waive email --reason "evals 用例含虚构测试样本,非真实个人信息" 豁免并落盘留痕;.preflight-waiver.json 发布前删除;样本文件首行统一标注「虚构测试数据」 |
| 随机 18 位数字串(如时间戳+序号)约 1/11 概率通过身份证 MOD 11-2 校验被误报 | 校验码只保证合法性不保证真实性,随机串天然有放行概率 | 属已知局限:人工确认为序号/时间戳/流水号后忽略;不要为此放宽正则(宁可 REVIEW 不漏报) |
使用示例(对话模拟)
用户:帮我审查一下 ~/projects/skill-demo 这个目录,能不能发布?
Agent:
1. 运行 L1 扫描:
python3 ~/.workbuddy/skills/privacy-audit/scripts/privacy_audit.py ~/projects/skill-demo \
--rules ~/.workbuddy/skills/privacy-audit/scripts/字段检测正则库.json --json ~/reports/demo_audit.json
2. 退出码 1 → 命中 2 处高危(GitHub token 硬编码 + 身份证明文)→ 判定禁止发布
3. 对照《审查规范》做 L2 六维度核对:存储未加密、展示未掩码、日志含明文…
4. 输出分级问题清单(H-1 硬编码 token / H-2 身份证明文存储 / M-1 日志明文…)
5. 整改建议 + 标准报告 → 用户修复后重跑 L1 → 退出码 0 → 允许发布
参考文档
references/个人信息脱敏审查规范.md:完整六维度规范(L1/L2 分层、33 项清单、15 项违规场景、18 部法规 + 6 项国标索引、附录工具说明)——审查执行的唯一事实依据references/个人信息脱敏审查要点.md:六维度要点(法规背景与判断维度详解;来源档位 官方 = 法律法规与国标,社区共识 = 公开执法/司法典型案例与行业实务)references/审查报告模板.md:L2 标准报告结构模板references/Changelog.md:版本史唯一事实源(1.0.0 → 当前版本的完整变更记录与版本口径说明)evals/:回归评测集(10 条可执行用例 +trigger_eval.json触发词意图集),改动本技能后跑一次验证没把既有能力改坏,跑法见evals/README.md
版本与事实源
- 当前版本号以 SKILL.md frontmatter 的
version为准;发布 tag、README 版本摘要、references/Changelog.md的当前版本条目全部与之对齐。 - 历史变更以
references/Changelog.md为唯一事实源。SKILL.md 与 README 里的 Changelog 都只是最近两版的摘要 + 指向该文件的链接,不要在各处各记一套完整版本史——三处全量并列必然漂移。 - 正文里的
v1.1.0 新增/v1.2.0 新增是功能归属标注:标注该功能首次出现在哪个版本,属历史记录,不随当前版本号改动(当前版本已是 1.3.0,标注仍保留原样)。 scripts/字段检测正则库.json里的"version": "1.1.0"是规则库版本:独立于技能版本,只在字段类型/正则/校验器实际变更时才递增。1.2.0 只改了扫描入口(--file/--text/--stdin)未改规则,故规则库仍为 1.1.0 —— 这是正确状态,不是笔误,不要"顺手对齐"。
Changelog
完整版本史见
references/Changelog.md(唯一事实源),下表为最近两版摘要。
| 日期 | 版本 | 变更类型 | 变更内容 | 来源 |
|---|---|---|---|---|
| 2026-09-06 | 1.3.1 | 优化 | 新增站内标签(隐私保护/脱敏/PII/个人信息保护等 6 项),功能无变化 | SkillHub 端优化 |
| 2026-08-29 | 1.3.0 | 优化 | 触发词覆盖率 58% → 100%(新增 evals/trigger_eval.json 意图集 16 条 + 触发词簇扩至 30 条);description 由 444 字符收敛至 238 字符,细节下沉正文;新增 evals/ 可执行评测用例集 10 条(--run --aggregate 均分 1.00);新增 references/Changelog.md;确立版本与版本史两处事实源口径 | 体检报告整改 |
| 2026-08-19 | 1.2.0 | 新增 | 脚本新增 --text/--stdin/--file 单文件/文本扫描入口(适配扣子对话式输入,无需本地目录);定位收敛为"发布前合规门禁";新增商业化定位说明 | 扣子上架改造 |
(1.1.0 及更早条目见 references/Changelog.md)
免责声明
本技能由 AI 辅助生成,仅供参考,不构成正式法律意见,不能替代具有执业资格的律师。具体合规判断应结合业务场景咨询专业法律人员,并以最新生效法律法规为准。