OpenCode敏感信息过滤插件——Privacer

📅 2026/7/5 2:47:09
OpenCode敏感信息过滤插件——Privacer
PrivacerLLM 请求的实时隐私过滤插件一个问题今年年初我注意到一个现象身边越来越多的开发者在终端里使用 AI 编程助手与此同时他们也越来越多地在对话中粘贴包含敏感信息的内容。这不是个例因为我自己就在用AI开发项目时AI不小心把真实的服务器ip和密钥给混进代码里甚至传到了github上面哪怕用AI事前检测是否有泄露也没有检测出来因为AI把它当作示例给放过了。API Key、数据库连接串、JWT Token、SSH 私钥——这些本应留在本地的凭据正在被源源不断地发送到世界各地的 LLM 服务器。大多数情况下开发者并非疏忽而是没有意识到——他们只是想把问题描述清楚随手贴了一段配置没注意到里面夹着密码。等反应过来时数据已经离开了机器。为什么需要这个插件私滤引擎需要满足几个条件才能被开发者接受零配置——装完就能用不需要改系统代理或环境变量无感知——不影响正常使用只有敏感内容被替换低误报——不把普通变量名当作凭据传统方案在这几个维度上很难同时做到。HTTP 代理需要手动配置代理地址浏览器扩展只覆盖 Web 界面命令行工具需要在每个命令前手动调用。Privacer 选择了另一条路径以opencode 插件的形式嵌入到 AI 工具的请求链路中在消息离开进程之前完成过滤。开发者无需改变任何使用习惯。架构设计分层结构privacer-core (Rust) ↓ privacer-wasm (wasm-bindgen) ↓ opencode plugin (Node.js) ↓ experimental.chat.messages.transform (hook)核心引擎用 Rust 编写编译为 WebAssembly运行在 opencode 的插件沙箱中。整个过滤链路从输入到输出不经过网络纯本地完成。检测引擎引擎分为两条检测线正则匹配层覆盖了 27 种结构化敏感数据类型。从常见的 IP 地址、邮箱、手机号到开发中频繁出现的 API Key、JWT、SSH 密钥、数据库连接串再到区域性的身份证号中国和社会安全号美国以及 UUID、SHA 散列值等通用标识符。熵检测层作为补充。对于没有固定模式的随机凭据例如环境变量中的SECRET_KEYdGhpcyBpcyBhIHRlc3Qg...系统计算字符串的 Shannon 熵值超过阈值默认 5.0 bits/char则判定为高熵机密。两层的检测结果经过合并和重叠去重后生成最终的替换方案。预处理管线在检测之前输入会经过四道预处理NFKC 标准化将全角字符和 Unicode 异体字转为标准形式迭代 URL 解码处理单层或多层百分号编码%40→%2540→HTML 实体反转义还原#x40;、#64;等编码零宽字符剥离移除零宽空格、零宽连字等隐形 Unicode 字符这意味着攻击者无法通过简单的编码变换绕过检测。重叠处理当多条规则匹配到重叠区域时例如一段文本同时匹配邮箱模式和 UUID 模式系统按优先级排序完全包含的策略优先避免同一个内容被多次替换。信用卡号额外经过 Luhn 校验——只有通过校验的数字组合才被标记为高风险否则降为低置信度在过滤阶段被跳过。白名单以下值永远不会被过滤0.0.0.0、255.255.255.255RFC 1918 私有地址段10.x.x.x、172.16-31.x.x、192.168.x.xlocalhost、example.com、example.org、test.com这是一个保守的集合。开发者粘贴内网 IP 或示例域名时不应被误拦。实现细节为什么选择 Rust WASM核心引擎用 Rust 而非 JavaScript 实现出于几点考虑性能正则匹配和熵计算在 LLVM 编译后的原生代码中比 V8 JIT 有更稳定的性能表现可移植性WASM 作为中间格式可以在任何支持 WASM 的宿主中运行——目前是 opencode 插件未来可以扩展到其他平台依赖管理Rust 的fancy-regexcrate 提供了对零宽断言lookaround的完整支持这是 JavaScript 原生正则引擎所缺乏的能力为什么选择 opencode 插件作为首发平台opencode 提供了experimental.chat.messages.transform钩子在消息传入 LLM 之前暴露了完整的修改接口。这是一个标准化的插件 API不需要对框架做任何侵入性修改。相比之下VS Code 的扩展模型无法拦截 LM API 的网络请求AI 功能通过独立进程通信完全绕过了 Node.js 的扩展宿主而 Claude Code 的钩子机制目前还未开放插件分发渠道。安装与使用安装只需一条命令bashscripts/setup-opencode-plugin.sh该命令将插件和 WASM 引擎复制到 opencode 的全局插件目录。opencode 在启动时自动加载该目录中的所有插件无需修改配置文件。重启 opencode 后每个发给 LLM 的消息都会经过过滤。日志记录在.privacer/logs/中可以通过tail -f实时观察过滤情况[INFO] Plugin initializing [INFO] WASM loaded from ... [INFO] Redacted 3 sensitive item(s) from messages局限目前的实现主要针对 opencode 平台这是因为OpenCode配备了原生的支持使得我们的插件可以在AI拿到信息之前进行截断予以过滤后再传给AI。而很多VS Code、Cursor、Windsurf 等 IDE 由于 AI 请求走 ZeroMQ IPC 原生网络栈扩展层无法拦截。Trae 等国内 IDE 使用了类似的架构。这些平台的适配需要不同的方案因此也希望广大开发者可以参与到开发中来以期适配更多其他的平台。字符熵检测并非完美——高熵的普通文本例如长串随机 ID可能被误判为机密。阈值可以通过配置调整。结语Privacer 不是一个安全银弹。它是一个实用工具解决的是开发者日常中最常见的隐私泄露场景随手粘贴了不该粘贴的内容。在 AI 越来越深度介入开发流程的趋势下这个场景只会更频繁地出现。由于现在插件还存在一定的局限性本插件是基于linux下开发的如果其他系统有bug使用不了请及时反馈。也敬请各位大佬帮忙开发扩展更多的平台给大家使用目前暂只支持OpenCode感兴趣的可以访问我的仓库体验一下。如果你发现有什么问题欢迎向我反馈。项目地址github.com/lenychang520/Privacer