帳號保管庫密碼學
Optserv 帳號共享的完整密碼學規格:PBKDF2 派生金鑰、AES-GCM 加密負載、RSA-OAEP 分發金鑰。
本頁記錄 Optserv 帳號共享(Account Sharing)使用的完整密碼學模型,是關於憑證如何被保護的權威技術參考。
若想先了解操作層面的說明,請見 帳號共享安全模型。
設計目標
- 靜態零知識(Zero knowledge at rest) — Optserv 伺服器永遠不儲存或傳輸明文憑證
- 每項目金鑰隔離(Per-item key isolation) — 每個共享憑證各有獨立加密金鑰;攻破一把不會暴露其他
- 可被密碼學驗證的撤銷(Cryptographic access revocation) — 從存取清單移除某人,會實際撤銷其解密能力,而不是只是 UI 看不到
- 標準演算法 — 不使用自創加密;採用 NIST 認可的標準演算法
密碼學層級
Layer 1:金鑰派生 — PBKDF2 + SHA-256
每位使用者都有一把由秘密資料派生出的主金鑰(master key),使用 PBKDF2:
DerivedKey = PBKDF2(
PRF: HMAC-SHA-256,
Password: [user secret],
Salt: [user-specific salt],
Iterations: 210,000,
KeyLength: 256 bits
)
迭代次數:210,000 —— 這與 2023 年 OWASP 對 PBKDF2-HMAC-SHA256 的建議一致。高迭代次數會讓離線暴力破解的計算成本大幅提高。
派生金鑰用於保護使用者的 RSA 私鑰(見 Layer 3)。
Layer 2:負載加密 — AES-GCM 256-bit
每筆憑證負載會使用一把獨立的 AES-GCM 金鑰加密:
Algorithm: AES-GCM
Key size: 256 bits
Key: Randomly generated per item (ItemKey)
Output: { ciphertext, iv, authTag }
AES-GCM 同時提供機密性(加密)與完整性(認證)。若密文被竄改,認證會失敗,客戶端會拒絕資料,無法被「悄悄修改」。
authTag 用於偵測加密後的任何修改;一旦密文被改動,解密會失敗。
Layer 3:金鑰分享 — RSA-OAEP + SHA-256
要把某個項目分享給其他使用者時,會用收件者的 RSA 公鑰加密 ItemKey:
Algorithm: RSA-OAEP
Hash: SHA-256
Input: ItemKey (256-bit AES key)
Recipient key: Recipient's RSA public key
Output: EncryptedItemKey (stored per recipient in the access list)
每個項目的存取清單會為每位收件者存一份「各自加密」的 ItemKey:
AccessList: [
{ userId: "alice", encryptedItemKey: RSA-OAEP(ItemKey, alice.publicKey) },
{ userId: "bob", encryptedItemKey: RSA-OAEP(ItemKey, bob.publicKey) },
]
撤銷存取: 只要刪除收件者在存取清單中的那筆資料。沒有自己的加密 ItemKey,他就無法取得 AES 金鑰,也就無法解密負載。
金鑰生命週期
| 事件 | 會發生什麼 |
|---|---|
| 建立使用者帳號 | 產生 RSA 金鑰對;私鑰以派生金鑰加密保存 |
| 使用者分享項目 | 以收件者公鑰包裹 ItemKey;在存取清單新增一筆 |
| 從存取清單移除使用者 | 刪除他的加密 ItemKey 條目 |
| 使用者離職/停用 | RSA 私鑰變得不可用;他擁有的項目會被標記以便重新加密/轉移 |
Optserv 會儲存什麼
| 資料 | 會儲存? | Optserv 看得懂? |
|---|---|---|
| 明文憑證 | 否 | 否 |
| 加密後的憑證負載 | 是 | 否(沒有 AES 金鑰) |
| 使用者 RSA 公鑰 | 是 | 是(公鑰不是秘密) |
| 使用者 RSA 私鑰(加密後) | 是 | 否(由派生金鑰加密) |
| 各收件者的加密 ItemKey | 是 | 否(需要 RSA 私鑰) |
Optserv 的伺服器只持有密文與公鑰。所有敏感秘密都由 Optserv 不持有的金鑰加密保護。