雜湊可以有多個輸入嗎?
從定義的角度來看,散列算法可以有多個輸入,例如: $ H(m_1, m_2, m_3) $ ?
如果不是,為什麼像 bcrypt、scrypt 和 pbkdf2 這樣的算法被稱為密碼散列算法?
散列函式的標准定義是從任意長度的位串到恆定長度的位串。也就是說,只有一個輸入。密碼散列,如鍵控散列(MAC或多或少),有多個輸入。那裡沒有矛盾,因為密碼散列不是加密散列 - 認為它們可能是從像 PBKDF2 這樣的加密散列建構的(反之亦然)。
(密碼雜湊被稱為很大程度上是出於歷史原因。普通雜湊函式曾經用於相同目的,但這不是一個好主意。)
在實踐中,您會發現雜湊函式確實有多個輸入的符號。這通常意味著輸入被編碼為一個,然後通過散列函式傳遞。編碼可以像連接一樣簡單,也可以添加一些額外的東西來使輸入唯一併防止衝突。
輸入數量
散列算法通常需要多個輸入。例如,SCrypt 需要 5,但只有一個欄位表示要散列的數據。其餘的是鹽和硬度配置值。
對多個數據欄位進行雜湊處理實際上沒有任何意義,因為大多數現代雜湊算法都需要一個唯一值(鹽)與每個欄位相關聯。所以你最終會得到類似的東西 $ Hash(m_1, s_1, m_2, s_2, …) $ .
或者,如果您正在考慮在散列之前連接輸入,那麼這樣做不是散列函式的工作。
最後,必須獨立處理所有單獨的輸入,因為數據的散列僅代表該數據,而不是其上下文。
*底線:*雜湊函式已經有多個輸入,但一次只處理一個數據。
密碼雜湊
通常,您希望雜湊函式執行得非常快,以限制其對整個系統的影響。
但是對於密碼雜湊,情況恰恰相反。原因很簡單:假設攻擊者嘗試使用多個密碼來獲得一些訪問權限。輸入的雜湊值與實際密碼的雜湊值進行比較。因此,使用長散列函式來計算極大地限制了攻擊者可以執行的嘗試次數。
您引用的算法具有各種機制,以確保一個人不能太快地執行這些功能(即使在並行計算時)。你應該檢查他們的規格。
*底線:*雖然密碼散列函式確實是散列函式,但它們具有其他屬性,使其適用於密碼散列 (duh),但不適用於一般散列目的。