安全与隐私白皮书(总览)第 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