浏览器本地加密怎么核对明文没有离开本机

「浏览器本地加密」值不值得信,不看页面口号,看这一次操作发出了哪些请求。用一枚只在这次实验出现的金丝雀字符串去搜 Network:请求行、请求体和分析上报里都不该出现明文、口令或井号后面的密钥。AES-256-GCM 应在本机 Web Crypto 算完,才允许密文出站。

先记结论:本地加密能当场核对的部分,是「这一次 HTTP 有没有把明文、口令或 fragment 密钥当业务数据发出去」。它证明不了扩展没读剪贴板,也证明不了下个版本行为不变。下面给出可重复的步骤,而不是新的形容词。

一句话先回答搜索意图

浏览器本地加密,指加解密发生在你正在看的这个标签页里:脚本调用浏览器提供的 Web Crypto API,用 AES-GCM 一类算法在本机完成加密,明文和密钥默认不作为 HTTP 正文离开浏览器。核对方法不是读营销句,而是打开开发者工具的 Network,用金丝雀搜索,再必要时断网复测。

这篇文章给开发者、运维,以及要把文件或口令交给「在线工具」之前想自己看一眼的人。它不代替 文件加密盒 的操作说明,也不重复首页的产品定义。你要带走的是一套换任何站点都能再用的检查。

口号无法自证,流量可以观察

很多页面会写本地计算、零上传、端到端。这些词可以印在真正本机算完的工具上,也可以印在「先 POST 原文,再由服务器代加密」的上传页上。句子本身没有校验位。

你能当场看到的,是当前标签页发出的方法、地址、查询串和请求体。Chrome 的 Network 面板会把它们列出来。如果你刚选中的文件名、刚输入的口令,或一段只有你知道的实验原文出现在这些位置,所谓本地加密在这一次操作里就不成立。

反过来,面板里没有明文,只能说明你观察到的这些请求没有带走这些字段。它不能说明内存里没有明文,也不能说明浏览器扩展没有读取输入框。把宣传收成一次可重复的观察,价值已经够用:你可以对同事说「我搜过金丝雀,请求行和 body 是干净的」,而不是转发一句官网文案。

不要用真实密钥、证件号或未脱敏表格做实验。准备一个可以丢弃的小文件,口令用一次性长句。核对的是流量,不是把隐私再暴露一遍。

「本地」具体指哪一层计算

「浏览器本地」不是「这个域名看起来很安全」,而是「密码学运算发生在当前文档的脚本环境里」。对 AES-256-GCM 来说,常见的正确路径是 crypto.subtle.encrypt:密钥派生、加密和认证标签都走浏览器自带的接口。MDN 写明,SubtleCrypto.encrypt 只在安全上下文可用,生产环境就是 HTTPS;HTTP 普通页上 crypto.subtle 往往是 undefined

AES-GCM 被选中,不是因为名字好听。它是带完整性校验的认证加密:密文被改过,或用错密钥,解密会失败,而不是吐出一段「看起来像乱码的错误明文」。算法参数里,IV 常用 12 字节(96 位),这与 NIST SP 800-38D 对 GCM 的推荐一致;每次加密都应换新的随机 IV,相同明文才会得到不同密文。

文件场景可以写成更具体的动作:你用文件选择器选出本机文件,脚本按块读进内存,逐块加密,再触发浏览器下载密文。下载到的 .lock.enc 是本机生成的结果文件,不是服务器回执。单文件上限如果写成 5 GB,描述的是浏览器里流式处理的能力,并不表示远端收了 5 GB 原文。

还要把「业务上传」和「页面自己会发出的请求」分开。打开即用的工具站仍会加载样式、脚本和字体,也可能发送不含正文的访问统计。这些请求的存在,不能用来指控「文件被上传了」。可是统计请求的 query 或 body 里如果出现了你刚输入的口令、待测密码或清洗前原文,那就是另一回事。

FastPwd 把这条边界写成可核对的句子:密码生成、密码检测、隐私清洗和文件加解密的明文与密钥默认不离开浏览器;阅后即焚只允许密文出站,解密密钥放在 URL 的 # 片段。文件加密盒按 1 MB 分块、用 PBKDF2(100000 次、SHA-256)从口令派生 AES-256 密钥,输出 .lock / .enc。全部工具打开即用,没有账号和密码库。承诺仍然只是承诺。下面用 Network 把它收成检查项。

用 Network 做一次金丝雀检查

先准备一枚不会出现在真实业务里的标记。文件名可以用 canary-fp-20260825.bin,口令用一段随机长句,正文里写一句只有这次实验才有的话。金丝雀的作用是搜索:在 Network 的过滤器里粘贴它,命中即失败。

打开开发者工具,切到 Network,勾选 Preserve log,过滤范围先用 All,不要一上来只留 XHR。被取消或返回 4xx 的请求同样可能已经带上了明文。然后做一次完整操作:选文件、输入口令、点加密或生成。结束后先不要关面板。

  1. 在过滤器里粘贴金丝雀字符串。有红色命中就停下来读那条请求,不必再做「感觉上像本地」的判断。
  2. 没有命中时,再逐条打开 Fetch / XHR,对照请求行、查询串和请求体。样式、字体和脚本可以忽略。
  3. 单独过滤访问统计路径,打开 query 与 body。页面标题和路径可以出现;刚输入的口令、待测密码、清洗前原文和文件内容不应出现。

看请求行

完整 URL 里的 path 和问号后面的查询值得逐字看。id 这类定位字段可以出现;文件名、口令、待测密码、井号后面的密钥不应该出现。把地址栏整串和请求行对比:井号之后的部分如果进了请求行,说明实现把 fragment 错用成了 query,或脚本主动读出后写进了请求。

看请求体

POST / PUT 的 payload 是第二处。文件加密如果声称本地完成,请求体里不该有原文件二进制,也不该有口令。阅后即焚可以有密文字段,那是预期出站的数据;你要确认它看起来不像你刚输入的原文。密码检测页如果把待测密码 POST 出去,无论目的写成「查泄露」还是「算强度」,都已经离开了本机。

单独看分析上报

访问统计经常被忽略。主接口干净、上报却带着输入框全文,这次操作仍不能算「明文留在浏览器」。过滤统计路径时,不要假设「分析脚本一定无害」——它只是另一类出站请求,检查方式与业务接口相同。FastPwd 的访问统计走站点自己的 tracker,localhost 默认不发送;即便如此,你仍应用金丝雀确认上报里没有口令或文件内容。

勾选 Preserve log。加密完成后如果页面跳转或刷新,未勾选时第一条带明文的请求可能已经被清掉,你会得到虚假的「面板是空的」。

断网复测:静态资源不等于业务上传

第二项对照很便宜。先让页面完整加载,再在 Network 里打开 Offline,或直接关掉系统网络,然后加密那个可丢弃的小文件。如果下载 .lock 仍然完成,说明这一次加解密不依赖实时接口。这是「浏览器本地加密」的强信号,但不是唯一信号。

假失败也很常见:字体或分析脚本在 Offline 下报红,并不等于加密失败。你要看的是加密按钮之后有没有新的业务 POST,以及结果文件是否已经出现在下载目录。假通过同样存在:脚本可以先把明文写进队列,等你重新联网再发送。所以断网要通过,联网时还是要做金丝雀搜索。

问号会进 HTTP,井号默认不会

URL 有两段常被混在一起。问号后面的查询会进入 HTTP 请求行,服务器、反向代理和访问日志都能看见。井号后面的片段默认由浏览器留在本地,用来给当前页的脚本读。HTTP 请求目标不包含 fragment,这是 RFC 9110 对请求目标的约定,也是 URL.hash 只存在于浏览器侧的原因。

因此,一次性密文链接如果把密钥放进 #,接收方打开 s.html?id={id}#{key} 时,服务器按设计只能看到 id,看不到密钥。这不是额外的加密协议,而是浏览器对 fragment 的默认行为。它有边界:你把完整地址贴进工单、群聊或某些会丢掉 hash 的预览卡片,密钥就从「不进 HTTP」变成「出现在别人的屏幕和日志里」。

核对方法同样具体:在 阅后即焚 创建一条无害测试文本,看创建请求的 body 是否只有密文;打开阅读页时,看文档请求和后续接口的 URL 是否只含 id。地址栏里 # 后面的内容不应出现在这些请求里。阅读页对接收方公开,不需要登录。

看哪里 会不会进 HTTP 怎样算通过
页面口号 不涉及 不能当证据,只作对照
请求行 / query 无金丝雀、无口令、无 fragment 密钥
POST body 无原文;焚链只允许密文
URL # 片段 默认不会 地址栏有、请求行没有
访问统计 看实现 无输入框原文
Offline 后加密 无新业务请求 仍能下载密文;联网后再搜金丝雀

你能证明什么,不能证明什么

这次检查能支持的结论很窄,写清楚反而更有用。

能支持:在你使用的这个浏览器、这个版本、这一次操作里,明文、口令和 fragment 密钥没有作为已观察到的 HTTP 业务数据或分析原文离开标签页。

不能支持:没有别的标签页或扩展在读剪贴板;硬盘上的下载目录是安全的;对方收到密文后不会截图;密码检测覆盖了全网泄露库。如果检测只做本地熵和一份公开弱口令 Top 列表,它只能回答「像不像常见弱口令」,不能回答「从未出现在某次泄露中」。那不是全网 HIBP 撞库。

也不要把它理解成渗透测试。你没有检查 WebSocket、Service Worker 缓存,也没有逆向混淆脚本。目标是让自己能向同事解释:我打开了 Network,用金丝雀搜过,请求行和 body 是干净的。这比转发一句「官网说不上传」更接近工程讨论。

常见问题

断网后还能加密,就能证明没有上传吗?

只能证明这一次加解密不依赖实时接口。页面已经缓存的脚本,仍可能在你恢复联网后补发请求。所以断网要通过,联网时还要用同一枚金丝雀再搜一遍 Network。两步都过,结论才站得住。

Network 面板是空的,等于这次操作安全吗?

不等于。过滤条件只留 Img、没勾选 Preserve log,或请求在跳转时被清掉,都会造成假空白。先把过滤器改成 All,再搜金丝雀,并单独打开分析上报。空面板是观察失败,不是安全证明。

阅后即焚把密文放到服务器,还算浏览器本地加密吗?

算「明文在本机算完再出站」。服务器只应看到密文和定位用的 id;解密密钥放在链接的井号后面,默认不进 HTTP。创建和阅读都不需要账号。你要核对的是 body 里是不是原文,以及请求行里有没有 # 后面的密钥。

密码检测会把待测密码送到全网泄露库吗?

FastPwd 的 密码检测 在本机算强度,并对照内置公开弱口令名单。待测密码不上传。它能抓住常见弱密码,但不能证明「全网没见过」,也不是 Have I Been Pwned 式撞库。把待测密码当作金丝雀搜 Network,就能核对这一条。

把同一套步骤用在打开即用的工具上

若你希望用一个把计算边界写清楚的页面来练习,可以从 FastPwd 的文件加密盒开始。打开即可使用,无需注册。选一个不含真实隐私的小文件,口令用金丝雀,加密后下载 .lock。同时盯着 Network:你应看到静态资源和可能的访问统计,不应看到原文件或口令作为业务字段。算法是 AES-256-GCM,在 Web Crypto 里算,单文件不超过 5 GB。

阅后即焚适合练第二项:创建一条无害测试文本,确认出站的是密文;阅读页对接收方公开,链接形态是 s.html?id={id}#{key}隐私清洗 适合练「原文会不会进统计」——链接和待脱敏文本按产品说明留在浏览器,清洗结果仍由你判断是否够用。

这些练习的目的不是证明某一个站点「绝对安全」,而是让你把同一套核对步骤用熟。换任何声称本地加密的页面,步骤不变:金丝雀、Preserve log、请求行、请求体、统计上报,必要时再加一次 Offline。

下次核对时记住三件事。第一,看流量,不看口号。第二,密文出站可以接受,密钥和原文不行。第三,换浏览器、换版本、换功能后重新做一遍金丝雀搜索。能重复的观察,才值得写进你们自己的安全说明。