CRC32 與低 32 位加密雜湊
昨天我正在和一位同事討論,他的教育和經驗超過了我。他昨天說了一些在直覺上對我來說聽起來不正確的事情,但我不知道反駁它。
他聲稱,安全加密散列在檢測篡改或損壞方面更好的唯一原因是因為它在輸出中有更多位(例如,SHA-256 的輸出為 256 位,而 CRC32 的輸出為 32 位)。 現在,我們只討論檢測損壞/篡改,而不是恢復數據。
我的直覺告訴我,如果選擇 CRC32 或 SHA256(並且只佔用低 32 位),就檢測更改的位而言,雜湊將更加安全(尤其是面對惡意和智能攻擊者,但即使是由於“以錯誤的方式”的腐敗)。
有人可以告訴我為什麼我錯了,兩者本質上是等價的,還是用數學和/或證明/推理來支持我的直覺?
如果我們談論的是惡意和聰明的攻擊者,那麼您大多是錯誤的,但並非出於您所期望的原因。
如果我們假設一個聰明的攻擊者,那麼 CRC 就沒有幫助;他們顯然可以修改文件,或者弄清楚如何更新 CRC32,或者如何確保修改不會更改 CRC。
另一方面,如果我們使用 SHA256 雜湊,那也好不了多少;如果他們也可以修改雜湊,那麼他們可以計算新文件的 SHA256,並用它替換該雜湊。如果他們無法修改文件的雜湊,那麼如果我們將雜湊截斷為 32 位,那麼他們可以嘗試修改文件 $ 2^{32} $ 不同的方式,併計算每種方式的雜湊值;他們很可能會找到使散列保持不變的修改。這顯然對攻擊者來說是更多的工作;但是,這可能是單台 PC 的周末項目。
因此,底線是在這種情況下,CRC 和 SHA256 的 32 位之間沒有太大區別。
而且,如果我們開始研究隨機變化,那麼在這種情況下,CRC 實際上可能會更強;如果一個隨機變化被完全隔離在一個 32 位的塊內,那麼 CRC 將始終檢測到該變化(因為 CRC 總是會變化);SHA256 將很有可能檢測到它 $ 1 - 2^{-32} $ .
我們對強完整性檢查的第一個答案是使用消息驗證碼;這假設生成 MAC 的實體和檢查損壞的實體共享一個密鑰(其他人沒有);這個密鑰被攪拌到生成的校驗和中,不知道密鑰的人不能修改消息和校驗和(比隨機猜測更好的機率)。