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

有帮助吗?

解决方案

CRC正常工作,用于检测数据的随机误差可能发生的,例如,从网络的干扰,线路噪声,失真等。

CRC比MD5或SHA1复杂计算要少得多。使用诸如MD5散列函数可能是矫枉过正的随机误差检测。然而,使用CRC对于任何种类的安全检查将是要比更复杂的散列函数的安全性较低,如MD5。

是的,CRC是嵌入式硬件来实现更容易,你甚至可以在IC得到这个不同的打包解决方案。

其他提示

CRC被设计针对在数据无意的变化。 也就是说,它是很好的检测无意的错误,但将会变得毫无用处,确保数据不被恶意处理的方式。

另请参见

我发现了一个研究显示怎样的不当的CRC哈希值是的哈希表。这也解释了算法的实际特点。 研究还包括其他的哈希算法的评估,是一个很好的参考,以保持。

在CRC相关结论为散列:

  

CRC32从未用于哈希表的使用。实在是没有什么理由使用它用于此目的,我建议你避免这样做。   如果你决定使用CRC32,它的关键是你使用散列位从一端相反,在这关键八位组供电。这到底是依赖于具体的实施CRC32。不要把CRC32作为一个“黑盒子”的哈希函数,并且不使用它作为一个通用的哈希值。一定要测试是否适合它的每个应用程序。

<强>更新

看来该网站是下跌。该互联网档案库副本虽然。

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

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

我的结论:

  • 需要时使用“crc32b” http://en.wikipedia.org/wiki/Cyclic_redundancy_check 和 你不关心安全。
  • 当您需要添加安全层时,请使用“sha256”(或更高版本)。

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

    1. 当你关心安全时一些安全问题
    2. 当您只需要 CRC 时,哈希字符串更长并且比“crc32b”慢

你不说这是什么,你试图保护。

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

一个CRC,也可以以类似的方式用于保护存储在FLASH或EEPROM配置数据。如果CRC不正确,则可以将数据标记为无效,并使用了默认或备份数据集。 CRC可以是无效的,由于设备故障,或如果用户配置数据存储的更新过程中移除功率。

已经有一个散列提供了检测腐败比CRC与多个位错误的概率较大的意见。这是真实的,以及所使用的是否要使用16位或32位CRC将在一个损坏的数据块的安全后果铰链的决定,你是否可以证明的1 2 ^ 16或2 ^ 32的机会数据块被错误地宣布有效。

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

CRC32是更快和散列只有32位长。

使用它时,你只是想快速和光校验。 CRC是在以太网使用。

如果你需要更多的可靠性,这是最好使用现代的散列函数。

这完全取决于您的要求和期望。

以下是这些之间的快速简短差异 哈希函数 算法:

CRC (CRC-8/16/32/64)

  • 不是 加密哈希算法(它使用基于循环冗余检查的线性函数)
  • 可以产生 9、17、33 或 65 位
  • 不打算用于加密目的,因为不提供加密保证,
  • 不适合在数字签名中使用,因为它很容易逆转2006,
  • 不应用于加密目的,
  • 不同的字符串可以产生碰撞,
  • 于 1961 年发明并用于以太网和许多其他标准,

MD5

  • 是一种加密哈希算法,
  • 生成 128 位(16 字节)哈希值(32 位十六进制数)
  • 它是一个加密哈希,但如果您担心安全性,则认为已弃用,
  • 已知字符串具有相同的 MD5 哈希值
  • 可用于加密目的,

SHA-1

  • 是一种加密哈希算法,
  • 生成一个 160 位(20 字节)哈希值,称为消息摘要
  • 它是一个加密哈希,自 2005 年以来,它不再被认为是安全的,
  • 可用于加密目的,
  • 已发现 sha1 碰撞的示例
  • 首次发布于 1993 年(作为 SHA-0),然后于 1995 年作为 SHA-1,
  • 系列:SHA-0、SHA-1、SHA-2、SHA-3、

    总之,对于资金充足的对手来说,使用 SHA-1 不再被认为是安全的,因为在 2005 年,密码分析学家发现了对 SHA-1 的攻击,这表明它可能不够安全,无法持续使用施奈尔. 。我们。NIST 建议联邦机构在需要抗碰撞的应用中应停止使用 SHA1-1,而必须在 2010 年之后使用 SHA-2美国国家标准技术研究所.

因此,如果您正在寻找简单快速的解决方案来检查文件的完整性(防止损坏),或者为了性能方面的一些简单缓存目的,您可以考虑 CRC-32,对于散列,您可以考虑使用MD5,但是如果您正在开发专业应用程序(应该是安全且一致的),为了避免任何冲突概率 - 使用 SHA-2 及更高版本(例如 SHA-3)。

表现

PHP 中的一些简单基准测试:

# 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

有关的:

仅使用CRC如果计算资源非常紧张(即一些嵌入环境)或需要存储/传输许多的输出值和空间/带宽是紧(如结直肠癌通常是32位,其中一个MD5输出是128位,SHA1 160位,以及其它变体SHA多达512个位)。

不要使用CRC进行安全检查的CRC是很容易的“假”。

即使偶然误差检测(而不是恶意的变化检测)散列比简单的CRC更好。部分原因是简单的方法来计算一个CRC(部分是因为CRC值比普通的散列输出通常短所以有一个更小范围的可能值),它是更可能的是,在一个情况下有两个或更多的错误,所以你用相同的CRC尽管两个错误结束了一个错误将掩盖另一种。

在短:除非你有原因的的使用一个体面的哈希算法,避免简单的CRC

我碰到一个使用CRC的最近这很聪明。在 jdupe 文件重复的识别和清除工具的作者(同一作者流行的EXIF工具jhead的)第一次通过文件中使用它。一个CRC计算的每个文件的第一个32K的标记,似乎是相同的文件,也文件必须具有相同的大小。这些文件被添加到文件上做了充分的二进制比较的列表。它加快了检查大的媒体文件。

CRC32是方式更快,有时具有硬件支持(即上Nehalem处理器)。真的,唯一的一次,你会使用它,如果你与硬件接口,或者如果你的真正的紧性能

让我们从基础开始。

在密码学中,哈希算法通过摘要操作将许多位转换为更少的位。哈希用于确认消息和文件的完整性。

所有散列算法都会产生冲突。 冲突是指多个多位组合产生相同的较少位输出。散列算法的加密强度是由个人无法确定给定输入的输出是什么来定义的,因为如果他们可以的话,他们可以使用与合法文件匹配的散列来构建文件并损害假定的完整性系统的。CRC32 和 MD5 之间的区别在于 MD5 生成更大的哈希值,更难以预测。

当您想要实现消息完整性(即消息在传输过程中未被篡改)时,无法预测冲突是一个重要的属性。A 32 位哈希 可以描述 40 亿条不同的消息 或使用 40 亿个不同的唯一哈希值的文件。如果你有 40 亿个文件和 1 个文件,那么你肯定会发生 1 次冲突。1 TB 位空间有可能发生数十亿次冲突。如果我是攻击者并且我可以预测 32 位哈希值是什么,我就可以构造一个与目标文件冲突的受感染文件;具有相同的哈希值。

此外,如果我正在进行 10mbps 传输,那么数据包被损坏以绕过 crc32 并继续到达目的地并执行的可能性非常低。假设我以 10mbps 的速度得到 10 个错误\秒. 。如果我将其提高到 1Gbps,现在我会得到 每秒 1,000 个错误. 。如果我每秒 ram 达到 1 exabit,那么错误率为 每秒 1,000,000,000 个错误. 。假设我们的碰撞率为 1\1,000,000 传输错误,意味着百万分之一的传输错误会导致损坏的数据未被检测到。在 10mbps 下,我会收到每 100,000 秒或大约每天发送一次的错误数据。在 1gbps 下,每 5 分钟发生一次。以每秒 1 艾比特的速度,我们每秒通话数次。

如果您打开 Wireshark,您将看到典型的以太网标头具有 CRC32,您的 IP 标头具有 CRC32,TCP 标头具有 CRC32,这是除了高层​​协议可能执行的操作之外的;例如除上述之外,IPSEC 还可能使用 MD5 或 SHA 进行完整性检查。典型的网络通信中有多层错误检查,但在低于 10mbps 的速度下,它们仍然时不时地出现错误。

循环冗余校验 (CRC) 有几个常见版本和几个不常见版本,但通常旨在仅告知消息或文件在传输过程中何时损坏(多个位翻转)。由于冲突率的原因,在大型标量企业环境中,按照当今的标准,CRC32 本身并不是一个很好的错误检查协议。普通用户的硬盘驱动器可以有超过 10 万个文件,而公司的文件共享可以有数千万个。哈希空间与文件数量的比率太低。CRC32 的实现成本较低,而 MD5 则不然。

MD5 旨在阻止故意使用冲突来使恶意文件看起来是良性的。它被认为是不安全的,因为哈希空间已被充分映射以允许发生某些攻击,并且某些冲突是可预测的。SHA1 和 SHA2 是新出现的。

对于文件验证,Md5 开始被许多供应商使用,因为您可以使用它快速处理数千兆字节文件或多太字节文件,并将其堆叠在通用操作系统的使用和 CRC32 支持之上。如果在未来十年内文件系统开始使用 MD5 进行错误检查,请不要感到惊讶。

CRC代码更简单和更快。

有关你有什么需要什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top