Privacer:LLM 请求的实时隐私过滤插件
一个问题
今年年初我注意到一个现象:身边越来越多的开发者在终端里使用 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_KEY=dGhpcyBpcyBhIHRlc3Qg...),系统计算字符串的 Shannon 熵值,超过阈值(默认 5.0 bits/char)则判定为高熵机密。
两层的检测结果经过合并和重叠去重后生成最终的替换方案。
预处理管线
在检测之前,输入会经过四道预处理:
- NFKC 标准化将全角字符和 Unicode 异体字转为标准形式
- 迭代 URL 解码处理单层或多层百分号编码(
%40→@,%2540→@) - HTML 实体反转义还原
@、@等编码 - 零宽字符剥离移除零宽空格、零宽连字等隐形 Unicode 字符
这意味着攻击者无法通过简单的编码变换绕过检测。
重叠处理
当多条规则匹配到重叠区域时(例如一段文本同时匹配邮箱模式和 UUID 模式),系统按优先级排序,完全包含的策略优先,避免同一个内容被多次替换。
信用卡号额外经过 Luhn 校验——只有通过校验的数字组合才被标记为高风险,否则降为低置信度,在过滤阶段被跳过。
白名单
以下值永远不会被过滤:
0.0.0.0、255.255.255.255- RFC 1918 私有地址段(
10.x.x.x、172.16-31.x.x、192.168.x.x) localhost、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