零知识架构:为什么服务器看不到你的文件
了解零知识架构如何确保即使服务提供商也无法访问您的文件。安全文件传输的终极隐私模型。
零知识架构意味着服务商在技术层面无法读取你的文件——加密密钥从不到达其服务器,也没有主密钥、后门或需要你"信任我们"的环节。你的浏览器在上传前使用本地生成的密钥以 AES-256-GCM 加密文件,该密钥只通过 URL 中 # 之后的片段传递给收件方,而浏览器从不将片段发送给服务器。即使收到有效的法院传票,服务商也只能提交密文。这是 Tresorit、Proton、SwissTransfer 和 HexaTransfer 共同采用的模型,它在数学意义上不同于"静态加密"。
最有力的证明:服务器能提交什么
测试零知识最直接的方法:如果被强制要求,公司能提交什么?在传统云存储(Google Drive、Dropbox、OneDrive)中,答案是:你的文件,以明文形式。Google 2023 年透明度报告显示,他们遵守了 83% 的美国政府数据请求,并在法律要求时提交了用户内容。这不是 Google 安全上的失误——这正是其架构的工作方式。
在零知识架构中,公司能提供的是:
- 加密文件块(没有密钥则毫无用处)
- 账户元数据(邮箱、注册 IP)
- 上传和下载的 IP 地址及时间戳
- 适用时的支付信息
他们无法提供文件名、内容、收件方身份或解密密钥——不是因为他们拒绝,而是因为他们根本就没有。
URL 片段技巧的精确原理
核心技术手段是将 URL 片段用作隐蔽的密钥传输通道。当浏览器请求 https://hexatransfer.com/d/xyz789#k=BASE64KEY 时,它只向服务器发送 GET /d/xyz789。片段留在浏览器的地址栏中。JavaScript 随后调用 window.location.hash 读取密钥,并将其传入 crypto.subtle.decrypt()。
这一方式最早由 Mega.nz 于 2013 年前后率先采用,并由 Firefox Send 进一步完善,直到 Mozilla 于 2020 年关停该服务。现在这一模式已成为行业标准。nginx 或 Caddy 的服务端访问日志永远不会捕获片段,因为 HTTP RFC 3986 将其定义为仅限客户端的内容。
服务商理论上可以通过客户端 JavaScript 记录片段,这正是零知识服务公开其客户端代码供检查、并通常以从独立源提供的已签名静态资源形式部署的原因。
与"静态加密"的本质区别
每家云服务商都对文件进行静态加密——这是基本门槛,通常也是 SOC 2 Type II 和 ISO 27001 认证的要求。但"服务商持有密钥的静态加密"对拿到损坏磁盘的攻击者无效,对你而言也是透明的,因为服务商会在请求时自动解密。
零知识颠覆了密钥保管模式:你持有密钥,服务商持有密文。服务商无法从解密中获得任何东西,因为它根本做不到。在三种具体威胁场景下,这一点至关重要:
- 内鬼员工。拥有数据库访问权限的员工看到的只是密文。
- 政府请求。中国《数据安全法》、GDPR 第 48 条、美国 CLOUD Act 等法规可以强制披露,但你无法披露你没有的东西。
- 服务器被入侵。2021 年 LastPass 事件暴露了加密的密码库;弱主密码的用户面临风险,但零知识设计阻止了大规模明文泄露。
什么被加密,什么属于元数据
粗糙的实现只加密文件内容,而将文件名、大小和文件夹结构留作明文。真正的零知识会同时加密文件名,通常做法是在 AES-GCM 加密前,将类似 {"name": "Q4-financials.pdf", "type": "application/pdf"} 的 JSON 头部附加到文件字节之前。
难以隐藏的元数据:
- 文件大小——密文长度近似于明文长度。按固定区间填充(1 MB、10 MB、100 MB、1 GB)可以模糊大小,但会浪费带宽。
- 上传时间——将时间戳与其他数据关联仍可能泄露信息。
- IP 地址——服务商能看到上传者和下载者的 IP。如有必要,可配合 Tor 或可信 VPN 使用。
Proton 和 Tresorit 发布了详细的元数据暴露矩阵。SwissTransfer 和 HexaTransfer 则采用更简洁的方式:最少元数据、短暂保留期(24 小时到 7 天),以及免费传输不与账号关联。
身份验证难题
零知识带来了一个挑战:如果服务器无法解密你的文件,它如何认证用户以防止陌生人下载?三种常见方案:
- 基于链接的认证。持有 URL(及片段)即为授权。SwissTransfer、HexaTransfer、Tresorit Send 均采用此方式,无需账号,操作简单。
- 密码保护链接。URL 片段包含盐值,实际密钥从密码通过 PBKDF2 派生。服务器存储验证器(密钥的哈希)以快速拒绝错误猜测。
- 账号绑定的零知识。Proton 和 Tresorit 通过 Argon2id 从登录密码派生主密钥,再用其解锁存储在服务器上的加密文件密钥。
各方案各有权衡。基于链接最简单,但链接泄露即密钥泄露。密码保护增加了第二因素。账号绑定需要信任客户端代码不会泄露主密钥。
破坏零知识的常见实现陷阱
以下是几个真实存在的失效场景:
- 服务端文件预览。如果服务商生成缩略图或提取文本用于搜索,就需要明文。零知识服务无法对加密内容提供这些功能。
- 同步冲突解决。跨设备比较文件内容通常需要明文。Syncthing 和 Cryptomator 通过客户端差异比较来处理这一问题。
- 分析 SDK。来自 Google Analytics 或 Segment 的第三方脚本可以在客户端代码中读取
window.location.hash。零知识服务要么自建分析系统,要么禁止片段访问。 - 密码重置。如果服务商能重置你的密码并仍让你访问旧文件,就必须持有恢复密钥——这破坏了零知识。Proton 明确警告:重置密码意味着丢失加密数据。
真正做到零知识的服务
经第三方审计(Cure53、NCC Group、Trail of Bits)核实,以下服务具有可信的零知识声明:
- Tresorit — 瑞士注册,SOC 2 Type II,零知识文件同步和 Send 功能。
- Proton Drive — 瑞士注册,基于 Proton Mail 的加密模型。
- SwissTransfer — 免费档提供可选 E2EE,由 Infomaniak 运营。
- Mega.nz — 新西兰注册,发布了加密技术白皮书。
- HexaTransfer — 基于浏览器,无需账号,每次传输最多 10 GB。
加密但非零知识的服务:Google Drive、Dropbox、OneDrive、Box、iCloud(高级数据保护档位除外)以及 WeTransfer 标准档。
实践指南
在将敏感文件托付给某个服务之前,逐项检查以下清单:
- 隐私政策是否声明服务商无法读取你的文件?
- 是否有公开的安全白皮书,明确说明 AES-256-GCM 和 KDF?
- 分享 URL 是否包含片段(
#之后的内容)? - 过去 24 个月内是否有第三方审计报告?
- 客户端代码是否开源或至少可供审计?
四项均满足,说明你找到了一个零知识服务;三项或更少,说明服务商能看到你的文件。
在 hexatransfer.com 上试试 — 免费、无需注册、最多 10 GB。