Key-Derivation

為什麼某些密鑰派生函式(如 PBKDF2)使用鹽?

  • October 2, 2018

讓我首先解釋一下我對這個問題所涉及的各種概念的理解:

  • Salt:用作密碼散列函式的輔助輸入的隨機數據字節,如下所示:
hashfunc(<password>, <salt>) -> <hash>

然後將使用的 和都儲存起來(<hash>例如<salt>,在數據庫中)。

這可以防止使用彩虹表<salt>的攻擊,使有權訪問散列函式 ( + )輸出的攻擊者更難<hash>推斷出原始值<password>

  • 密鑰派生函式:一個以密碼<password>和整數<size>作為輸入的函式,並生成所需的任意字節<size>作為輸出,如下所示:
kdf(<password>, <size>) -> <bytes of length <size>>

這使我們可以將像“admin123”這樣的純文字密碼轉換為特定大小的密鑰,該密鑰可以被其他加密函式使用(例如 AES 加密,它需要大小為 32 的密​​鑰)。

因此,如果我的理解是正確的,那麼密鑰派生函式對鹽沒有用處。畢竟,派生的密鑰並不是要儲存的——它將被用作另一個加密函式的輸入,然後它就會被簡單地丟棄。除非有人在這麼短的時間內從電腦記憶體中竊取派生密鑰,否則不存在彩虹表攻擊的風險。

然而,根據wikipedia,PBKDF2 密鑰派生函式將鹽作為輸入:

PBKDF2密鑰派生函式有五個輸入參數:

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

這種鹽有什麼作用?我是否誤解了密鑰派生函式的目的?


相關問題:

  • PBKDF2 和 salt沒有回答我的問題,因為答案似乎假設派生密鑰將被儲存,根據我對密鑰派生函式的理解,這永遠不會發生。

與大多數基於密碼的密鑰派生函式一樣,PBKDF2 具有鹽輸入,因為這通常很有用。兩個例子:

  • 當使用 PBKDF2 作為密鑰派生函式時,salt 允許對多個派生密鑰(例如機密性密鑰和完整性密鑰)重複使用相同的主密鑰,每次使用具有不同的 salt。同樣,PBKDF2 可用於從主密碼和作為 salt 的站點名稱生成每個站點的密碼。
  • 當使用 PBKDF2 儲存訪問控制密碼令牌時,salt 將使暴力攻擊在已知 salt 之前無法進行,從而擊敗彩虹表。問題中指出了這一點。

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