セキュリティ

暗号化モデル

.rkvey v5 フォーマット:プリアンブル、コンパートメントごとの AEAD、追記専用コミット、シークレットの分離。

.rkvey v5 フォーマット(Rust Key Vault)は、HKDF と AEAD のベストプラクティスに沿った多層暗号化モデルを実装しています。概念的な流れ:マスターパスワード → マスターキー → サブキー → 暗号化されたコンパートメント

各エントリは コンパートメント(メタデータ、保護されたシークレット、マニフェスト、添付ファイル)に分割され、それぞれ独自の HKDF 鍵を持ちます。1 つのコンパートメントを復号しても他は明らかになりません。

QubKey v5 暗号化モデル

マスターパスワード

ユーザー入力 (UTF-8) — プレーンテキストで保存されることはありません

KDF

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) → コンパートメントキー

メタデータ
秘密
アト。マニフェスト
AES-256-GCM

暗号化されたコンパートメント

鍵導出

導出処理はマスターパスワードを使用可能な暗号鍵に変換します。Argon2id は意図的に時間とメモリを消費(約 500 ms、64 MB)し、オフラインの総当たりを抑制します。v5 では、各エントリコンパートメントが HKDF 経由で独自の鍵を取得します。

ユーザー入力 → マスターパスワード(UTF-8)

Argon2id → ランダム Salt 付き master_key(256 ビット)

HKDF-SHA256 → B-Tree 用 index_key

HKDF-SHA256 → エントリとコンパートメント種別ごとの compartment_key(メタデータ、シークレット、添付…)

パラメータ説明デフォルト
VariantArgon2idOWASP 推奨のハイブリッド — GPU とサイドチャネル攻撃に耐性
Memory64 MB導出あたりのメモリ — 並列攻撃のハードウェアコストを増加65536 KB
Iterations3メモリ上の反復 — セキュリティ / 性能(約 500 ms)
Parallelism4並列スレッド
Output32 bytes導出鍵の長さ
Salt16 bytesプリアンブル内のランダム Salt

AEAD 暗号化

AES-256-GCM(デフォルト)

  • 最新 CPU の AES-NI ハードウェア支援
  • Nonce:12 バイト、認証タグ:16 バイト
  • 理論上の上限:鍵あたり約 64 GB の暗号化データ

選ぶ場合:AES ハードウェア加速があるマシン、日常利用。

ほとんどのプラットフォームで最適な性能のためのデフォルト暗号。

XChaCha20-Poly1305(オプション)

  • 拡張 Nonce:24 バイト(衝突確率は無視できる程度)
  • ハードウェア依存なし — すべての CPU で一定の性能
  • 長期保存ボルトに推奨

選ぶ場合:アーカイブボルト、AES-NI なしのマシン、ChaCha20 優先。

高度なボルト設定で有効化可能。

ファイル構造

preamble
header.enc
btree_root.enc
btree_nodes.enc
core_meta.enc
protected_secrets.enc
attachment_manifest.enc
attachment_blob_*.enc
commit_N
footer (validated)

構造の説明(v5):

  • preamble — マジックバイト、フォーマットバージョン、Argon2id Salt
  • header.enc — 暗号化されたボルトメタデータ(名前、作成日、設定)
  • index/ — シークレット復号なしで O(log n) 検索可能な暗号化 B-Tree
  • compartments/ — 種別ごとの AEAD ブロック:メタデータ、保護シークレット、マニフェスト、添付
  • append/ — コミット領域:新規コンパートメント + インデックススナップショット + 検証済みフッター

整合性とコミット

耐障害性

追記専用コミット は中断時の整合性を保証します:

  1. 新しいコンパートメントをファイル末尾に追加
  2. 暗号化インデックススナップショットを書き込み
  3. ディスクへ同期(fsync)
  4. 検証済みフッター でコミットを完了(一貫性ポイント)

実例:エントリ編集中に停電が起き、書き込み中に中断された場合。再起動時 QubKey は最新の有効フッターを見つけます — データ損失も静かな破損もありません。古い領域が増えすぎたら定期的なコンパクションでクリーンなファイルに書き直します。

コンパートメントごとの分離

HKDF-SHA256 により、各コンパートメントはマスターキーからエントリ ID とコンパートメント種別で導出された独自の compartment_key を持ちます。実務上の意味:

  • エントリ表示では メタデータ のみ復号;シークレットは明示的な表示までマスク
  • 添付 は個別に読み込み(ダウンロード / プレビュー)、ボルト開錠時には読み込まない
  • B-Tree インデックスはデータとは別の index_key を使用
  • シークレット変更時、変更のない添付ファイルを必ずしも書き直さない

この分離は .rkvey v5 フォーマットにネイティブに組み込まれています。

暗号プリミティブ

プリミティブ用途ライブラリ
Argon2idパスワード → 鍵導出argon2 (RustCrypto)
HKDF-SHA256鍵 → サブキー導出hkdf (RustCrypto)
AES-256-GCMAEAD 暗号化aes-gcm (RustCrypto)
XChaCha20-Poly1305AEAD 暗号化(代替)chacha20poly1305 (RustCrypto)
HMAC-SHA256ファイル整合性hmac (RustCrypto)
CSPRNG乱数生成getrandom (OS)