Hash

雜湊函式是否一定需要允許任意長度的輸入?

  • January 12, 2021

我一直認為散列函式允許輸入任意長度,因為這就是我所知道的所有散列函式所做的。維基百科對雜湊函式的定義如下:

雜湊函式是可用於將任意大小的數據映射到固定大小值的任何函式。

但是,像bcrypt這樣的一些函式,它們將自己標記為密碼散列函式,定義了最大大小的輸入長度(在bcrypt的情況下,72 個字節)。這似乎是一個矛盾,並導致我想出兩種可能的解釋:

  1. 密碼散列函式雖然名稱相似,但不是散列函式。
  2. 任意長度的輸入不是雜湊函式的嚴格要求,只是一個共同特徵。

因此,我想知道如何解決這個明顯的矛盾。散列函式是否有必要允許任意長度的輸入?

散列函式是否有必要允許任意長度的輸入?

當然不是。SHA-256 僅限於 18,446,744,073,709,551,615 位或更少的輸入;它沒有為更大的輸入定義;由於此限制,SHA-256 不會被視為散列函式。

散列函式是否有必要允許任意長度的輸入?

雖然可以設計一個可以散列任意大小的散列函式,但沒有必要,因為不能輕易通過 $ 2^{64}-1 $ SHA-1、SHA-224 和 SHA-256 系列的限制,以及 $ 2^{128}-1 $ SHA-384、SHA-512、SHA-512/224 和 SHA-512/256 系列的限制。在標準化過程中,由於以下 MOV 攻擊,NIST 設置了NIST FIPS 180的限制(應用密碼學手冊;第 9 章,範例 9.23);

這些基於 Merkle-Damgård 構造,並且在末尾填充消息長度對於安全性是必要的(也稱為 MD 強化)。如果最後沒有填充消息大小,則內部衝突(在壓縮函式上)可以變成散列函式中的完全衝突。因此,由於長度填充,不同大小的文件將具有不同的雜湊值(參見MOV 攻擊)。有趣的是,您散列的文件越長(只需更改填充),內部衝突的可能性就越大,請參閱

相比之下,SHA-3(Keccak 是比賽的獲勝者,它基於 Sponge Construction)沒有限制(儘管SHA-3 比賽呼叫說;應支持最大消息長度至少 $ 2^{64}-1 $ 位

因此,儘管出於攻擊考慮和標準,有些需要限制;NIST 提供了更好的定義( NIST FIPS 202 #page9 )

散列函式是二進制數據(即位串)上的函式,其輸出長度是固定的(帶腳註:對於許多散列函式,輸入數據的長度有一個(非常大的)界限。)

梅內塞斯等。定義

更準確地說,散列函式 $ h $ 將任意有限長度的位串映射到固定長度的串,比如 $ n $ 位。

因此,無論是否受限,只要具有良好的抗原像性、抗二次原像性和抗碰撞性,都被認為是密碼散列函式,具有 $ \mathcal{O}(2^n) $ , $ \mathcal{O}(2^n) $ , 和 $ \mathcal{O}(2^{n/2}) $ 攻擊成本,分別。

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