一键开通华为云码道 CodeArts 代码智能体: https://developer.huaweicloud.com/codeartsco.html?source=dmzntgwatomgit1&sourcead=dmzntgwatomgithd
把排错日志、客户样本或测试数据发给同事之前,我希望能先做三件事:移除敏感片段,确认数据结构仍可用,再让收件方核对自己拿到的文件。这是隐墨的主要工作流程。
本文记录隐墨 v0.2.0 的产品设计、关键实现与工程验证。源码按 MIT 协议开放,便于直接运行和复现。
为什么选择在浏览器本地处理
调试资料需要尽量保留问题现场,却经常混有邮箱、手机号和访问凭据。如果直接把这些资料发送给在线处理服务,数据暴露面可能扩大。隐墨使用浏览器内的确定性规则,不上传文件,不调用云端模型,也不把原文写入浏览器持久存储。
用户可以导入 UTF-8 CSV、TSV、JSON 或日志,也可以粘贴文本。导入后默认展示脱敏预览,只有主动切换才显示敏感原文。文件、转换结果和代号映射只在当前页面内存中存在。
从遮盖字符串到保留数据结构
第一层是解析。CSV 必须理解双引号、逗号和单元格中的换行,不能简单按逗号切割。JSON 必须在解码后检测,否则\\u0040形式的邮箱分隔符可能绕过纯文本扫描。
解析器拒绝不等列、未闭合引号、重复 JSON 键和超过安全精度的整数。遇到不能可靠保留的数据,给出明确错误,避免静默覆盖字段或截断结果。
第二层是识别。规则覆盖大陆手机号和常见分组、常见邮箱、身份证结构/日期/校验码、Luhn 银行卡候选、IPv4、部分令牌格式、日志口令赋值,以及已知或自定义的敏感字段。校验码只能减少误报,不能证明号码真实。
第三层是转换。联调时可以选择部分遮盖,需要保持同一值关联时可以使用一致代号;对外分享可以切换到完全替换。访问凭据始终整段移除。疑似表格公式整格移除,不把一种转义方案宣称为适用于所有表格软件的安全保证。
两个必须用反例修复的问题
一个问题来自访问令牌长度。最初的正则对令牌设置最大长度,超长的合成令牌反而无法匹配,原文会留在输出中。修复后识别完整连续令牌,并加入不同长度的回归用例。
另一个问题是邮箱字段中的混合内容。字段名虽然是邮箱,内容仍可能附带一段凭据。如果直接保留@后的全部文字,遮盖会留下凭据尾部。现在先检查字段中的凭据,命中时整格移除;格式异常的邮箱字段也不再套用部分遮盖。
这两类问题说明,正常示例运行成功不足以证明转换可靠。测试需要检查实际输出中有没有留下不应保留的片段。
把复核做成可见的状态
每项命中都有待复核、已复核和明确保留的状态。用户可以逐项查看,也可以按当前页或类型批量确认。批量确认表示接受对应处理方式,不能代替对未命中内容的人工检查。
数据、保护字段或处理策略变化后,复核决定会重置。所有命中完成复核后,导出按钮才可使用;正式下载前还需要确认理解规则局限。保留的原文会被单独提示,公式候选不能保留。
风险和数据表均可分页,避免大量命中被截断在不可见列表之外。后台 Worker 支持取消,旧任务结果不能覆盖新任务。
导出报告与收件方核验
v2 报告只记录格式、计数、策略、规则版本、复核数量和输出文件的 SHA-256。报告不包含源文件名、原文、字段路径、命中位置或代号映射。
收件方在“核验报告”中选择数据文件与报告,工具会对实际字节重新计算摘要。浏览器测试验证了两种情况:原始下载文件匹配报告;追加内容后的文件显示不一致。不同换行或额外 BOM 也会改变实际字节,不能在核验前随意规范化。
报告没有数字签名。摘要相同只说明文件与给定报告一致,不能证明作者身份、报告真实性或数据已经完全匿名化。
如何复现
可运行包需要 Node.js 22.12 或更新版本。解压后运行启动入口,浏览器打开http://127.0.0.1:5178,载入客户联络示例即可体验。源码使用 React、Vite 和 TypeScript,按 MIT 协议提供。
npm ci npm run dev完整软件检查入口:
npm run verify:release检查会运行核心测试、类型检查、生产构建和真实浏览器工作流,并生成包含源码指纹的验收记录。公开源码:WeiRh/yinmo-local-redaction。
使用范围
文件上限为2 MB;最多10000条记录、200列、50000个文本单元、20000处命中和64层 JSON 嵌套。超限明确失败,预览分页不会导致导出被静默截断。
隐墨目前不处理图片、扫描件、PDF或Excel二进制文件,也不能覆盖所有凭据格式、语义场景和跨字段重识别。部分遮盖与一致代号仍可能被关联识别。最终分享前,使用者仍需检查处理结果和未命中的内容。
实际运行画面
码道开发记录
本次在华为云码道 CodeArts 的 WeiRh 账号中导入源码、检查解析与识别分层、运行 72 项核心测试,并将基础版本推送到公开 AtomGit 仓库。开发中发现云端 unzip 对中文文件名的解码存在差异,改用 Python zipfile 提取后核对仓库文件名。基础提交为95d0c7943303336538f183d665815b68ef2a9663。现有原型由 Codex 辅助构建,本次码道开发记录与实际源码提交对应。
v0.2.1:保护指定文字
随后在码道中完成了“保护指定文字”功能:最多 20 条普通文字规则,每条 1–100 个字符,适用于姓名、地址和业务代号,不执行用户正则。规则只在页面内存中存在;修改后重新分析并清空旧复核决定。字面量与邮箱、凭据命中重叠时合并保护区间,避免只遮住一部分而留下敏感尾部。
真实功能提交:6adf74a5a07be45cb67571eafae04f38714aa0fe。码道完成的发布检查包括 85 项核心测试、21 项浏览器工作流、类型检查和生产构建;同时修复了 320px 视口下报告核验对话框的文件选择框溢出。字面量保护仍不识别同义改写、Unicode 归一化差异或编码变体,使用者需要复核未命中的内容。