アップロード前に保護が開始される
ファイルの内容、ファイル名、MIME タイプ、サムネイル、ボールト名、フォルダー名と構造は、アップロードされる前にデバイス上で暗号化されます。このサービスは、暗号文とラップされたキーを保存します。これらの保存されたレコードのみを取得する侵入者は、平文のボールト キー、デバイスの秘密、または回復キーを取得しません。
これは、コンテナーを作成またはロック解除するときに、ブラウザー、オペレーティング システム、提供されたアプリケーション コード、および乱数ジェネレーターが信頼できることを前提としています。保存時の暗号化では、ロックされていないコンテナーをデバイス上で実行されている悪意のあるコードから保護することはできません。
すべてのボールトの独立したキー
各ボールトは、ランダムに生成された 256 ビット AES マスター キーから始まります。キーは、ジェスチャーから直接導出されるのではなく、ブラウザーの暗号化乱数ジェネレーターによって生成されます。個別のボールト キーは、単一のボールト キーが公開された場合の影響を制限します。
デバイス パターンは、順序付けられたドット シーケンスとランダムな 256 ビットのデバイス シークレットを組み合わせます。 PBKDF2 と HMAC-SHA-256、新しい 128 ビット ソルト、および 600,000 回の反復により、256 ビットのラッピング キーが導出されます。次に、AES-256-GCM は、そのラッピング キーの下でマスター キーを暗号化します。サービスは、暗号化されたラッパー、そのソルト、およびパブリック導出パラメーターを受け取ります。デバイスの秘密は、このブラウザのローカル IndexedDB データベースに残ります。
パターンは 5 × 5 グリッドと少なくとも 6 つの異なるドットのみを使用します。以前のパターン形式はサポートされていません。既存のコンテナーでは、新しいパターンを登録するために回復キーが必要です。グリッド サイズはパスワードの強度を保証するものではありません。予測可能なジェスチャは依然として推測しやすいものです。デバイス シークレットは、サーバー レコードのみを所有する人物に対する保護を追加しますが、ハードウェアに裏付けられたキーではありません。ローカル シークレットとラッパーの両方をコピーした人は、オフラインでパターンの推測を試みることができます。
パスキーは、公開鍵チャレンジ応答を使用してアカウントを認証します。アカウント認証では、ボールト キーの取得やファイルの復号化は行われません。有効なアカウント セッションとボールトのロック解除の成功は、通常のアプリケーション フローでは別個の要件です。
| 目的 | 工事 |
|---|---|
| ボールトマスターキー | ランダムな 256 ビット AES キー |
| キーのラッピング | PBKDF2-HMAC-SHA-256 · 600,000 反復 · 128 ビット ソルト → AES-256-GCM |
| メタデータとサムネイル | AES-256-GCM · ランダムな 96 ビットノンス · 128 ビット認証タグ |
| ファイルキーの導出 | HKDF-SHA-256 · ファイルごとのランダムな 256 ビット ソルト · 256 ビット AES 出力 |
| 回復の秘密 | 192 個のランダム ビット、16 進文字の 6 つのグループとして表示 |
機密保持と改ざん検出
Vault メタデータ、ファイル メタデータ、サムネイル、およびラップされたキーは、128 ビット認証タグを持つ AES-256-GCM を使用します。すべての独立した暗号化では、新鮮なランダムな 96 ビットのナンスが使用されます。復号化では、平文を返す前にタグが検証されます。暗号文が変更されているか、キーが間違っていると、認証が失敗します。
追加の認証データは、暗号化された各オブジェクトをその形式バージョン、ボールト識別子、オブジェクト識別子、および目的にバインドします。たとえば、サムネイルとファイルのメタデータ レコードは異なるコンテキストを使用します。暗号化されたオブジェクトを別のボールトに移動したり、別のオブジェクトに置き換えたりすると、認証されたコンテキストが変更され、検証に失敗します。
認証されたコンテキストは識別子を隠さず、新鮮さを証明しません。有効な古いレコードには、引き続き有効なタグを付けることができます。アプリケーション リビジョン チェックは通常の同時更新を検出しますが、これは完全に古い状態を再生する悪意のあるサービスに対する暗号化防御ではありません。
大きなファイルは認証されたセグメントを使用します
ファイルの内容は、Tink によって記述された AES-256-GCM-HKDF-SHA-256 ストリーミング構造を使用し、ブラウザーの暗号化プリミティブを使用して実装されます。新しいファイル ストリームにはそれぞれ、長さマーカー、ランダムな 32 バイトのソルト、およびランダムな 7 バイトのノンス プレフィックスを含む 40 バイトのヘッダーがあります。
HKDF は、ボールト マスター キーから別のファイル暗号化キーを派生します。そのコンテキストには、ボールトとファイルの識別子、プレーンテキストのバイト長、設定されたセグメント サイズが含まれます。各セグメントの 12 バイトのノンスは、ランダムなプレフィックス、4 バイトのセグメント カウンター、および最終セグメント フラグを組み合わせます。セグメントには 128 ビットの GCM タグが含まれます。
アプリケーションは、約 5 MiB の境界付きセグメント内のファイルを処理します。セグメントの位置、最終セグメント フラグ、および予期されるバイト長により、スワップ、変更、または切り捨てられたセグメントは検証に失敗します。ダウンロードでは、リリース前に各セグメントが認証されます。ストリームの後半でエラーが発生するとダウンロードが不完全になる可能性があるため、正常に完了することが重要です。アップロードの再試行では、同じセグメント ノンスで新しいコンテンツを暗号化するのではなく、すでに暗号化されたバイトが再利用されます。
施工は以下の通りです ティンク AES-GCM-HKDF ストリーミング仕様。 Revault の実装とセグメント構成は、Tink による独立した監査または認定を受けていません。
リカバリは同じキーへの 2 番目のパスです
リカバリ シークレットは 24 のランダム バイトから生成され、192 ビットのランダム入力が得られます。 PBKDF2-HMAC-SHA-256 と独自のソルトを使用してラッピング キーを個別に取得し、同じボールト マスター キーを AES-256-GCM で暗号化します。回復シークレットと暗号化されたボールトのコピーを取得した人は誰でも、そのボールトを復号化できます。
回復シークレットはセットアップ中に表示され、サービスによって平文で保存されません。暗号化されたファイルとは別に保管してください。ブラウザーのデータをクリアすると、デバイスの秘密が削除されます。アクセスを回復するには、アカウントの暗号化されたクラウド コピーと回復キー、またはエクスポートされた暗号化バックアップとその回復キーが必要です。プロバイダーが保持するマスター復号化キーはありません。
リカバリ キットにはシークレットとキー ラッパーが含まれていますが、ファイルの内容は含まれていません。暗号化されたバックアップには、ブラウザのデバイス シークレットを含まない、認証されたインベントリと暗号化されたファイル セグメントが含まれます。インポートでは、暗号化されたデータが検証され、新しい識別子とキーを使用して新しいコンテナーが作成されます。
パターンを変更すると、このデバイスのラッパーが置き換えられます。ボールト マスター キーのローテーション、別のデバイスの取り消し、古いバックアップの無効化、既存のリカバリ シークレットの変更は行いません。ボールト キーまたは回復シークレットが侵害された場合は、新しいキーを使用してデータを新しいボールトに移動します。
ネイティブ共有は独立した暗号化を使用します
モバイル共有は標準で、選択したファイル版の鍵を新しい共有鍵で保護し、暗号化済みのファイルデータを再利用します。任意の追加分離ではファイルを再暗号化します。元の保管庫の鍵は非公開のままです。同じ暗号文から共有同士が関連付けられる場合があり、どちらの方式でも受信者が保存したコピーは回収できません。
iOS は、プライベートな読み取り専用の招待状を使用して、この暗号文を別の CloudKit レコード階層に配置できます。ボールトの同期ゾーンを共有しません。クロスプラットフォームのネイティブ共有は、SHA-256 チェックサムを持つ制限されたサーバー部分を使用します。独立したランダムな 256 ビット読み取りおよび管理機能は、サーバー上にハッシュとして保存されます。復号化シークレットは個別に渡され、アップロードされることはありません。管理された共有は、送信者が選択した時刻 (30 日以内) に期限切れになります。このサービスはアクセス セッションをアトミックにカウントし、選択した最大値、有効期限、取り消しを強制します。ダウンロード セッションは最長 15 分間継続し、共有の有効期限を超えることはありません。
受信者は、暗号化されたすべてのセグメントを認証し、送信者の個別のシークレットを使用して分離された共有コンテナーを開きます。アカウント、個人保管庫、パターンは必要ありません。個人保管庫はロックされたままになります。エクスポートが許可されている場合、受信者は、その共有シークレットで開く暗号化された .qvault コピーを保存できます。それ以外の場合、輸出規制は存在しません。一時セッションは、継続的なアクセスを検証します。これらはアプリケーション制御です。スクリーンショット、変更されたクライアント、および保持されたコピーは、暗号化によって防ぐことはできません。共有は、継続的なソース更新のないスナップショットです。無制限の CloudKit 招待では、アクセス数や自動有効期限は強制されません。アクセスは所有者が共有を停止するまで継続します。オリジナルを削除しても、その個別の共有は取り消されません。また、取り消しによって、すでに保持されているコピーを取り消すことはできません。
オプションのボールトアクティビティ
ネイティブ監査ログはデフォルトではオフになっており、各デバイスのコンテナーごとに構成されます。最新の 500 件のローカル イベントは、ボールトのマスター キーと専用の認証されたコンテキストを使用して暗号化されます。これらはキー、パターン、ファイルの内容、その他のボールトのデータを除外し、同期せず、クリアまたは無効にすることができます。これらは改ざん防止の証拠ではありません。失敗したロック解除はボールトに割り当てられません。
ログを有効にして作成された新しい制御された共有は、共有サービス上に最大 100 個のアクセス セッション タイムスタンプを保持します。管理機能のみがそれらを取得できます。ログには受信者の ID や復号化の秘密は含まれません。ローカルログを無効にすると、将来の共有に影響します。既存の共有ログは、取り消しまたは有効期限が切れてクリーンアップされるまで、元の設定を保持します。
オプションの暗号化された侵入写真
所有者は、各デバイスの各保管庫に対して個別に侵入アラートを有効にすることができます。 3 つの一致しないパターンの後、フォアグラウンド アプリは、許可、カメラの可用性、および 1 分間のクールダウンを条件として、フロント カメラの写真をキャプチャできます。システムカメラのインジケーターは表示されたままになります。最新の 10 件のアラートはローカルに保存され、写真に追加されたりアップロードされたりすることはありません。一致しないパターンはターゲット コンテナーを識別しないため、オプトインされた各コンテナーは個別に暗号化されたデバイス試行レコードを受け取ります。
専用の RSA-3072 公開キーは、OAEP と SHA-256 および MGF1-SHA-256 を使用して、アラートごとに新しい 256 ビット AES-GCM キーをラップします。これにより、ボールトがロックされている間でも暗号化が可能になります。対応する秘密キー自体は、専用の認証されたコンテキストを使用して、そのボールトのマスターキーの下で暗号化されます。その保管庫のロックを解除するだけで、その写真を復号化できます。アラートは通常のアクティビティ ログとは別に監査ビューに表示され、侵入アラート設定でクリアできます。これらは改ざん防止の証拠ではありません。
独自のバケットへの暗号化されたアップロード
コンテナーのストレージ設定により、このブラウザーをユーザー指定の S3 互換の HTTPS エンドポイントに直接接続できます。選択したデバイス ファイルは、同じファイル構造を使用してローカルで暗号化されます。それぞれは、認証された暗号化されたインベントリとラップされたボールト キーを含む、個別のポータブル .qvault オブジェクトになります。ランダムなオブジェクト名を使用すると、元のファイル名が公開されるのを回避できます。復元には、ダウンロードされたオブジェクトとボールト回復キーが必要です。
エンドポイント構成と資格情報は、専用の認証済みコンテキストを使用してボールト マスター キーで暗号化され、このデバイスの IndexedDB に保存されます。これらは同期されず、Revault の API に送信されません。リクエストの署名には、AWS 署名バージョン 4、HMAC-SHA-256、および各制限付きリクエスト本文のハッシュが使用されます。 8 MiB のマルチパート パーツは、すでに暗号化されたバイトをストレージ プロバイダーに直接送信します。バケットへのアクセスは、そのプロバイダーの権限と CORS ポリシーによって引き続き管理されます。
プロバイダーは、アクセスキー識別子、オブジェクトパス、バイトサイズ、アップロード時間、接続情報を確認できます。バケットを非公開にし、その認証情報の範囲を必要な操作に限定してください。アップロードされたオブジェクトは、Revault クラウドの同期と共有から独立しています。未完了のアップロードを中止しようとするロックまたはキャンセルの試行。タブが閉じられたり、接続が切断されたりすると、孤立した部分が残る可能性があるため、不完全なアップロードのライフサイクル ルールを構成します。 Safe Exit は、他のコンテナーのローカル ストレージ資格情報を削除しますが、バケットからオブジェクトは削除しません。
Safe Exit はローカル アクセスを削除します
このブラウザで 1 つのボールトを Safe Exit ボールトとして指定できます。そのボールトのパターンを入力すると、トリガーの確認や完了通知なしで、通常どおりボールトが開きます。他のコンテナーのローカル スナップショット、暗号化されたチャンク、デバイス シークレット、およびキューに入れられた変更は削除されます。同期されていないデータは失われる可能性があります。
永続的なローカル境界により、これらのコンテナーがこのブラウザーでの同期を通じて自動的にリストされたり復元されたりすることがなくなります。暗号化されたクラウド コピーと他のデバイス上のコピーは変更されません。リカバリは一度に 1 つのボールトごとに明示的に行われ、新しいデバイス パターンを登録するにはそのボールトの回復キーが必要です。
これはローカル アクセスによる削除であり、物理的な消去やフォレンジック隠蔽が保証されるものではありません。ブラウザ プロファイル、ファイル システムのスナップショット、以前のダウンロード、スクリーンショット、サービス レコード、および別のデバイスに証拠が保存されることがあります。このブラウザのローカル データをクリアすると、ローカル分離境界もクリアされます。新規インストールでは、認証後にアカウントのクラウドボルトを再度一覧表示できます。
目に見えて残るもの
暗号化は、ストレージに関するすべての事実を保護するわけではなく、コンテンツを保護します。このサービスは、アカウントの関連付け、ランダムなオブジェクト識別子、オブジェクト数、バイト サイズ、リビジョン、タイムスタンプ、暗号化されたラッパー、ストリーム ヘッダー、およびリクエスト アクティビティを監視できます。ネットワークと操作の記録により、接続情報が明らかになる可能性があります。これは匿名システムではなく、トラフィック分析に対する抵抗力を提供しません。
トランスポート暗号化は、アプリケーションが HTTPS 経由で提供される場合、転送中のリクエストを保護します。これは、保存されたファイルの内容をサービスで暗号化したままにするクライアント側の暗号化とは別のものです。
保護が終わる場所
プライベート ブラウジングでは通常、プライベート セッションが終了するとローカル ストレージが削除されます。永続ストレージ要求によってシークレット セッションが永続化されるわけではありません。同期されたクラウド コピーは残りますが、ローカル パターン、同期されていない変更、キャッシュされたファイル、および Safe Exit 設定は失われる可能性があります。新しいプライベート セッションには、新しいパターンを登録するためのアカウント アクセスと回復キーが必要です。
アプリケーションは、ロックされると、メモリ内のボールト キー参照を削除し、プライベート プレビュー URL を取り消します。非表示になった場合、または 5 分間操作が行われなかった場合は、自動的にロックされます。ネイティブ アプリは、バックグラウンド時にロックし、一時的なプレビューを削除し、操作の終了時に所有キー バッファーを消去します。ブラウザ、Swift、および JVM のメモリ管理では、すべてのキー コピーまたはデコードされたメディア バッファの即時消去を保証できません。
マルウェア、安全でない拡張機能、侵害されたアプリケーション コード、またはロックされていない画面を閲覧している人によって、平文や秘密がキャプチャされる可能性があります。暗号化では、アカウントのサービス拒否、クラウド オブジェクトの削除、ランサムウェア、回復シークレットの損失、データの保留などを防ぐことはできません。暗号化されたバックアップを別に保管し、デバイス自体を保護してください。
Revault は独立したセキュリティ監査を受けていません。これらは実装された暗号設計についての説明であり、あらゆる侵入に対する認定や保証を行うものではありません。