セキュリティとプライバシーのホワイトペーパー(概要)第5章

第5章 暗号化と鍵管理

本章では、FileBolt のエンドツーエンド暗号化(E2EE)とゼロ知識の境界について説明し、 cryptoVersion=v1 のパラメータ、エンコード規則、障害時の動作、クライアントの制約を規定します。 鍵はクライアント上で生成・使用され、サーバーとオブジェクトストレージが扱うのは、暗号化されたチャンクと必要なメタデータのみです。

5.0 概要

  • システムは、復号鍵(CEK)を受信・保存・ログ記録してはなりません(MUST NOT)。 CEK の素材は URL フラグメント(# 以降の部分)にのみ含まれ、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 セキュリティポリシー

  • システムは、すべてのページと API を HTTPS のみで提供しなければなりません(MUST)。
  • システムは、TLS 1.3 を優先し、必要に応じて TLS 1.2 に対応することが望まれます(SHOULD)。脆弱なプロトコルや暗号スイートは無効化しなければなりません(MUST)。
  • システムは、適切な max-age を設定して HSTS を有効にしなければなりません(MUST)。

5.2 チャンクの暗号化(AES-128-GCM)

5.2.1 設計上の考え方

  • ファイルは固定サイズのチャンクに分割し、並列転送と再開に対応できるよう、チャンクごとに独立して暗号化します。
  • AEAD の認証によって完全性を保護します。認証に失敗した場合は、必ずフェイルクローズしなければなりません(MUST)。

5.2.2 セキュリティポリシー

  • ファイルごとに異なる CEK(16 バイト)を使用しなければなりません(MUST)。
  • IV は(ファイル, chunkIndex)ごとに一意でなければなりません(MUST)。v1 では noncePrefix と chunkIndex を組み合わせたエンコードを使用します。
  • AAD には、暗号文をそのコンテキストに結び付けるため、(transferId, fileId, chunkIndex)を含めなければなりません(MUST)。

5.3 ゼロ知識リンクモデル

5.3.1 主な制約

  • CEK(またはその導出素材)は URL フラグメントにのみ含めなければならず(MUST)、クエリパラメータやヘッダーに含めてはなりません(MUST NOT)。
  • サーバーはフラグメントをログに記録してはならず(MUST NOT)、誤って記録されないよう、ログはサニタイズしなければなりません(MUST)。
  • リファラーポリシーにより、外部サイトへの遷移時にフラグメントが漏えいしないようにすることが望まれます(SHOULD。第9章を参照)。

5.4 鍵の生成と取り扱い

  • 鍵は、暗号論的に安全な乱数生成器(WebCrypto)を使って生成しなければなりません(MUST)。
  • 鍵はメモリ上にのみ保持し、不要になったら消去することが望まれます(SHOULD)。
  • クライアントは、サーバーから見える場所(Cookie、クエリパラメータなど)に CEK を保存してはなりません(MUST NOT)。

5.5 エンコードとパラメータ

  • cryptoVersion=v1 は、アルゴリズムの組み合わせと IV/AAD の規則を示します。
  • マニフェストには、必要な公開パラメータ(チャンクサイズ・チャンク数、noncePrefix、fileId の対応関係)を含めなければなりませんが(MUST)、CEK を含めてはなりません(MUST NOT)。

5.6 障害時の動作(フェイルクローズ)

  • 復号に失敗した場合や AEAD の認証に失敗した場合、クライアントは処理を中止しなければならず(MUST)、部分的な平文を出力してはなりません(MUST NOT)。
  • パラメータ(transferId/fileId/chunkIndex)が一致しない場合、クライアントはフェイルクローズしなければならず(MUST)、対処の手がかりになるエラーを報告することが望まれます(SHOULD)。

5.7 関連するクレーム ID