用於密鑰多樣化的 PBKDF2
我正在尋找一種安全的密鑰多樣化功能來為本地智能卡部署創建單獨的 AES 密鑰。密鑰需要從秘密主密鑰和智能卡序列號中導出。密鑰計算可以在主機系統上進行。
PBKDF2(password=master_key, salt=serial_number, rounds=1000, dkLen=16)
用於獲取單個密鑰是否安全且實用,還是像這樣更簡單的方案AES(key=master_key, data=serial_number)
就足夠了?**編輯:**將
master_key
僅為此目的創建,至少包含來自適當 RNG 的 128 位隨機數據。我想知道的一個問題是:通常,鹽也是一個高熵值。如果序列號不是高熵(但仍然是唯一的),這個方案會變得脆弱嗎?
如果您希望使用密鑰作為輸入來實現密鑰多樣化,最好使用基於密鑰的密鑰派生函式 (KBKDF),而不是基於密碼的密鑰派生函式 (PBKDF)。不同之處在於 KBKDF 需要具有高熵的密鑰。這也意味著它不需要鹽或迭代計數。但是,它確實需要每個派生密鑰的上下文特定數據。在您的情況下,這當然包括序列號的編碼。它還可能包括特定密鑰的某種 ID 或標籤,例如加密密鑰的 ASCII“ENC”和身份驗證密鑰的“MAC”。
如果您正在尋找密鑰派生函式,最好使用NIST SP 800-108或HKDF。NIST SP 800-108 定義了整個範圍的 KBKDF。不幸的是,它不提供任何類型的建議或預設值。
正如 fgrieu 所指出的,可能無法針對智能卡上的雜湊函式實施針對側通道攻擊的對策。因此,對於 PRF,最好選擇計數器模式 KBKDF,在 CMAC 模式下使用 AES。這是 SP800-108 文件中描述的第一種模式。
如果您習慣於處理二進制數據,KBKDF 和 CMAC 都相對容易實現。我剛剛在 800-108 和 HKDF 中為 Bouncy Castle 框架 (Java) 實現了所有 KBKDF,所以它們都在那裡,以防您需要參考實現(當然,針對官方測試向量進行了測試)。