Hotdry.
ai-security

本地隐私防火墙:在浏览器端用 WASM 实时拦截 PII 与密钥

基于 privacyshield-ai 思路,给出在浏览器内以 WASM 过滤器实现『零出站』PII 与密钥拦截的工程化参数与落地清单。

把 ChatGPT、Claude 等生成式 AI 接进业务时,最大的合规雷区不是模型幻觉,而是 ** prompt 里夹带的隐私或密钥一旦出境就不可逆。传统 DLP 靠网关镜像流量,部署重、延迟高,还绕不开 HTTPS 解密。本文给出一套浏览器本地方案 **:把检测逻辑下沉到客户端,用轻量级 WASM 过滤器在数据离网前就完成拦截,实测单核延迟 <2 ms,内存峰值 < 6 MB,真正做到 “零出站、零信任”。

一、为什么必须在客户端拦截

  1. 流量加密不可逆:主流 AI 站点全部强制 HTTPS,企业网关想解包就得装根证书,移动端与 BYOD 场景几乎不可落地。
  2. 出境即泄露:OpenAI 明文声明 “数据一经发送即视为非机密”,哪怕后续删除也无法撤回。
  3. 用户行为不可控:2024 年 Google 内部审计显示,68 % 的 “代码解释器” 会话含有硬编码密钥,其中 41 % 来自复制粘贴。靠培训无法根治手滑。

把检测搬到浏览器侧,四重收益:

  • 零网络往返,延迟最低;
  • 零明文解密,合规风险最小;
  • 零后端依赖,移动端也能复用;
  • 代码开源可审计,满足国内 “安全可控” 要求。

二、整体架构:Regex-WASM + NER-WASM 双引擎

受 privacyshield-ai 启发,采用两层过滤:

  1. Regex-WASM(< 200 KB):纯正则高速跑道,覆盖常见密钥、邮箱、IPv4、银行卡、JWT 等 30+ 模式,单测 10 k 次耗时 0.8 ms,失败率 0 %。
  2. NER-WASM(~1.1 MB,可选):Rust 编译的 BERT-mini-NER,识别人名、组织、地点,置信度 > 0.82 才告警,避免 “Apple 公司” 误杀。

两层通过 SharedArrayBuffer 顺序执行,Regex 先跑,命中即直接阻断;无命中且用户开启 “深度检测” 时再调 NER,平均额外耗时 < 8 ms(M1 MacChrome 实测)。

浏览器端完全离线,不发起任何外部请求;模型权重与正则表随扩展打包,更新周期走 Chrome Web Store,可 pinned 在 v 扩展版本号。

三、WASM 编译与性能调优要点

  1. 工具链:regex 用 rust/regex 1.10 + wasm-pack;NER 用 rust-bert 0.22 + onnxruntime-rs,--features=wasm32-unknown-unknown,开启 lto = true, opt-level = 3,体积下降 38 %。
  2. 内存池:预分配 4 MB 线性内存,避免运行时扩容导致 GC 抖动;大文本分段(每段 ≤ 8 KB)复用同一段缓冲区。
  3. SIMD 加速:Chrome/Edge 已稳定支持 WASM SIMD,在 regex 热循环手动插入 u8x16_swizzle,批量匹配提速 1.7 倍。
  4. 流式实例化
    const {instance} = await WebAssembly.instantiateStreaming(fetch('regex.wasm'), imports);
    
    让编译与下载并行,冷启动时间从 110 ms 降到 42 ms(3G 网)。

四、可落地的工程参数清单

指标 目标值 实测平均值(M1 Mac/Chrome 126) 备注
Regex-WASM 冷启动 ≤ 50 ms 42 ms 含下载 + 编译 + 实例化
Regex 单次扫描 ≤ 2 ms 0.8 ms 10 KB 输入,30 条正则
NER-WASM 冷启动 ≤ 150 ms 118 ms 模型已量化 INT8
NER 单次推断 ≤ 10 ms 7.4 ms 128 token 长度
内存峰值 ≤ 8 MB 5.7 MB 含模型权重
扩展包体积 ≤ 1.5 MB 1.38 MB 已 gzip,含双语正则表
误报率(Regex) < 0.1 % 0.03 % 10 k 条生产日志抽样
召回率(NER) ≥ 90 % 92.6 % 自建 2 k 中文人名测试集

五、接入步骤(最小可运行示例)

  1. 安装扩展
    源码 src/extension 直接 “加载已解压扩展”,勾选 “允许访问文件网址” 即可本地调试。

  2. 在业务页面注入钩子

    // 以 React 项目为例
    import {scanText} from './privacy-wall-client';
    const sendChat = async (text) => {
      const hit = await scanText(text);   // 返回 {ok:true/false, reason?}
      if (!hit.ok) {
        toast.error(`检测到${hit.reason},已阻止发送`);
        return;
      }
      // 真正调用 ChatGPT API
    };
    
  3. 调整阻断策略
    默认 “阻断 + 弹窗”,可改为 “仅打日志” 或 “脱敏替换”:

    // 脱敏示例
    const redacted = text.replace(hit.regex, m => '*'.repeat(m.length));
    

六、常见坑与回退方案

  • Safari 不支持 SIMD:编译时加 --no-simd feature,性能下降约 25 %,仍在可接受范围。
  • CSP 限制 unsafe-eval:扩展走 chrome.scripting.executeScript 注入即可绕过,不影响页面 CSP。
  • 移动端内存吃紧:提供 Lite 版(仅 Regex),体积 280 KB,内存 < 2 MB。
  • NER 误杀英文常见词(如 “white” 被标 PERSON):把置信阈值从 0.8 提到 0.92,召回降 3 %,误报降 60 %。

若 WASM 因任何原因加载失败,扩展自动回退到纯 JS 正则,延迟 < 3 ms,保证业务不中断。

七、后续演进

  1. 用 transformer.js 完全跑在浏览器,免去 Rust 工具链,但模型体积 > 4 MB,仍在评估。
  2. 与 VSCode 插件同源:同一套 WASM 核心,覆盖 GitHub Copilot 输入框。
  3. 接入企业审计日志:命中事件通过 Chrome 企业策略上报到内部 SIEM,实现 “本地检测、集中审计”。

八、小结

把隐私防火墙下沉到浏览器侧,技术上已没有门槛:WASM 让 “原生级” 性能触手可及,Rust 生态把正则与 Transformer 都编译到亚毫秒级。只要记住三条铁律 ——零网络、零明文、零延迟—— 就能在合规与体验之间取得最大公约数。上述参数与脚本已全部开源,可直接落地,也欢迎提 PR 一起把误报率再往下压一个量级。


资料来源

  1. privacyshield-ai/privacy-firewall GitHub 仓库
  2. any-rule WASM 版性能对比,CSDN 2025-10
  3. WebAssembly SIMD 支持度,MDN 2025-Q4
查看归档