为什么 gzip 使用 CRC 而不是通用的哈希算法



数字签名和码字有什么区别?

上下文:我最近不得不对 gzip 文件做大量工作。我在阅读Python zlib文档时发现的一件有趣的事情是声称CRC不应该用作通用哈希算法。这让我想知道,如果CRC不是通用的哈希算法,它的意义何在?检查平等的重点不是吗?

zip文件中的CRC主要用于确保文件在存储或运输过程中不会损坏。它不用于提供真实性或防止文件被攻击者更改。因此,不需要加密安全性。

加密哈希确实提供了相同或更好的完整性故障保护。然而,它们的计算量更大,需要更大的输出。如果哈希的输出减少太多,那么CRC实际上可以更好地检测(随机(变化。

由于 CRC 值不能防止故意更改 - 不难找到将生成相同 CRC 值的文件 - 它不适合数字签名。为此,您确实需要一个加密哈希。

请注意,加密哈希不是签名。对于签名,您需要一个数字签名应用程序,例如 PGP。数字签名(通常(由一个哈希组成,然后使用来自私钥的信息进行处理(由接收方的公钥验证(。


注意:有时"签名"一词表示"指纹"。对于指纹,仍然使用加密哈希 - 主要是MD5或SHA-1。但在我看来,这是相当牵强的,而且 - 不正确地使用了"签名"一词。

你在那里问了四五个不同的问题,并在上下文中使用了一大堆不同的,有时是模棱两可的术语。 最好在问答网站上一次问一个明确的问题。

  1. 为什么 gzip 使用 CRC 而不是通用哈希算法?

CRC 擅长错误检测,计算速度相对较快。 输入位在CRC中分布良好,并且还具有良好的突发错误检测能力。 这就是原因。 目前尚不清楚您所说的"通用哈希算法"是什么意思(仅适用于哈希表?还是加密强度?(。 无论如何,目的不是制作文件的查找表,也不是对数据进行签名。 无论如何,将加密哈希(例如 MD5 或 SHA-2(放入 gzip 文件中没有任何价值,因为有人可以简单地更改数据和哈希! 任何人都可以生成的哈希只有在您通过其他渠道获取哈希时才有用。

  1. 数字签名和码字有什么区别?

通过"码字",我从链接中推测您指的是CRC。 CRC是一种快速计算的错误检查代码,在硬件和软件应用程序中实施,以检查数据的完整性。 从上下文来看,我认为当您说数字签名时,您指的是加密哈希。 加密哈希是一种单向函数,旨在使创建具有给定哈希值的消息变得极其困难。 CRC恰恰相反。 作为一个线性函数,修改消息以具有任何给定的CRC非常容易。 加密哈希通常比CRC具有更多的位,以使意外碰撞的可能性实际上是不可能的。 然而,单向和许多位使得加密哈希的生成计算量要大得多。

  1. 我在阅读Python zlib文档时发现的一件有趣的事情是声称CRC不应该用作通用哈希算法。

这是正确的。 虽然 CRC 将输入位很好地分布到值中并且可以成功用作哈希,但它无法通过您可能希望哈希算法通过的某些测试。 如果您希望算法从键创建哈希表,请使用为此目的设计的哈希算法。 如果这就是它的全部目的,那么哈希不需要也不应该是加密的。 快速更重要。

  1. 如果CRC不是通用的哈希算法,那么它的意义何在?

CRC是编码理论的一个结果,它提供了错误检测和纠正的算法。 CRC 的目的是错误检测。

    检查
  1. 平等的重点不是吗?

目前尚不清楚您在这里指的是什么平等。 无论如何,CRC的目的是检查完整性。 它在流中提供冗余信息,这些信息将检测该流在传输过程中的几乎所有意外损坏。

最新更新