資源

帳號保管庫密碼學

Optserv 帳號共享的完整密碼學規格:PBKDF2 派生金鑰、AES-GCM 加密負載、RSA-OAEP 分發金鑰。

本頁記錄 Optserv 帳號共享(Account Sharing)使用的完整密碼學模型,是關於憑證如何被保護的權威技術參考。

若想先了解操作層面的說明,請見 帳號共享安全模型

設計目標

  1. 靜態零知識(Zero knowledge at rest) — Optserv 伺服器永遠不儲存或傳輸明文憑證
  2. 每項目金鑰隔離(Per-item key isolation) — 每個共享憑證各有獨立加密金鑰;攻破一把不會暴露其他
  3. 可被密碼學驗證的撤銷(Cryptographic access revocation) — 從存取清單移除某人,會實際撤銷其解密能力,而不是只是 UI 看不到
  4. 標準演算法 — 不使用自創加密;採用 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 不持有的金鑰加密保護。