在执行filechecksums查找欺骗时应该使用什么算法?

时间:2010-01-03 02:06:41

标签: language-agnostic md5 checksum duplicate-data sha

MD5总和还是适合检查文件欺骗吗?我知道它不安全,但在尝试查找文件欺骗的情况下,这真的很重要吗?

我应该在SHA系列中使用某些东西吗?

此用例的最佳做法是什么?

8 个答案:

答案 0 :(得分:6)

在这种特殊情况下,算法的选择可能并不那么重要。使用SHA1而非MD5的主要原因都与创建加密安全签名有关。

MD5对于此任务应该是完全可以接受的,因为您可能不需要担心人们恶意制作文件以生成错误的重复项。

答案 1 :(得分:2)

如果您关心性能我认为最好首先检查匹配的文件大小,然后使用快速哈希函数(CRC32或MD5应该比SHA1更快)以及可能的重复文件以这种方式尝试使用MD5 ,SHA1或SHA256(取决于任务的重要性)。

答案 2 :(得分:1)

SHA1的校验和略好于MD5。这是Git使用的。

答案 3 :(得分:1)

此时MD5已知漏洞,但这可能不是您的应用程序的问题。它对于区分成堆的比特来说仍然相当不错。如果没有匹配的东西,那么你知道你还没有看到它,因为算法是确定性的。如果某些东西作为匹配回来,你应该将它与表面上匹配的blob进行比较,然后再表现为真的重复。 MD5相对较快,但如果你无法承担哈希冲突的全文比较,你应该使用更强大的哈希,比如SHA-256。

答案 4 :(得分:1)

对于描述目的,没有真正优选的解决方案,两个哈希函数都将解决问题。无论如何,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
# 
# ....

答案 5 :(得分:1)

您所谈论的是校验和,它与加密哈希相关(但不相同)。

是的,MD5甚至CRC都可以作为校验和工作,只要您不关心恶意用户故意制作具有相同校验和的两个不同文件。如果 是一个问题,请使用SHA1,或者更好的是,使用一些cryptographically unbroken哈希值。

答案 6 :(得分:0)

虽然MD5确实有一些碰撞,但我总是把它用于文件,而且工作得很好。

答案 7 :(得分:0)

我们在工作中使用MD5正是您正在考虑的问题。效果很好。我们只需要根据每个客户检测重复上传,这会降低我们对birthday problem的曝光率,但如果我们必须检测所有上传而不是每个客户的重复项,则md5对我们来说仍然足够。如果您可以相信互联网,则给出n个样本和b的散列大小的碰撞的概率p受限于:

p <= n (n - 1) / (2 * 2 ^ b)

几年前,我对n = 10 ^ 9和b = 128进行了计算,得出p&lt; = 1.469E-21。从透视的角度来看,32年来每10 ^ 9个文件就是一个文件。因此,我们不会在发生碰撞时比较文件。如果md5表示上传内容相同,则它们是相同的。