加密模型
.rkvey v5 格式:序言、依隔間 AEAD、僅追加提交與金鑰隔離。
.rkvey v5 格式(Rust Key Vault)依 HKDF 與 AEAD 最佳實務實作多層加密模型。概念模型:主密碼 → 主金鑰 → 子金鑰 → 加密隔間。
每個項目分為 隔間(中繼資料、受保護機密、清單與附件檔案),各自擁有獨立 HKDF 金鑰。解密一個隔間不會暴露其他隔間。
QubKey v5 加密模型
主密碼
使用者輸入 (UTF-8) — 從未以明文形式儲存
氬氣2id
鹽
16 位元組(前導碼)
記憶
64MB
迭代
3
平行性
4
輸出
256位
萬能鑰匙
256 位元·保險庫根密鑰
HKDF-SHA256
資訊=“人類發展報告”
標題鍵
標頭鍵
HKDF-SHA256
訊息=“idx”
索引鍵
索引鍵
HKDF-SHA256
資訊=“車廂”
車廂鑰匙
隔間鑰匙
每個條目 (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/—— 加密 B-Tree,O(log n) 搜尋且無需解密機密compartments/—— 依類型的 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) |