コンテンツへスキップ
HexaTransfer
ブログへ戻る
暗号化とセキュリティ

ゼロ知識アーキテクチャ:サーバーがファイルを見られない理由

ゼロ知識アーキテクチャがサービス提供者さえもファイルにアクセスできないことを保証する仕組みを解説。

ゼロ知識アーキテクチャとは、サービス提供者がユーザーのファイルを読む技術的手段を持たないことを意味します。暗号鍵はサーバーに届かず、マスター鍵もバックドアも「信頼してください」も不要です。ブラウザはローカルで生成した鍵を使い、アップロード前に 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() に渡して復号します。

この手法は2013年頃に Mega.nz が先駆けとなり、Mozilla が2020年に終了させるまで Firefox Send でも洗練されました。現在では標準的なパターンです。nginx や Caddy のアクセスログを含むサーバー側のログには、HTTP RFC 3986 がフラグメントをクライアント側のみのものと定義しているため、フラグメントが記録されることはありません。

理論的には、プロバイダーがクライアント側の JavaScript を通じてフラグメントをログに記録することも可能です。そのためゼロ知識サービスはクライアントコードを検査可能な形で公開し、多くの場合、署名付き静的アセットとして別のオリジンから配信します。

「保存時暗号化」との違い

すべてのクラウドプロバイダーは保存時にファイルを暗号化しています。これは SOC 2 Type II や ISO 27001 認証でも求められる標準的な要件です。しかし、プロバイダーが鍵を保持する「保存時暗号化」は、ディスクを盗んだ攻撃者からは守れても、プロバイダーが要求に応じて自動的に復号できる状態でもあります。

ゼロ知識では鍵の管理が逆転します。ユーザーが鍵を保持し、プロバイダーは暗号文を保持します。プロバイダーは復号しようとしても不可能です。これは以下の3つの脅威シナリオで重要です。

  1. 悪意のある従業員:データベースにアクセスできるプロバイダーの社員が見えるのは暗号文だけです。
  2. 政府の要求:GDPR 第48条や米国 CLOUD Act による開示命令があっても、保有していないものは渡せません。
  3. サーバー侵害:2021年の LastPass 侵害では暗号化された金庫が流出しました。弱いマスターパスワードのものは解読されましたが、ゼロ知識設計により大規模な平文漏洩は防がれました。

暗号化されるものとメタデータとして残るもの

単純な実装はファイル内容を暗号化しますが、ファイル名・サイズ・フォルダ構造は可視のままになります。真のゼロ知識はファイル名も暗号化します。一般的な手法として、AES-GCM 暗号化の前に {"name": "Q4-financials.pdf", "type": "application/pdf"} のような JSON ヘッダーをファイルバイトの先頭に付加します。

隠すことが難しいメタデータは以下のとおりです。

  • ファイルサイズ:暗号文の長さは平文の長さに近似します。1 MB・10 MB・100 MB・1 GB などの固定バケットにパディングすることでわかりにくくできますが、帯域幅のコストが増えます。
  • アップロードタイミング:タイムスタンプと他のデータを相関させることで情報が漏洩する可能性があります。
  • IP アドレス:プロバイダーはアップロードとダウンロードの実施者を確認できます。これが問題となる場合は、Tor または信頼できる VPN と組み合わせましょう。

Proton と Tresorit は詳細なメタデータ露出マトリクスを公開しています。SwissTransfer と HexaTransfer はよりシンプルなアプローチを採用しており、最小限のメタデータ・短い保持期間(24時間〜7日)・無料転送でのアカウント紐付けなしを維持しています。

認証の問題

ゼロ知識には課題があります。サーバーがファイルを復号できない場合、見知らぬ人のダウンロードをどうやって防ぐかという問題です。一般的なパターンは3つあります。

  • リンクベース認証:URL(とフラグメント)を所持することが認可の証明です。SwissTransfer・HexaTransfer・Tresorit Send が採用。シンプルでアカウント不要で使えます。
  • パスワード保護リンク:URL フラグメントにはソルトが含まれ、実際の鍵はパスワードから PBKDF2 で導出されます。サーバーは誤入力を素早く拒否するため、鍵のハッシュを検証用に保存します。
  • アカウント紐付けゼロ知識:Proton と Tresorit は Argon2id でログインパスワードからマスター鍵を導出し、それを使ってサーバーに暗号化保存されたファイルごとの鍵を解錠します。

それぞれにトレードオフがあります。リンクベースが最もシンプルですが、URL を取得した人に鍵が漏れます。パスワード保護は第二要素を追加します。アカウント紐付けは、クライアントコードがマスター鍵を流出させないことへの信頼が必要です。

ゼロ知識を損なう実装の落とし穴

実世界での注意すべき失敗事例を紹介します。

  • サーバー側のファイルプレビュー:プロバイダーがサムネイルを生成したり検索用にテキストを抽出したりする場合、平文が必要になります。ゼロ知識サービスは暗号化されたコンテンツでこれらの機能を提供できません。
  • 同期の競合解決:デバイス間のファイル比較は通常、平文を必要とします。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:Infomaniak 運営、任意の E2EE を持つ無料プラン。
  • Mega.nz:ニュージーランド拠点、暗号化ホワイトペーパーを公開。
  • HexaTransfer:ブラウザベース、アカウント不要、転送あたり最大10GB。

暗号化はされているがゼロ知識ではないサービス:Google Drive・Dropbox・OneDrive・Box・iCloud(Advanced Data Protection プランを除く)・WeTransfer 標準プランがあります。

実践に活かすためのチェックリスト

機密ファイルを預けるサービスを選ぶ前に、以下を確認しましょう。

  • プライバシーポリシーに「プロバイダーはファイルにアクセスできない」という記述があるか。
  • AES-256-GCM と KDF を明記したセキュリティホワイトペーパーが公開されているか。
  • 共有 URL に # 以降のフラグメントが含まれているか。
  • 過去24か月以内のサードパーティ監査レポートがあるか。
  • クライアントコードがオープンソースか、少なくとも監査可能な状態にあるか。

4つすべてに「はい」と答えられれば、ゼロ知識サービスです。3つ以下であれば、プロバイダーはファイルを見ることができます。

hexatransfer.comでお試しください — 無料、登録不要、最大10GB。

エンドツーエンド暗号化で大容量ファイルを安全に送信

エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。

ファイルを送信