2010-10-26 81 views
9

用於檢測損壞的文件完整性檢查(校驗和)最合適的散列函數是什麼?合適的散列函數檢測數據損壞/檢查數據完整性?

我需要考慮以下幾點:

文件大小(1 KB至10GB +)
許多不同的文件類型的
文件的大集合(+/- 100 TB和不斷增長)的大範圍

更大的文件是否需要更高的摘要大小(SHA-1 vs SHA 512)?

我看到SHA系列被稱爲加密散列函數。它們是否適合「通用」用途,如檢測文件損壞?像MD5或虎會更好嗎?

如果惡意篡改也是一個問題,您的答案會改變w.r.t最合適的散列函數嗎?

外部庫不是一個選項,只有Win XP SP3 +上可用的內容。

自然表現也值得關注。

(請原諒我的術語,如果它是不正確的,我在這個問題上的知識是非常有限的)。

回答

15

任何加密散列函數,即使是破碎的散列函數,都可以很好地檢測意外損壞。給定的散列函數可以僅針對直至某個限制的輸入來定義,但是對於所有的標準散列函數,該限制至少爲2位,即大約2百萬兆兆字節。這相當大。

文件類型沒有任何發生。散列函數對比特序列(或字節)進行操作,而不管這些比特代表什麼。

散列函數的性能不太可能成爲問題。即使是「慢」哈希函數(例如SHA-256)在典型PC上的運行速度也會高於硬盤:讀取文件將成爲瓶頸,而不是散列(2.4 GHz PC可以SHA-512以一定速度散列數據接近200 MB/s,使用單個內核)。如果散列函數的性能是一個問題,那麼你的CPU非常微弱,或者你的磁盤是快速的SSD(如果你有100TB的快速SSD,那麼我就有點嫉妒)。在這種情況下,一些哈希函數比其他函數要快一些,MD5是「快速」函數之一(但是​​更快,並且它的代碼可以很容易地包含在任何應用程序中,而且沒有太多麻煩)。

如果惡意篡改是一個問題,那麼這就成爲一個安全問題,而這更加複雜。首先,您希望使用加密不間斷散列函數之一,因此SHA-256或SHA-512,而不是MD4,MD5或SHA-1(在MD4,MD5和SHA-1中發現的弱點可能不適用於特定情況,但這是一個微妙的問題,最好是保證安全)。然後,根據攻擊者是否可以訪問散列結果,散列可能會或可能不足。可能地,您可能需要使用MAC,它可以被看作是一種鍵控散列。 HMAC是一種用散列函數構建MAC的標準方式。還有其他非基於哈希的MAC。此外,MAC使用祕密的「對稱」密鑰,如果您希望某些人能夠驗證文件完整性而不能執行無提示更改,則這不合適;在這種情況下,你將不得不求助於數字簽名。簡而言之,在安全環境中,您需要使用明確定義的攻擊模型進行全面的安全分析。

+0

優秀的答案!非常感謝。 – links77 2010-10-27 07:17:46