hash 嘉義市悠遊卡 - MD5是否仍然足以唯一地識別文件?




嘉義市民卡優惠 (9)

MD5哈希一個文件仍然被認為是一個足夠好的方法來唯一標識它給予所有的破壞MD5算法和安全問題等? 安全性不是我最關心的問題,但唯一標識每個文件是。

有什麼想法嗎?


Answers

當散列短(<K幾個K)字符串(或文件)時,可以創建兩個md5散列鍵,一個用於實際字符串,另一個用於字符串反向與短不對稱字符串連接。 例如:md5(reverse(string ||'1010'))。 添加額外的字符串可確保即使是由一系列相同位組成的文件也會生成兩個不同的密鑰。 請理解,即使在此方案下,兩個散列密鑰對於不相同的字符串而言是相同的理論上的機會,但概率似乎非常小 - 按照單個MD5衝突概率的平方的順序,並且節省時間在文件數量不斷增長的情況下可能相當可觀。 也可以考慮製作第二個字符串的更精細的方案,但我不確定這些方案是否會顯著提高賠率。

要檢查衝突,可以運行此測試以獲取db中所有bit_vector的md5哈希鍵的唯一性:

使用bit_vector從db中選擇md5(bit_vector),count(*),bit_and(bit_vector)
由md5(bit_vector)組成,具有bit_and(bit_vector)<> bit_vector的bit_vector


出於實際的目的,所創建的散列可能是適當的隨機數,但理論上總是有碰撞的概率,這是由於Pigeonhole原理 。 具有不同的散列值意味著這些文件是不同的,但獲得相同的散列值並不一定意味著這些文件是相同的。

為此目的使用哈希函數 - 無論安全性是否擔憂 - 因此應始終只是檢查的第一步,特別是如果已知哈希算法容易產生衝突。 要可靠地找出兩個具有相同散列的文件是否不同,則必須逐字節比較這些文件。


如果你沒有對手,MD5就足夠了。 但是,有人可以(故意)創建兩個散列到相同值(稱為衝突)的不同文件,這可能會也可能不會成為問題,具體取決於您的具體情況。

由於知道已知的MD5弱點是否適用於給定的上下文是一件微妙的事情,因此建議不要使用MD5。 使用抗碰撞散列函數(SHA-256或SHA-512)是安全的答案。 同樣,使用MD5也是不好的公共關係(如果你使用MD5,你必須準備好證明自己;而沒有人會質疑你使用SHA-256)。


我不會推薦它。 如果應用程序可以在多用戶系統上工作,那麼可能會有用戶,這將有兩個文件具有相同的md5哈希值(他可能是工程師,使用這些文件播放,或者只是好奇 - 他們很容易從http://www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html ,我自己在寫這個答案的時候下載了兩個樣本)。 另一件事是,有些應用程序可能會出於任何原因存儲這樣的副本(我不確定,如果有任何這樣的應用程序,但存在可能性)。

如果您唯一識別您的程序生成的文件,我會說使用MD5是可以的。 否則,我會推薦其他沒有碰撞的其他散列函數。


就我個人而言,我認為人們使用原始校驗和(挑選你的方法)其他對像作為唯一標識符太多時,他們真正想要做的是有唯一的標識符。 指定一個對像用於此用途不是意圖,並且可能比使用uuid或類似的完整性機制需要更多的思考。


MD5已被破壞,您可以改用SHA1(用大多數語言實現)


我喜歡將MD5視為存儲大量文件數據時的概率指標。

如果哈希值相等,那麼我知道我必須逐字節比較文件,但由於錯誤原因,這可能只發生幾次,否則(哈希值不相等)。我可以肯定,我們正在討論兩個不同的文件。


是。 從安全角度來看,MD5已經被徹底打破,但意外碰撞的可能性仍然很小。 只要確保這些文件不是由您不信任的人創建的,並且可能有惡意的意圖。


那麼等一下,是這樣的:

md5(filename) + timestamp

要么:

md5(filename + timestamp)

如果是前者,你就是通往GUID的大部分途徑,我不會擔心它。 如果是後者,那麼請參閱Karg的文章,了解最終如何碰撞碰撞。





hash md5