最近我在某处读到,虽然CRC32和MD5都足够均匀和稳定,但CRC32比MD5更有效.MD5似乎是一种非常常用的散列算法,但如果CRC32速度更快/内存效率更高,那么为什么不使用它呢?
Ebb*_*sen 47
MD5是单向散列算法.单向散列算法通常用于加密,因为它们具有(按设计)属性,很难找到产生特定散列值的输入.具体而言,很难做出两个不同的输入,它们提供相同的单向散列.那些它们经常被用来表示自从生成哈希码以来没有故意改变大量数据.由于MD5是单向散列算法,因此重点在于安全性超速.不幸的是,MD5现在被认为是不安全的.
CRC32旨在检测数据的意外更改,通常用于网络和存储设备.此算法的目的不是为了防止有意改变,而是为了捕获网络错误和磁盘写入错误等事故.此算法的重点在于速度而非安全性.
svi*_*ick 17
来自维基百科关于MD5的文章(强调我的):
MD5是一种广泛使用的加密哈希函数
现在CRC32:
CRC是一种错误检测代码
因此,正如您所看到的,CRC32 不是哈希算法.这意味着你不应该将它用于散列,因为它不是为此而构建的.
我认为谈论常见用法没有多大意义,因为类似的算法用于不同的目的,每个都有不同的要求.没有一种算法最适合常用,相反,您应该选择最适合您特定用途的算法.
这取决于你的目标。以下是一些可以使用 CRC32 与 MD5 完成的示例:
检测重复文件
如果您想检查两个文件是否相同,CRC32 校验和是最佳选择,因为它比 MD5 快。但要小心:CRC 只能可靠地告诉您二进制文件是否不同;它不会告诉你它们是否相同。如果您为两个文件获得不同的哈希值,则它们不能是同一个文件,因此您可以非常快速地将它们拒绝为重复文件。
无论您的密钥是什么,CRC32 校验和都将是 2^32 个不同值之一。假设随机样本文件,两个给定文件的哈希之间的冲突概率为 1 / 2^32。N 个给定文件中任何一个之间发生冲突的概率是 (N - 1) / 2^32。
检测恶意软件
如果安全性是一个问题,例如下载文件并根据您的文件检查源的哈希值以查看二进制文件是否未损坏,那么 CRC 是一个糟糕的选择。这是因为攻击者可以制作具有相同 CRC 校验和的恶意软件。在这种情况下,MD5 摘要更安全——CRC 不是为了安全而设计的。两个不同的二进制文件比相同的 MD5 摘要更有可能具有相同的 CRC 校验和。
保护用户身份验证的密码
同步(单向)加密通常比异步(双向)加密更容易、更快、更安全,因此它是存储密码的常用方法。基本上,密码将与其他数据(盐)组合,然后对所有这些组合数据进行散列。随机盐大大降低了两个密码相同的机会。默认情况下,对于大多数算法,相同的密码将具有相同的哈希值,因此您必须添加自己的随机性。当然,盐一定要外存。
要登录用户,您只需获取他们登录时提供给您的信息。您可以使用他们的用户名从数据库中获取他们的盐。然后,您将此盐与用户的密码结合起来以获得新的哈希值。如果与数据库中的匹配,则他们的登录成功。由于您要存储这些密码,因此它们必须非常安全,这意味着 CRC 校验和是不可能的。
加密摘要的计算成本高于 CRC 校验和。此外,像 sha256 这样更好的散列更安全,但散列速度较慢并占用更多的数据库空间(它们的散列更长)。
CRC32和MD5之间的一大区别是,即使对消息施加了约束,通常也很容易选择一个CRC32校验和,然后提出一个哈希值加到该校验和的消息,而MD5是专门为实现这种目的而设计的。困难的事物(尽管它显示了它的年龄-现在在某些情况下是可能的)。
如果您处于一种情况下,对手可能会决定坐下来并创建带有指定CRC32哈希值的消息负载,以模仿其他消息,或者只是使哈希表的性能非常差,因为所有哈希值都相同值,那么MD5将是一个更好的选择。(恕我直言,更好的是HMAC-MD5,其密钥值对于使用该模块的模块而言是唯一的,而在其外部则是未知的)。