Hash 什么时候CRC比MD5/SHA1更适合使用?

Hash 什么时候CRC比MD5/SHA1更适合使用?,hash,embedded,crc,Hash,Embedded,Crc,与MD5或SHA1等更现代的哈希函数相比,何时使用CRC进行错误检测比较合适?前者更容易在嵌入式硬件上实现吗?CRC32速度更快,有时还提供硬件支持(即在Nehalem处理器上)。实际上,只有当您与硬件接口时,或者如果您对性能要求非常严格时,才会使用CRC代码。CRC代码更简单、更快 您需要什么?CRC适用于检测数据中可能出现的随机错误,例如网络干扰、线路噪声、失真等 CRC的计算复杂度远低于MD5或SHA1。使用像MD5这样的散列函数对于随机错误检测来说可能是过分的。然而,使用CRC进行任何类

与MD5或SHA1等更现代的哈希函数相比,何时使用CRC进行错误检测比较合适?前者更容易在嵌入式硬件上实现吗?

CRC32速度更快,有时还提供硬件支持(即在Nehalem处理器上)。实际上,只有当您与硬件接口时,或者如果您对性能要求非常严格时,才会使用CRC代码。CRC代码更简单、更快


您需要什么?

CRC适用于检测数据中可能出现的随机错误,例如网络干扰、线路噪声、失真等

CRC的计算复杂度远低于MD5或SHA1。使用像MD5这样的散列函数对于随机错误检测来说可能是过分的。然而,使用CRC进行任何类型的安全检查都比使用更复杂的散列函数(如MD5)安全得多


是的,CRC更容易在嵌入式硬件上实现,您甚至可以在IC上获得不同的打包解决方案。

CRC32更快,哈希仅32位长

当您只需要快速、轻松的校验和时,请使用它。在以太网中使用CRC


如果您需要更高的可靠性,最好使用现代散列函数。

CRC是针对数据中的意外更改而设计的。 也就是说,它有助于检测无意错误,但作为确保数据未被恶意处理的一种方法,它将毫无用处


另请参见。

仅在计算资源非常紧张(即某些嵌入式环境)或需要存储/传输许多输出值且空间/带宽紧张时使用CRC(因为CRC通常为32位,其中MD5输出为128位,SHA1 160位,其他SHA变体高达512位)

切勿使用CRC进行安全检查,因为CRC很容易“伪造”

即使对于意外错误检测(而不是恶意更改检测),哈希也比简单的CRC好。部分原因是CRC的计算方法很简单(部分原因是CRC值通常比普通散列输出短,因此可能值的范围小得多),在存在两个或多个错误的情况下,一个错误将掩盖另一个错误,因此即使有两个错误,也会得到相同的CRC


简而言之:除非你有理由不使用合适的散列算法,否则不要使用简单的CRC。

你没有说你想要保护的是什么

CRC通常用于嵌入式系统中,作为防止意外数据损坏的检查,而不是防止恶意系统修改。CRC有用的地方的例子是在系统初始化期间验证EPROM映像,以防止固件损坏。系统引导加载程序将计算应用程序代码的CRC,并在允许代码运行之前与存储值进行比较。这可以防止程序意外损坏或下载失败

CRC也可以以类似的方式用于保护存储在闪存或EEPROM中的配置数据。如果CRC不正确,则可以将数据标记为无效,并使用默认或备份数据集。由于设备故障或用户在更新配置数据存储期间断电,CRC可能无效

有评论说,哈希比具有多个位错误的CRC提供更大的检测损坏的概率。这是事实,决定是否使用16位或32位CRC将取决于所使用的损坏数据块的安全后果,以及您是否能够证明数据块被错误声明为有效的概率为1/2^16或2^32


许多设备都有一个内置的CRC发生器,用于标准算法。来自德克萨斯州的MSP430F5X系列具有CRC-CCITT标准的硬件实现

有关实施、速度和可靠性的CRC信息,请参阅。它有CRC上的所有内容


除非有人试图恶意修改您的数据并隐藏更改,否则CRC就足够了。只要使用一个“好”(标准)的polinomial。

我最近遇到了一个使用CRC的方法,它很聪明。文件复制识别和删除工具的作者(与流行的exif工具jhead的作者相同)在第一次浏览文件时使用该工具。在每个文件的前32K上计算CRC,以标记看起来相同的文件,并且这些文件必须具有相同的大小。这些文件将添加到要对其进行完整二进制比较的文件列表中。它可以加快检查大型媒体文件的速度。

我发现一项研究显示。它还解释了该算法的实际特点。还包括对其他哈希算法的评估,是一个很好的参考

关于哈希CRC的相关结论:

CRC32从未打算用于哈希表。确实没有很好的理由将其用于此目的,我建议您避免这样做。 如果您决定使用CRC32,那么使用与输入关键八位字节的一端相反的散列位是至关重要的。这取决于具体的CRC32实施。不要将CRC32视为“黑盒”哈希函数,也不要将其用作通用哈希函数。确保测试每种应用的适用性

更新


网站似乎已经关闭了。尽管如此。

我在1.000.000循环中运行了这段PHP代码的每一行。结果在注释(#)中

我的结论是:

  • 需要时使用“crc32b”,并且 你不关心安全
  • 当您需要添加安全层时,请使用“sha256”(或更高版本)

  • 不要使用“md5”或“sha1”,因为它们具有:

  • 当您关心安全性时,会遇到一些安全问题
  • 当您只需要CRC时,它会比“crc32b”慢

让我们从基础开始

密码学中的一种散列算法
hash('crc32', 'The quick brown fox jumped over the lazy dog.');#  750ms   8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');#  700ms   8 chars
hash('md5',   'The quick brown fox jumped over the lazy dog.');#  770ms  32 chars
hash('sha1',  'The quick brown fox jumped over the lazy dog.');#  880ms  40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms  64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms  96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars
# Testing static text.

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real    0m0.845s
user    0m0.830s
sys     0m0.008s

$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real    0m1.103s
user    0m1.089s
sys     0m0.009s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real    0m1.132s
user    0m1.116s
sys   0m0.010s

# Testing random number. 

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(rand(0,$i));'
real    0m1.754s
user    0m1.735s
sys     0m0.012s\

$ time php -r 'for ($i=0;$i<1000000;$i++) md5(rand(0,$i));'
real    0m2.065s
user    0m2.042s
sys     0m0.015s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(rand(0,$i));'
real    0m2.050s
user    0m2.021s
sys     0m0.015s