Hash
單比特翻轉可以避免長度擴展攻擊嗎?
在我看來,長度擴展是可能的,因為在最後一次操作之後沒有執行任何特殊操作 - 例如在 Merkle-Damgård 構造中。MD構造基本上保證了處理每個塊後雜湊狀態是安全的,因此雜湊狀態可以直接用作雜湊函式的輸出。
狀態中的所有位都應取決於所有輸入位。這應該意味著要找到與現有雜湊值的漢明距離短的雜湊與找到漢明距離大得多的雜湊一樣困難。
因此,如果這個推理是正確的,那麼任何操作:
- 不影響雜湊的安全性;
- 不能簡化為對每個塊執行的操作;
應該能夠將允許長度擴展攻擊的雜湊轉換為不允許長度擴展攻擊的雜湊。
問題:
- 我的推理有問題嗎?對於雜湊的完整輸出,任何位翻轉是否足夠(見下面的註釋)?
- 如果就這麼簡單,有什麼理由沒有在 SHA-2 上執行嗎?長度擴展攻擊是否未知或未被視為問題?
- 如此愚蠢的簡單結構是否會成為 HMAC 的可行替代方案(與 $ K | M $ 作為輸入消息和靜態大小 $ K $ )?
注意:如果我的推理是正確的,翻轉一個位可以解決問題,但它的缺點是部分雜湊可能不會受到影響。翻轉每一位 - 以獲得雜湊值的補碼 - 應該也可以 - 我認為。
我犯的錯誤是翻轉輸出的一位(或所有位)仍然會洩漏散列函式的完整狀態,之後可以通過從給定的中間狀態更新更多數據來執行長度擴展攻擊。位翻轉當然很容易被對手逆轉。感謝fgrieu和yyyyyyy指出這一點。
執行最終計算可能仍然有效,但它當然不應允許攻擊者在最後一個塊被壓縮後檢索狀態。這意味著最終操作也必須是單向的。這不允許可以反轉的簡單指令,例如 XOR(與已知數據)。