2010-08-14 35 views
4

識別二進制文件的最有效方法是什麼?我想從二進制文件中提取某種簽名,並用它與其他人進行比較。如何有效識別二進制文件

蠻力的方法是使用整個文件作爲簽名,這將耗時太久,太多的記憶。我正在尋找一個更智能的方法來解決這個問題,並且我願意犧牲一點精確度(但不是太多,但不是太高)來提高性能。

(而Java代碼的實例優選,鼓勵語言無關的答案)

編輯:掃描整個文件來創建一個散列有更大的文件,時間越長的缺點。由於散列不會是唯一的,我想知道是否有更有效的方法(即:均勻分佈的字節採樣中的散列)。

+0

「既然哈希將不唯一反正」 - 你什麼意思?在所有文件中哈希不可能是唯一的,但是對於密碼安全的哈希函數,您永遠不會遇到碰撞。 – 2010-08-16 11:03:23

+0

我的意思是說,如果結果不是唯一的,也許讀取整個文件是不必要的。我認爲在讀取一個60MB文件以產生一些字節的散列時必須有一些冗餘。 – hpique 2010-08-16 16:52:50

回答

10

我發現這種方法有效的方法是計算兩個SHA-1散列。一個用於文件中的第一個塊(我隨意選取512個字節作爲塊大小),另一個用於整個文件。然後我將這兩個哈希與一個文件大小一起存儲。當我需要識別文件時,我會首先比較文件長度。如果長度匹配,那麼我會比較第一個塊的散列,如果匹配,我比較整個文件的散列。前兩個測試很快就淘汰了很多不匹配的文件。

+0

+1好策略 – NullUserException 2010-08-14 12:45:38

+0

現在我們正在談論。 :) – hpique 2010-08-14 12:45:52

3

這就是hashing是。見MessageDigest

注意,如果您的文件過大在內存中讀取,這是可以的,因爲你可以養活文件塊的哈希函數。例如,MD5和SHA1可以佔用512位的數據塊。

此外,兩個文件具有相同的哈希值不一定相同(這是非常罕見的,他們是不是雖然),但兩個文件是相同的具有一定相同的散列。

2

通常的答案是使用MD5,但我想表明,有太多的衝突在現代應用程序中使用MD5:http://www.mscs.dal.ca/~selinger/md5collision/

SHA-1在十多年前取代MD5。

2005年NIST建議在2010年之前應該使用SHA-2來代替SHA-1,因爲已經完成了證明SHA-1降低變體衝突的工作。 (這是非常好的遠見,因爲它是now known,它需要2^51的工作來找到碰撞,理想情況下需要2^80的工作來找到碰撞。)

所以請根據你想要的(請選擇),SHA-1(我明白,但我們可以做得更好),以及SHA-2(選擇我!接我!),以及其他可能需要互操作的程序。

0

你要考慮到使用頭標識。 如果你能以這種方式設計你的文件,這將是快速和可靠的。 使用一個字節,你可以區分255個文件類型;)

+0

不幸的是,我不能假設這些文件太多。 – hpique 2010-08-14 12:36:53

相關問題