很多文件將存儲在數據庫中,我需要文件散列來唯一標識該文件未被更改。 (通常,將用作Windows個人防火牆部分)計算文件散列的最快方法?
回答
這當然是不可能的。許多人仍然使用散列作爲此目的,並且MD5是一種流行的算法,它爲文件提供了128位「簽名」,並且在文件內容發生更改時很可能發生更改。
在一般情況下,您需要查看文件的每一位以將其包含在散列中,並且性能可能會受I/O限制。它是對文件中所有數據的連續掃描,更新您爲每個新字節使用的任何散列算法的狀態。在現代CPU上,後者將比前者更快。在Pentium 90 MHz CPU上,This rather old analysis顯示約45 MB/s。
如果我理解「用作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歲!爲什麼沒有人告訴我,現在我覺得愚蠢... – Damon 2011-03-11 01:08:14
- 1. Android,從文件中計算SHA-1散列,最快的算法
- 2. 計算行列式的最快方法?
- 3. 在.NET 4.0中計算文件夾文件的最快方法
- 4. 最快的方法來計算文件中的行數
- 5. 最快的方法來計算卷積
- 6. 什麼是計算Windows文件夾大小的最快方法?
- 7. 計算散列的速度有多快?
- 8. 無法計算散列
- 9. 最快的方法來計算點對之間的列表
- 10. 散列磁盤映像中單個文件的散列計算
- 11. 最快的方式進行散列
- 12. 最快的算法來計算數量
- 13. 小文件的散列算法
- 14. 使用python計算文章中單詞列表的最快方法
- 15. 用於文件檢測的最佳散列算法
- 16. 用Python計算最多10億的最快方法
- 17. 散列碼計算
- 18. 散列字符串的最佳算法
- 19. 迭代散列中密鑰的最快方法
- 20. 將散列表映射到磁盤上的最快方法
- 21. 比較Python3中散列位的最快方法是什麼?
- 22. 散列算法
- 23. 用於指紋數組的最快方法(從數據數組中計算唯一散列)
- 24. PhpED:打開文件的最快方法?
- 25. 什麼是計算32的冪對數的最快方法?
- 26. 最快的方法來計算兩個CGPoints之間的距離?
- 27. OOP設計 - 分散文件中的分散方法
- 28. 在Lucene中計算所有結果的最快方法(java)
- 29. 計算圖像「視覺」校驗和的最快方法
- 30. 什麼是計算ε閉包的最快方法?
你混了比特和字節。該網站顯示〜45 Mb/s而不是45 MB/s。每個字節2.0個時鐘是不現實的。現代CPU對於MD5每個字節管理大約5個時鐘。 – CodesInChaos 2013-01-13 15:04:07