MD5与CRC32:哪一种更适合常用?

时间:2013-04-20 15:31:58

标签: algorithm hash

最近我在某处读到,虽然CRC32和MD5都足够均匀和稳定,但CRC32比MD5更有效。 MD5似乎是一种非常常用的散列算法,但如果CRC32速度更快/内存效率更高,那么为什么不使用它呢?

10 个答案:

答案 0 :(得分:42)

MD5 是一种 单向哈希 算法。 单向哈希 算法通常用于加密,因为它们具有(按设计)属性,很难找到产生特定哈希值的输入。具体而言,很难做出两个不同的输入,它们提供相同的单向散列。那些它们经常被用来表示自从生成哈希码以来没有故意改变大量数据。由于MD5是 单向哈希 算法,因此重点在于安全性超速。不幸的是,MD5现在被认为是不安全的。

CRC32 旨在检测数据的意外更改,通常用于网络和存储设备。这种算法的目的不是为了防止有意改变,而是为了捕获网络错误和磁盘写入错误等事故。这种算法的重点在于速度而不是安全性。

答案 1 :(得分:17)

来自Wikipedia's article on MD5(强调我的):

  

MD5是一种广泛使用的加密哈希函数

现在CRC32

  

CRC是错误检测代码

因此,正如您所看到的,CRC32 不是哈希算法。这意味着你不应该将它用于散列,因为它不是为此而构建的。

我认为谈论常用是没有多大意义的,因为类似的算法用于不同的目的,每个都有不同的要求。没有一种最适合常用的算法,相反,您应该选择最适合您特定用途的算法。

答案 2 :(得分:4)

CRC32和MD5之间的一个重要区别是,通常很容易选择CRC32校验和,然后提出一个哈希到该校验和的消息,即使对消息施加了约束,而MD5专门设计为使这种事情变得困难(虽然它显示了它的年龄 - 现在在某些情况下这是可能的)。

如果你的对手可能决定坐下来创建一堆带有指定CRC32哈希的消息,模仿其他消息,或者只是为了使哈希表执行得非常糟糕因为所有哈希值对于相同的值,那么MD5将是更好的选择。 (更好的是,恕我直言,HMAC-MD5将具有键控值,该值是使用它的模块所独有的,并且在其外部未知)。

答案 3 :(得分:3)

CRC用于防范随机错误,例如在数据传输中。

加密哈希函数旨在防止伪造消息的智能对手,尽管MD5在这方面已被打破。

答案 4 :(得分:3)

您应该使用128位长的MD5。 CRC32只有32位长,其目的是检测错误而不是散列事物。 如果您只需要一个32位散列函数,您可以选择由MD5返回的32位LSB / MSB / Whatever。

答案 5 :(得分:3)

CRC32(或CRC8或CRC16)用于任何目的的主要原因是它可以廉价地在硬件中实现,作为检测数据“随机”损坏的手段。即使在软件实现中,它也可以用作检测来自硬件原因(例如嘈杂的通信线路或不可靠的闪存介质)的数据的随机损坏的手段。它不是防篡改的,也不适用于测试两个任意文件是否可能相同:如果文件中的每个数据块后面紧跟着该块的CRC32(某些数据格式这样做),对于整个文件的CRC,chunk将与所有零字节的块一样具有相同的效果,无论该块中存储了什么数据。

如果有人能够快速计算CRC32,那么结合其他校验和或散列方法可能会有所帮助,如果具有相同CRC的不同文件在其他一个散列中可能会有所不同,反之亦然,但在许多机器上,相对于它们提供的保护量,其他校验和或散列方法可能更容易计算。

答案 6 :(得分:3)

这取决于你的目标。以下是CRC32与MD5可以完成的一些示例:

检测重复文件

如果要检查两个文件是否相同,CRC32哈希是要走的路,因为它比MD5快。但要小心:CRC只能可靠地告诉你二进制文件是否不同;它可靠地不会告诉你它们是否完全相同。如果为两个文件获取不同的哈希值,则它们不能是同一个文件,因此您可以非常快速地将它们拒绝为重复文件。

无论你的密钥是什么,CRC32哈希都将是2 ^ 32个不同的值之一。假设随机样本文件,两个给定文件的散列之间的冲突概率是1/2 ^ 32。 N个给定文件中任何一个之间发生冲突的概率为(N-1)/ 2 ^ 32。

检测恶意软件

如果安全性存在问题,例如下载文件并检查源的哈希值以查看它是否有效,则CRC是一个不好的选择。这是因为攻击者会制作具有相同CRC哈希值的恶意软件。在这种情况下,MD5更安全 - CRC不是为了安全。两个不同的二进制文件更可能具有与CRC哈希不同的MD5哈希。

保护用户身份验证的密码

同步(单向)加密通常比异步(双向)加密更容易,更快速,更安全,因此它是存储密码的常用方法。基本上,密码将与其他数据(盐)组合,有时用户名,然后哈希将在所有这些组合数据上完成。随机盐大大降低了两个密码相同的可能性。默认情况下,对于大多数算法,相同的密码将具有相同的哈希值,因此您必须添加自己的随机性。当然,盐必须在外部保存。

您无法看到的密码有什么用处?您不需要查看它来验证用户的帐户。您只需在登录时获取他们提供的信息。您可以使用他们的用户名来获取他们的盐。然后,将此salt与用户的凭据(密码和可能的用户名)组合以获取新的哈希值。如果它与数据库中的匹配,那么他们的登录成功。由于您要存储这些密码,因此它们必须非常安全。我没有提到初始化向量,迭代散列,随机性理论等等。

加密哈希计算比CRC更昂贵。此外,像sha256这样的更好的哈希更安全,但哈希更慢。顺便说一下,sha512散列比sha256快。

答案 7 :(得分:0)

一个人的共同点是另一个男人很少见。常见因您所在的领域而异。

如果您正在进行非常快速的传输或为小项目计算哈希码,那么CRC会更好,因为它们的速度要快得多,并且错误数据获得相同的16或32位CRC的可能性很小。

如果它是兆字节的数据,例如linux iso,那么你可能会丢失几兆字节,但仍然会得到相同的CRC。 MD5不太可能。因此,MD5通常用于大量转移。它更慢但更可靠。

所以基本上,如果你要做一个巨大的传输并在结尾检查你是否有正确的结果,使用MD5。如果要以小块传输,则使用CRC。

答案 8 :(得分:0)

我会说,如果您不知道要选择什么,请选择md5

不太可能使您头痛。

答案 9 :(得分:-1)

实际上,CRC32 不比MD5快

请查看:https://3v4l.org/2MAUr

该php脚本运行多个散列算法,并测量每个算法计算散列所花费的时间。它表明MD5通常是最快的哈希算法。并且,它表明在大多数测试用例中,即使SHA1也比MD5快。

所以,无论如何,如果你想做一些快速的错误检测,或寻找随机的变化......我总是建议使用MD5,因为它只是做到了。