使用帶有隨機鹽的 PBKDF2 導出密碼 IV 和密碼密鑰?
據說密碼 IV 不必是秘密的,加密方案的唯一秘密組件應該是密碼密鑰。
問題:使用 PBKDF2 函式生成 IV 是否安全,該函式將密碼和隨機生成的鹽作為輸入(方案 2)?還是我必須只使用與密碼無關的****完全隨機 IV (方案 1)?換句話說,方案 2 是比方案 1 更不安全、同樣安全還是更安全?
**注意:**要基於密碼/鹽生成熵,我使用此處描述的混合 PBKDF2/HKDF 方法,其中 PBKDF2 生成與使用的雜湊函式 (SHA-2) 具有相同長度的 PRK,然後擴展 PRK 以獲得足夠的熵來填充 KEY (方案 1)或 IV + KEY(方案 2)。
加密方案 1 範例 - 傳統方法:
- 輸入數據:密碼和消息(例如要加密的明文)。
- 生成完全隨機的 SALT(使用系統熵提供程序)。
- 生成完全隨機的 IV(使用系統熵提供程序)。
- 使用 Password 和 SALT 作為 PBKDF2/HKDF 函式的輸入,該函式根據輸入數據生成和擴展熵。
- 使用獲得的熵設置密碼 KEY,使用在步驟 3 中生成的 IV。
- 加密消息,向接收者發送 SALT + IV + 密文。
加密方案 2 的範例 - 使用 PBKDF2 生成 IV:
- 輸入數據:密碼和消息(例如要加密的明文)
- 生成完全隨機的 SALT(使用系統熵提供程序)。
- 使用 Password 和 SALT 作為 PBKDF2/HKDF 函式的輸入,該函式根據輸入數據生成和擴展熵。
- 使用獲得的熵來設置密碼IV和KEY。
- 加密消息,將 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。