Hash
SHA1 與 MD5 有何不同?
從表面上看,SHA1 和 MD5 看起來非常相似。他們的圖表包括位塊、位旋轉、異或和特殊功能。它們的實現長度大致相同(至少我見過的那些)。然而眾所周知,MD5 已損壞,但目前 SHA1 尚未損壞。
安全性與增加的回合數有區別嗎?與 MD5 的 64 相比,SHA1 有 80。或者它是更大的摘要大小?SHA1 似乎被描述為“更保守”,但我不確定這意味著什麼。
MD5 和 SHA-1 有很多共同點;SHA-1 顯然受到 MD5 或 MD4 或兩者的啟發(SHA-1 是 SHA-0 的更新檔版本,於 1993 年發布,而 MD5 在 1992 年被描述為 RFC)。
主要結構差異如下:
- SHA-1 具有更大的狀態:160 位與 128 位。
- SHA-1 有更多輪次:80 對 64。
- SHA-1 輪有一個額外的位旋轉,狀態字的混合略有不同(主要是為了解釋第五個字)。
- 按位組合函式和舍入常數是不同的。
- SHA-1 中的位旋轉計數對於所有輪次都是相同的,而在 MD5 中,每個輪次都有自己的旋轉計數。
- 消息詞在 SHA-0 和 SHA-1 中進行了預處理。在 MD5 中,每一輪都使用 16 個消息詞中的一個“原樣”;在 SHA-0 中,16 個消息字通過一種逐字線性回饋移位寄存器擴展為 80 個派生字。SHA-1 還為這些字推導添加了位旋轉。
額外的位旋轉是 SHA-1 與 SHA-0 不同的原因。它還使 SHA-1 對碰撞攻擊的抵抗力更強,事實上,已經發現了 SHA-0 碰撞(努力 $ 2^{39} $ ,因此非常可行),而 SHA-1 衝突要困難得多。
**我們沒有真正的理論來說明什麼使散列函式變得強大。**但是,我們仍然可以有一些“直覺”,我自己的直覺告訴我,在類似 MD 的函式(MD4、MD5、SHA-0、SHA-1 和 SHA-2 函式)的情況下,這兩個重點是:
- 旋轉位很多。基於差分路徑的碰撞攻擊試圖誘導微小的差異,並防止它們到處非線性傳播;一個有用的工具是在逐字加法中沒有超出高位的進位(加法模的一個操作數中的高位不同) $ 2^{32} $ 以機率傳播到輸出 $ 1 $ ; 兩個這樣的差異可靠地相互抵消)。SHA-1 中添加的 1 位旋轉有效地使差分路徑更難找到。
- 做“足夠的工作”。如果計算每個輸入字節的基本操作數(或多或少會轉化為程式碼大小或速度,尤其是在 GPU 上),您會發現 SHA-1 比 MD5 重約 30%,而 SHA-256 接近比 SHA-1 重兩倍。通常,SHA-3 候選者也比 SHA-1“重”(有些可以通過利用 CPU 中的 SIMD 操作碼變得更快,但每個輸入字節仍有更多操作)。