2008-11-19 141 views

回答

3

這當然是不可能的。許多人仍然使用散列作爲此目的,並且MD5是一種流行的算法,它爲文件提供了128位「簽名」,並且在文件內容發生更改時很可能發生更改。

在一般情況下,您需要查看文件的每一位以將其包含在散列中,並且性能可能會受I/O限制。它是對文件中所有數據的連續掃描,更新您爲每個新字節使用的任何散列算法的狀態。在現代CPU上,後者將比前者更快。在Pentium 90 MHz CPU上,This rather old analysis顯示約45 MB/s。

+0

你混了比特和字節。該網站顯示〜45 Mb/s而不是45 MB/s。每個字節2.0個時鐘是不現實的。現代CPU對於MD5每個字節管理大約5個時鐘。 – CodesInChaos 2013-01-13 15:04:07

16

如果我理解「用作Windows個人防火牆」的一部分,MD5並不是一個算法的好選擇。

對MD5算法存在成功的攻擊,它可以讓你找到一個不同的消息,產生相同的散列,相對較少的工作(與暴力相比)。 用於的攻擊沒有真正的方位,例如,當MD5被用來散列密碼等。與此同時,新的攻擊已被發現,所以MD5和SHA-1都可以以驚人的速度散列/衝突,並且用這些「老年」哈希破解整個「正確醃製」和單次哈希用戶密碼的數據庫不是隻有完全可行,但已被證明。
但是,在「確保該文件沒有被篡改」的特定應用中,這種攻擊有始終是一直是個問題,而不僅僅是最近。 MD5會很安全地檢測到一點點錯誤或者機密的修改,但是一個試圖繞過你的個人文件牆的惡意軟件,可以通過發現受感染二進制文件的衝突來避免你的整個安全問題,以便散列與原文匹配。

對於這種情況,您應該使用SHA-256在此期間[更新:,SHA-3不在,雖然我個人不同意NIST選擇贏家(或判決標準不明確淘汰一些非常優秀的第二輪候選人),那麼選擇使用SHA-3(Keccak)還是選擇SHA-3入圍者之一是更安全的選擇。所有的決賽選手都是經驗豐富的團隊精心設計的,都經過了深入分析,至今沒有一個真實的攻擊或一個已知的問題,可以想象會導致一個真實的攻擊,並且他們都有「更多的位」(這本身並不意味着太多,但更多的位並不會傷害)]。另外,記得除了哈希之外總是保存文件的長度,這樣即使是可忽略不計的成本,也會顯着加固糟糕的哈希。如果可以的話,計算兩個不同的哈希值。它是攻擊者更容易找到一些消息產生衝突一個散列比找到一個消息,產生衝突,並具有完全相同的長度,甚至是一個消息,在兩個不同的衝突哈希和長度相同。
由於帶寬(包括磁盤和內存)在計算散列值時是一個不可忽略的因素,因此甚至可能計算單個散列或兩個散列同時以相當的速度運行。
我在計算CRC時使用了塊密碼來加密相同的塊。 CRC是否被計算在整個運行時間上的差異小於1%,所以它基本上是一個自由操作。

如果你認爲你有沒有利用公知的標準哈希(性能限制?)一個強有力的理由,你可以建立自己的安全散列。使用Merkle-Damgård構造(或最近的HAIFA),可以將任何安全塊密碼變爲安全的散列函數。例如,使用一個固定密鑰用AES加密每個輸入塊,然後在輸出到下一個塊之前加密輸出塊。最後一個塊之後的輸出是你的散列值。

雖然「建立自己的」通常不是一個好主意,有可能確實是在這種情況下有效的原因,因爲AES是速度快,在最近的處理器硬件支持。在我的機器上,AES的運行速度大約爲130MB/s。在一個i7上(它有硬件支持),它在互聯網上的報告大約爲570MB/s。

至於是I/O限制,放鬆是對的,硬盤可以很好地限制因素,但它不需要是。內存映射是你的朋友,特別是在你的特殊情況下。

如果檢查申請在防火牆上權利的文件,那麼這些將是已經被加載到RAM中的可執行文件(怎麼可能會有什麼不同,他們正在執行的畢竟!)。因此,映射已經在RAM中的頁面將只是添加一個頁表項,或多或少是一個空操作。即使數據不在RAM中,內存映射的性能(和易用性)也是令人驚歎的,當速度有任何問題時,我很少使用其他任何東西。

+2

哦,我的這個問題是2歲!爲什麼沒有人告訴我,現在我覺得愚蠢... – Damon 2011-03-11 01:08:14