Aes

隨機鹽和 PBKDF2 密鑰

  • October 22, 2020

假設我寫了一個函式$$ (salt,IV ) = \text{keyIVGenerator}(passwd) $$它生成大小為 32 字節的隨機鹽和大小為 16 字節的隨機初始化向量 (IV)。然後,使用 PBKDF2 之類的密鑰派生函式 (KDF) 生成長度為 32 字節的密鑰 (dkLen=32)。

$$ key = PBKDF2(password, salt, deLen) $$

我創建了一個函式 $$ c = encryption(key,data,IV) $$,假設數據填充(使用 aes CBC)正確完成並且邏輯正確。

當我要求使用者加密和數據時,我將密碼傳遞給函式 $ keyIVGenerator(passwd) $ 得到 $ IV,key $ , 和 $ passwd $ 他們到 $ encryption(key,data,iv) $ 連同數據。加密有效。

現在假設我必須解密數據,我需要傳遞與 PBKDF2 生成的密鑰相同的密鑰,以進行加密以解密我的數據。iv 被添加到密文中。

但是鹽呢。

如果我將使用者請求的密碼傳遞給 $ keyIVGenerator(passwd) $ 它將使用新的隨機鹽生成一個新密鑰,因此數據不會被解密。

我是否也應該將我的鹽添加到密文中?我應該保留鹽的數據庫嗎?

如何從 PBKDF2 生成相同的密鑰?

是的,通常鹽是密文的前綴。

原則上,您總是為每個鹽生成一個新密鑰,因此您可能不需要 IV。然而,我會使用 PBKDF2 的輸出來創建一個隨機的 IV 和密鑰(例如,使用 SHA-512,然後使用最左邊的 32 個作為密鑰,接下來的 16 個字節作為 IV)。

也可以在 PBKDF2 的輸出上使用 HKDF 從生成的中間密鑰中分離出數據密鑰和 IV(這更簡潔,但也更難實現)。


筆記:

  • 使用 GCM 等經過身份驗證的模式是個好主意。在這種情況下,IV 應該是 12 個字節。
  • dkLen被指定為位,而不是字節 - 至少在標準中。密鑰大小通常是。
  • 16 字節的鹽通常就足夠了,但 32 字節也可以(它應該仍然適合 SHA-256 的單個塊,因此它可能不會影響散列函式和迭代計數創建的工作因子)。

引用自:https://crypto.stackexchange.com/questions/85712