這種密鑰管理方案安全嗎?
我正在設計一種用於管理少量加密密鑰(在任何給定時間<100)的方案,我有一個想法:與其儲存所有密鑰,我是否可以只儲存一個主密鑰並使用 KDF 來派生通過以某種方式改變鹽,我需要特定的密鑰?
例如,如果我需要第二個加密密鑰來使用 X,我會給 PBKDF 之類的東西加鹽
[數學處理錯誤]$$ 2||“encryption”||X||<random value> $$ 這將唯一地導出該特定密鑰的第二個版本。
您不應為此使用基於密碼的密鑰派生函式 (PBKDF)。相反,您需要一個基於密鑰的密鑰派生函式 (KBKDF)。您可以使案例如NIST SP 800-108 (PDF)或HKDF。兩者都使用某種上下文指定密鑰派生的方法,該上下文用作 KDF 的輸入(例如標籤或序列號)。
鹽在 PBKDF 中以類似的方式使用,但鹽的用途與上下文數據不同。此外,您不太可能需要通過 PBKDF 中常用的鹽和迭代計數來提供密鑰強化。如果您的主密鑰足夠強大,那麼派生密鑰應該是安全的,無需額外措施。PBKDF 是故意慢的,KBKDF 不是。
請注意,KDF 實現可能沒有那麼廣泛。然而,使用提供必要 PRF 功能的 MAC 或 HMAC 原語來組合它們相對容易。如果您這樣做,請不要忘記針對可用的測試向量進行測試。
如果您選擇 NIST 定義的 KBKDF,我建議使用基於 HMAC 的計數器模式 KDF,使用 SHA-256 或 AES-CMAC,因為它們最容易實現並且似乎是該領域最常見的實現。
$$ EDIT $$使用 HKDF 時,建議使用 Salt 值,即使您的輸入密鑰材料(主密鑰)提供了很多熵。但是,此案例不需要它。您也不必使用 HKDF 的提取功能,但通常出於兼容性考慮,您無論如何都希望執行它。基本上:如果你有很強的資源限制,只跳過 Salt 和 extract 函式。