Encryption

使用帶有隨機鹽的 PBKDF2 導出密碼 IV 和密碼密鑰?

  • June 25, 2015

據說密碼 IV 不必是秘密的,加密方案的唯一秘密組件應該是密碼密鑰。

問題:使用 PBKDF2 函式生成 IV 是否安全,該函式將密碼和隨機生成的鹽作為輸入(方案 2)?還是我必須只使用與密碼無關的****完全隨機 IV (方案 1)?換句話說,方案 2 是比方案 1 更不安全、同樣安全還是更安全?

**注意:**要基於密碼/鹽生成熵,我使用此處描述的混合 PBKDF2/HKDF 方法,其中 PBKDF2 生成與使用的雜湊函式 (SHA-2) 具有相同長度的 PRK,然後擴展 PRK 以獲得足夠的熵來填充 KEY (方案 1)或 IV + KEY(方案 2)。

加密方案 1 範例 - 傳統方法:

  1. 輸入數據:密碼和消息(例如要加密的明文)。
  2. 生成完全隨機的 SALT(使用系統熵提供程序)。
  3. 生成完全隨機的 IV(使用系統熵提供程序)。
  4. 使用 Password 和 SALT 作為 PBKDF2/HKDF 函式的輸入,該函式根據輸入數據生成和擴展熵。
  5. 使用獲得的熵設置密碼 KEY,使用在步驟 3 中生成的 IV。
  6. 加密消息,向接收者發送 SALT + IV + 密文。

加密方案 2 的範例 - 使用 PBKDF2 生成 IV:

  1. 輸入數據:密碼和消息(例如要加密的明文)
  2. 生成完全隨機的 SALT(使用系統熵提供程序)。
  3. 使用 Password 和 SALT 作為 PBKDF2/HKDF 函式的輸入,該函式根據輸入數據生成和擴展熵。
  4. 使用獲得的熵來設置密碼IV和KEY。
  5. 加密消息,將 SALT + 密文發送給接收者。

對於解密,我們使用收到的 SALT(可能還有 IV - 如果使用方案 2),根據使用的方案設置密碼並解密消息。

那麼,方案 2 是否比方案 1 更不安全、同樣安全或更安全?在我看來,它不應該不那麼安全,因為對於每條消息 SALT、IV 和 KEY 都將完全不同。此外,IV 是不可預測的,因為要生成它,我們使用 SALT - 這是不可預測的,因為它被認為是完全隨機的。它可能更安全,因為在方案 1 中,攻擊者知道 SALT 和 IV,而在方案 2 中,攻擊者只知道 SALT。即使說 IV 不必保密,嘗試向攻擊者透露盡可能少的資訊不是更好嗎?

方案 2 能否比方案 1 更容易幫助攻擊者確定密碼?

它是安全的。IV 只需要與隨機的攻擊者沒有區別,只要鹽是隨機的。


有一點要注意:如果您提取的 key + iv 字節數比 PBKDF2 中的雜湊函式返回的多,那麼 PBKDF2 函式會執行兩次。然而,攻擊者只需要找到密鑰,而不是 IV,因此攻擊者不必這樣做,將迭代次數提供的安全性減半。

您可以使用 KBKDF(基於密鑰的密鑰派生函式)而不是直接提取來獲取密鑰和 IV。所以你會有:

S = PBKDF2(salt, password, iterations)
K = KBKDF(S, 'enc')
IV = KBKDF(S, 'iv')

一個好的 KBKDF 是 HKDF-expand。

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