Key-Derivation
為什麼某些密鑰派生函式(如 PBKDF2)使用鹽?
讓我首先解釋一下我對這個問題所涉及的各種概念的理解:
- 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 之前無法進行,從而擊敗彩虹表。問題中指出了這一點。