對於簡單的隨機密鑰擴展,具有 1 次迭代的 PBKDF2 是否可以接受?
我有一個 128 位隨機生成的密鑰。我需要將此密鑰擴展到 512 位,以便與現有的加密庫一起使用,該庫在 CBC 模式下使用 HMAC-SHA256 身份驗證進行 AES-256 加密。
我使用的加密庫也有 PBKDF2-SHA512 可用。僅使用 1 次迭代即可使用 PBKDF2 來執行我需要的簡單密鑰擴展是否可以接受?我還需要一種鹽,我想我可以只使用硬編碼的值。
例子:
generated_key = crypto_safe_rand(128) derived_key = pbkdf2(password: generated_key, salt: 'hardcoded_salt', iterations: 1, algorithm: 'SHA-512')
我的想法是迭代計數並不是一個真正的因素,因為原始的“密碼”是隨機生成的,長度為 128 位。
還是使用 HKDF 之類的東西會更好?
還是使用 HKDF 之類的東西會更好?
一般來說?是的。使用 HKDF 是首選,如果只是為了更清楚地傳達您在此處實際執行的操作。
僅使用 1 次迭代即可使用 PBKDF2 來執行我需要的簡單密鑰擴展是否可以接受?
是的。
為了解釋這一點,我們首先需要了解 PBKDF2 是如何工作的。首先,注意它計算 $ \ell $ 從輸入作為獲得所需密鑰長度所需的 PRF (HMAC) 呼叫次數。那麼關鍵是 $ T_1|T_2|\ldots|T_\ell $ . 這 $ T_i $ 被定義為 $ T_i=F(P,S,c,i) $ - 和 $ P $ 作為密碼, $ S $ 鹽和 $ c $ 迭代計數。如果我們現在看 $ F $ 我們得到 $ F(P,S,c,i)=U_1\oplus U_2\oplus\ldots\oplus U_c $ 這簡化為 $ U_1 $ 為我們的目的。最後我們看一下定義 $ U_1=\operatorname{PRF}(P,S|\operatorname{INT}(i)) $ - 和 $ \operatorname{INT}(i) $ 是一個固定長度的 32 位整數編碼。
將所有這些放在一起,我們看到 PBKDF2 具有 1 次迭代產生
$$ \operatorname{PRF}(P,S|\operatorname{INT}(1))|\operatorname{PRF}(P,S|\operatorname{INT}(2))|\ldots|\operatorname{PRF}(P,S|\operatorname{INT}(\ell)) $$
可以很容易地證明它是一個可變輸出長度的 PRF,其參數與用於證明 Counter-mode 安全的參數相同。
最後,使用均勻隨機密鑰作為密鑰的可變輸出長度 PRF 會產生與隨機字元串無法區分的輸出。我們需要在這裡做出的唯一假設是 HMAC-SHA512 實際上是一種安全的固定長度 PRF,但您不必擔心。