還帶一個MD5和還適用於檢查文件模糊嗎?我知道這是不安全的,但是在試圖找到文件模糊的情況下真的很重要嗎?做文件檢查時應該使用什麼算法來找到愚蠢?
我應該在SHA系列中使用某些東西嗎?
本用例的最佳實踐是什麼?
還帶一個MD5和還適用於檢查文件模糊嗎?我知道這是不安全的,但是在試圖找到文件模糊的情況下真的很重要嗎?做文件檢查時應該使用什麼算法來找到愚蠢?
我應該在SHA系列中使用某些東西嗎?
本用例的最佳實踐是什麼?
SHA1比MD5校驗和稍好。這是Git使用的。
MD5在這一點上有已知的漏洞,但這對您的應用程序可能不是問題。對於區分一堆比特還是很合適的。如果某些事情不匹配,那麼你知道你還沒有看到它,因爲算法是確定性的。如果某個事情回來作爲匹配,你應該實際上將它與表面上匹配的blob進行比較,然後再行動,就好像它真的是重複的一樣。 MD5速度相對較快,但如果您無法承擔散列衝突的全文比較,則應該使用更強大的散列,如SHA-256。
在這種特殊情況下,算法的選擇可能並不那麼重要。使用SHA1而非MD5的主要原因都與創建加密安全簽名有關。
對於此任務,MD5應該完全可以接受,因爲您可能不需要擔心惡意製作文件以產生錯誤重複的人。
雖然MD5確實有一些碰撞,但我一直使用它的文件,它的工作很好。
爲了描述目的,沒有真正的優選解決方案,兩個散列函數都能解決問題。無論如何,MD5通常會比SHA1快一點。
例在python:
#!/usr/bin/env python
import hashlib, cProfile
def repeat(f, loops=10000000):
def wrapper():
for i in range(loops): f()
return wrapper
@repeat
def test_md5():
md5 = hashlib.md5(); md5.update("hello"); md5.hexdigest()
@repeat
def test_sha1():
sha = hashlib.sha1(); sha.update("hello"); sha.hexdigest()
cProfile.run('test_md5()')
cProfile.run('test_sha1()')
#
# 40000004 function calls in 59.841 CPU seconds
#
# ....
#
# 40000004 function calls in 65.346 CPU seconds
#
# ....
你所談論的是一個校驗和,這是作爲一個加密散列涉及(但不相同)。
是的,只要您不關心惡意用戶故意製作兩個具有相同校驗和的不同文件,MD5甚至CRC都可以正常工作。如果該是一個問題,使用SHA1或,甚至更好,一些cryptographically unbroken散列。
如果你關心性能,我認爲最好首先檢查匹配的文件大小,然後使用快速哈希函數(CRC32或MD5,它應該比SHA1快)以及用這種方式嘗試重複的文件MD5,SHA1或SHA256(取決於任務的關鍵性)。
在我的工作中,我們使用MD5來確定您正在考慮的內容。很棒。我們只需要檢測每個用戶的重複上傳情況,這樣可以減少我們對birthday problem的曝光率,但是如果我們必須檢測所有上傳內容而不是每個客戶的重複數據,則對於我們來說,md5仍然足夠。如果你能相信互聯網,給定n個樣品和B的散列大小碰撞的概率p爲界:
p <= n (n - 1)/(2 * 2^b)
幾年前,我跑這個計算N = 10^9和b = 128並提出了p < = 1.469E-21。從這個角度來看,32年來10^9個文件是每秒一個。所以我們不會在發生碰撞時比較文件。如果md5表示上傳相同,則它們是相同的。