暗号化モデル
.rkvey v5 フォーマット:プリアンブル、コンパートメントごとの AEAD、追記専用コミット、シークレットの分離。
.rkvey v5 フォーマット(Rust Key Vault)は、HKDF と AEAD のベストプラクティスに沿った多層暗号化モデルを実装しています。概念的な流れ:マスターパスワード → マスターキー → サブキー → 暗号化されたコンパートメント。
各エントリは コンパートメント(メタデータ、保護されたシークレット、マニフェスト、添付ファイル)に分割され、それぞれ独自の HKDF 鍵を持ちます。1 つのコンパートメントを復号しても他は明らかになりません。
QubKey v5 暗号化モデル
マスターパスワード
ユーザー入力 (UTF-8) — プレーンテキストで保存されることはありません
Argon2id
塩
16バイト(プリアンブル)
メモリ
64MB
反復
3
平行度
4
出力
256ビット
マスターキー
256 ビット · ボールト ルート キー
HKDF-SHA256
情報 = "hdr"
ヘッダーキー
ヘッダーキー
HKDF-SHA256
情報 = "idx"
インデックスキー
インデックスキー
HKDF-SHA256
info="コンパートメント"
コンパートメントの鍵
コンパートメントキー
エントリごと (v5)
HKDF(master_key, Salt=file∥entry_id, info=kind∥sub_id) → コンパートメントキー
暗号化されたコンパートメント
鍵導出
導出処理はマスターパスワードを使用可能な暗号鍵に変換します。Argon2id は意図的に時間とメモリを消費(約 500 ms、64 MB)し、オフラインの総当たりを抑制します。v5 では、各エントリコンパートメントが HKDF 経由で独自の鍵を取得します。
ユーザー入力 → マスターパスワード(UTF-8)
Argon2id → ランダム Salt 付き master_key(256 ビット)
HKDF-SHA256 → B-Tree 用 index_key
HKDF-SHA256 → エントリとコンパートメント種別ごとの compartment_key(メタデータ、シークレット、添付…)
| パラメータ | 値 | 説明 | デフォルト |
|---|---|---|---|
Variant | Argon2id | OWASP 推奨のハイブリッド — GPU とサイドチャネル攻撃に耐性 | — |
Memory | 64 MB | 導出あたりのメモリ — 並列攻撃のハードウェアコストを増加 | 65536 KB |
Iterations | 3 | メモリ上の反復 — セキュリティ / 性能(約 500 ms) | — |
Parallelism | 4 | 並列スレッド | — |
Output | 32 bytes | 導出鍵の長さ | — |
Salt | 16 bytes | プリアンブル内のランダム Salt | — |
AEAD 暗号化
AES-256-GCM(デフォルト)
- 最新 CPU の AES-NI ハードウェア支援
- Nonce:12 バイト、認証タグ:16 バイト
- 理論上の上限:鍵あたり約 64 GB の暗号化データ
選ぶ場合:AES ハードウェア加速があるマシン、日常利用。
ほとんどのプラットフォームで最適な性能のためのデフォルト暗号。
XChaCha20-Poly1305(オプション)
- 拡張 Nonce:24 バイト(衝突確率は無視できる程度)
- ハードウェア依存なし — すべての CPU で一定の性能
- 長期保存ボルトに推奨
選ぶ場合:アーカイブボルト、AES-NI なしのマシン、ChaCha20 優先。
高度なボルト設定で有効化可能。
ファイル構造
構造の説明(v5):
preamble— マジックバイト、フォーマットバージョン、Argon2id Saltheader.enc— 暗号化されたボルトメタデータ(名前、作成日、設定)index/— シークレット復号なしで O(log n) 検索可能な暗号化 B-Treecompartments/— 種別ごとの AEAD ブロック:メタデータ、保護シークレット、マニフェスト、添付append/— コミット領域:新規コンパートメント + インデックススナップショット + 検証済みフッター
整合性とコミット
耐障害性
追記専用コミット は中断時の整合性を保証します:
- 新しいコンパートメントをファイル末尾に追加
- 暗号化インデックススナップショットを書き込み
- ディスクへ同期(fsync)
- 検証済みフッター でコミットを完了(一貫性ポイント)
実例:エントリ編集中に停電が起き、書き込み中に中断された場合。再起動時 QubKey は最新の有効フッターを見つけます — データ損失も静かな破損もありません。古い領域が増えすぎたら定期的なコンパクションでクリーンなファイルに書き直します。
コンパートメントごとの分離
HKDF-SHA256 により、各コンパートメントはマスターキーからエントリ ID とコンパートメント種別で導出された独自の compartment_key を持ちます。実務上の意味:
- エントリ表示では メタデータ のみ復号;シークレットは明示的な表示までマスク
- 添付 は個別に読み込み(ダウンロード / プレビュー)、ボルト開錠時には読み込まない
- B-Tree インデックスはデータとは別の
index_keyを使用 - シークレット変更時、変更のない添付ファイルを必ずしも書き直さない
この分離は .rkvey v5 フォーマットにネイティブに組み込まれています。
暗号プリミティブ
| プリミティブ | 用途 | ライブラリ |
|---|---|---|
| Argon2id | パスワード → 鍵導出 | argon2 (RustCrypto) |
| HKDF-SHA256 | 鍵 → サブキー導出 | hkdf (RustCrypto) |
| AES-256-GCM | AEAD 暗号化 | aes-gcm (RustCrypto) |
| XChaCha20-Poly1305 | AEAD 暗号化(代替) | chacha20poly1305 (RustCrypto) |
| HMAC-SHA256 | ファイル整合性 | hmac (RustCrypto) |
| CSPRNG | 乱数生成 | getrandom (OS) |