Cryptanalysis

PBKDF2 鹽和密碼排序

  • August 28, 2014

我目前正在閱讀有關 PBKDF2 的資訊,並且了解 salt 僅使用一次,而密碼在計算最終密鑰時多次使用(請參閱問題)。如果 和 的角色發生變化,PBKDF2 的完整性將如何password變化salt

PBKDF2 是為任意 PRF 定義的,但實際上通常使用 HMAC。使用 SHA-1(原始定義)、SHA-256(例如在scrypt中)甚至 SHA-512-256(NaCL)。所以首先你可以看看交換密鑰和消息是如何影響 HMAC 的。

HMAC 根據密鑰的長度有兩種情況:如果不超過雜湊的塊大小,則按原樣使用;如果它更長,則首先對其進行雜湊處理。之後,通過與 pads異或得到兩個鍵,最終函式是:

$$ H(k_1||H(k_2||m)) $$ 這導致兩個原因更喜歡定義的順序而不是交換的順序:

  1. 對於比塊大小短的每個鍵,都有一個等效鍵 $ k’ = k||0 $ ,其中附加了一個零字節。對於每個比塊大小長的密鑰,都有另一個密鑰 $ k’ = H(k) $ 這是等效的。

對於隨機生成的密鑰,甚至密碼,這些在實踐中並不重要。然而,如果你在那個位置使用了一條消息,它就會具有延展性——你可以將一條長消息與一條亂碼交換,並使用相同的 MAC 值。 2. 通過散列和/或異或的密鑰派生,以及兩個散列中每一個的初始塊可以為給定的密鑰計算一次並用於許多消息。在交換的順序中,一切都必須重新計算。

如果您使用恆定寬度的鹽,如 256 位隨機數,這些在 PBKDF2 中都不是問題。第一個只有在兩個不同的鹽可以碰撞時才會發生,這 - 除非實際的雜湊碰撞 - 要求它們的長度不同。第二個無關緊要,因為許多迭代都是用相同的 $ k $ 無論是密碼還是鹽。(交換使得針對一種鹽嘗試多個密碼的速度變得無關緊要。)

此外,交換順序不會使查找原像變得更容易,除非散列被破壞。由於原像阻力是密碼雜湊所關心的,因此交換參數的 HMAC 應該沒問題。

(上述情況並非適用於所有 MAC。例如,使用已知密鑰為 CBC-MAC找到一些原像是微不足道的。)

關於 PBKDF2 本身,還有一個額外的事實,即密碼(即 HMAC 密鑰)是每次雜湊迭代的一部分,而 salt只使用一次。這會影響雜湊可以進入的循環。使用恆定鹽作為 HMAC 密鑰,每個可能的密碼都將進入相同的循環集。因為它只發生在周圍 $ 2^{80} $ SHA-1 的迭代,這也無關緊要,即使它以某種方式可以利用。

總之,用 PBKDF2-HMAC 交換密碼和鹽似乎是安全的。使用另一個 PRF 可能是不安全的。將它們在 HMAC 中交換用於許多其他用途也是不安全的。但是,沒有充分的理由交換它們,因此您仍應使用正常的定義順序。

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