從 MAC 派生 AES 密鑰是否安全?
我正在做一個項目,我們需要加密大量文件並將它們儲存在雲上。而且我想知道以下過程是否安全(我們在私有數據中心有一個“硬體安全模組”和一個“加密伺服器”,只有文件會在雲中)。
由於文件量太大而無法在 HSM 中加密,我的想法是:
- 在 HSM 中有一個 256 位的主加密密鑰。
- 通過使用主加密密鑰生成 256 位隨機數和 HMAC-SHA2-256 來派生加密密鑰。
- 從 MAC 中取出最右邊的 128 位並將其用作 AES 密鑰。
- 從 MAC 中取出最左邊的 128 位並將它們用作 IV。
- 加密內部伺服器中的內容。
- 覆蓋儲存派生 AES 密鑰的記憶體。
- 儲存文件的一些元數據(包括第二步中的 256 位隨機數)。
我會做類似的事情來生成簽名密鑰:
- 在 HSM 中有 256 位主簽名密鑰。
- 通過使用主簽名密鑰生成 256 位隨機數和 HMAC-SHA2-256 來派生簽名密鑰。
- 使用派生的簽名密鑰 MAC 加密文件
- 覆蓋儲存派生簽名密鑰的記憶體。
- 儲存文件的一些元數據(包括第二步中的 256 位隨機數)。
要解密數據,我會使用隨機數重新導出密鑰。我試圖通過這個實現的是每個文件使用不同的密鑰,而且我們可以不時地輪換主密鑰以獲得額外的安全性。另外,幾年後,當我們不需要這些文件時,我們可以刪除主密鑰(除了從雲端刪除文件)。
我知道上述過程並非 100% 安全,因為派生密鑰將存在於 HSM 之外,但我們需要在安全性和成本之間保持平衡。如果儲存普通隨機數不安全,我可以在 hsm 中使用 AES 密鑰來加密隨機數。
我樂於接受的安全/假設級別是:
- 如果 HSM 被入侵,所有文件都會被入侵(這很明顯)
- 如果加密伺服器遭到破壞,攻擊者可以在加密之前訪問純文字文件(所以我什至不會考慮攻擊者竊取記憶體中的 AES 密鑰)。
- 竊取數據庫(使用隨機數)和所有文件的攻擊者無法解密數據。
(我希望這些假設是明智的——如果您不同意,請告訴我!)
看起來,鑑於你的對手模型,事情應該是安全的。HMAC 作為隨機性提取器已被證明是好的,尤其是當我們可以假設雜湊函式是抗衝突的時。那篇論文也有一些結果告訴你如何防止碰撞阻力被破壞(基本上使用具有更大輸出大小的散列函式)。但是,如果 SHA-256 很快被破壞,我們都會遇到很多麻煩,所以我不會太擔心這種攻擊。
您似乎正在嘗試使用 HMAC 實現自己的 KBKDF(基於密鑰的密鑰派生函式)。也許最好使用預定義的。
使用經過 FIPS 認證的 NIST SP 800-108的 HSM 可能更明智。這些使用NIST SP 800-108 中定義的 KBKDF 之一。
您仍然可以通過將隨機的想法放在KBKDF的*上下文輸入欄位中來使用它。*請注意,如果您有來自上下文的隨機數(例如文件名的散列),您並不嚴格需要隨機值;只要組合是唯一的,只需在標籤/上下文上執行 KDF 就足夠了。
您應該確保生成的密鑰可以從 HSM 中導出。如果該算法不可用,則使用 HSM 提供的 MAC 算法來實現 KDF 之一(例如計數器模式一)是有意義的。
請注意,SP 800-108 中定義的所有 KDF 都使用 MAC(基於密碼或基於雜湊)作為 KDF 的基礎功能。