安全与隐私白皮书(总览)第 5 章
第 5 章 加密与密钥管理
本章说明 FileBolt 的端到端加密(E2EE)与零知识边界,并规定 cryptoVersion=v1 的参数、编码规则、失败模式与客户端约束。 密钥在客户端生成并使用;服务端与对象存储仅处理密文分片和必要的元数据。
5.0 摘要
- 系统 MUST NOT 接收、存储或记录解密密钥(CEK)。 CEK 材料仅通过 URL fragment(
#之后的部分)携带,HTTP 请求不会把它发送给服务端。 - 加密使用 AES-128-GCM(AEAD)。每个文件使用独立的 CEK(16 字节)。分片大小固定(例如 16MB)。
- v1 的 IV 构造:IV = noncePrefix(8B) || uint32_be(chunkIndex)(4B)。 AAD 绑定
transferId、fileId与chunkIndex,以防止上下文替换与重放。 - 服务端令牌仅用于控制对密文的访问并会过期;它们不具备解密能力。
5.1 传输加密(TLS)
5.1.1 安全目标
- 防止上传 / 下载 / API 链路被窃听和篡改。
- 保护传输中的令牌与密文。
5.1.2 安全策略
- 系统 MUST 仅通过 HTTPS 提供所有页面与 API。
- 系统 SHOULD 优先使用 TLS 1.3,并按需支持 TLS 1.2;MUST 禁用弱协议 / 弱加密套件。
- 系统 MUST 启用 HSTS,并设置合理的
max-age。
5.2 分片加密(AES-128-GCM)
5.2.1 设计说明
- 文件被切分为固定大小的分片;每个分片独立加密,以支持并行传输和断点续传。
- AEAD 认证保护完整性;任何认证失败 MUST 失败关闭。
5.2.2 安全策略
- 每个文件 MUST 使用不同的 CEK(16 字节)。
- IV MUST 在每个(文件,chunkIndex)组合下唯一。v1 使用
noncePrefix+chunkIndex编码。 - AAD MUST 包含(transferId、fileId、chunkIndex),以将密文绑定到其上下文。
5.3 零知识链接模型
5.3.1 关键约束
- CEK(或其派生材料)MUST 仅通过 URL fragment 携带,MUST NOT 出现在查询参数或请求头中。
- 服务端 MUST NOT 记录 fragment;日志 MUST 经过清理,避免意外捕获。
- Referrer 策略 SHOULD 防止 fragment 通过外链跳转泄露(见第 9 章)。
5.4 密钥生成与处理
- 密钥 MUST 使用密码学安全的随机数生成器(WebCrypto)生成。
- 密钥 SHOULD 仅保存在内存中,并在不再需要时清除。
- 客户端 MUST NOT 将 CEK 持久化到服务端可见的位置(例如 Cookie、查询参数)。
5.5 编码与参数
- cryptoVersion=v1 标识算法套件以及 IV / AAD 规则。
- Manifest MUST 包含必需的公开参数(分片大小 / 数量、noncePrefix、fileId 映射),但 MUST NOT 包含 CEK。
5.6 失败模式(失败关闭)
- 发生解密失败或 AEAD 认证失败时,客户端 MUST 中止,且 MUST NOT 输出任何部分明文。
- 发生参数不匹配(transferId / fileId / chunkIndex)时,客户端 MUST 失败关闭,并 SHOULD 报告可操作的错误信息。
5.7 相关 Claim IDs
- 权威映射请参见 附录:Claim IDs。