Revault は大きなファイルを約 5 MiB のセグメントに分けて暗号化し、各セグメントに個別の認証タグを付けます。そのため、ファイル全体を一度にメモリに載せる必要がありません。Web アプリで最大 1 GiB のファイルを扱えるのは、この仕組みのおかげです。
なぜファイル全体を一度に暗号化しないのですか?
大きなファイルには大量のメモリは必要ありません。 Revault は、約 5 MiB のセグメントでファイルを読み取り、ブラウザーで各セグメントを暗号化し、暗号文を IndexedDB にステージングします。元のファイルが 1 つの巨大なバッファーに読み込まれることはありません。
セグメント単位で処理するため、アップロードが中断されても、ファイル全体を再び暗号化することなく、すでに準備済みの暗号文から再開できます。
セグメントの順序と完全性は何によって守られますか?
各ファイルには、ボールトのマスターキーから HKDF で導出された専用の暗号化キーが割り当てられます。導出のコンテキストには、ボールトとファイルの識別子、ファイルのバイト長、セグメントサイズが含まれます。
各セグメントの 12 バイトのノンスは、そのファイル用に選ばれたランダムなプレフィックス、4 バイトのセグメントカウンター、最後のセグメントを示すフラグを組み合わせたものです。セグメントには 128 ビットの GCM タグが付きます。セグメントが入れ替えられたり、改ざんされたり、切り詰められたりすると、検証に失敗します。
アップロードが中断されるとどうなりますか?
暗号化が完了すると、ページの更新後にキャッシュされた暗号文からネットワーク アップロードを再開できます。再試行では、古い nonce で新しいソースを暗号化するのではなく、同じ暗号化されたバイトが送信されます。暗号化自体が中断された場合は、その不完全なアップロードをキャンセルし、新しいファイル ID で再度開始してください。
ダウンロードはどのように検証されますか?
ダウンロード時は、各セグメントを認証してから出力します。検証はファイルのストリーミング中に行われるため、ダウンロードの終盤でエラーが起きると不完全なファイルが残ることがあります。ファイルを利用する前に、ダウンロードが正常に完了したことを確認してください。
制限は何ですか?
Web アプリでは、1 ファイルあたり最大 1 GiB まで扱えます。画像と動画のプレビューには、別途メモリの上限があります。ブラウザーのローカルストレージを消去すると、アップロードの再開に必要な暗号文が削除されることがあります。
ストリーミング形式は、Tink が文書化した AES-GCM-HKDF ストリーミング構造に従い、ネイティブの Web Crypto プリミティブを使用します。ファイル ID と予想される長さは、キー導出コンテキストにバインドされます。セグメント カウンターと最終マーカーは、順序付けと完了を保護します。この実装は独立した暗号化監査を受けていません。
ストリームヘッダーやキー導出を含む構成の全体は、セキュリティモデルのページで説明しています。