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