【问题标题】:CRC32+Size vs MD5/SHA1CRC32+大小与 MD5/SHA1
【发布时间】:2024-05-17 19:30:01
【问题描述】:

我们有一个文件存储,该存储根据附加到 crc32 的大小唯一标识一个文件。

我想知道这个校验和 (crc32 + size) 是否足以识别文件,或者我们是否应该考虑其他一些散列技术,如 MD5/SHA1?

【问题讨论】:

    标签: hash md5 storage crc32


    【解决方案1】:

    CRC 是一种错误检测方法,而不是一个严重的散列函数。它有助于识别损坏的文件,而不是唯一地识别它们。 所以你的选择应该在 MD5 和 SHA1 之间。

    如果您没有强大的安全需求,您可以选择更快的 MD5。 (请记住,MD5 容易受到碰撞攻击)。 如果您需要更高的安全性,最好使用 SHA1 甚至 SHA2。

    【讨论】:

    • MD5 已被证明存在缺陷五年。不要使用它或至少将它与其他方法结合使用。
    • @STATUS_ACCESS_DENIED:+1 你是对的。我永远不会将 MD5 用于任何事情。无论如何,我认为@Rajiv 的意图与安全无关。因此,对于本地存储,即使是 MD5 也足够了
    【解决方案2】:

    正如其他人所说,CRC 不保证没有冲突。但是,您的问题只需给文件增加 64 位数字即可解决。这保证永远不会发生冲突(除非您想将大量文件保存在一个目录中,这无论如何都不是一个好主意)。

    【讨论】:

      【解决方案3】:

      CRC-32 不够好;建立冲突是微不足道的,即两个具有相同 CRC-32 的文件(如果您愿意,可以具有相同的长度)。即使没有恶意攻击者,一旦您拥有大约 65000 个长度相同的不同文件,冲突也会随机发生。

      哈希函数旨在避免冲突。使用 MD5 或 SHA-1,您不会遇到随机冲突。如果您的设置与安全相关(即,有人、某处可能会主动尝试创建冲突),那么您需要一个 secure 哈希函数。 MD5 不再安全(用 MD5 创建冲突很容易),SHA-1 在这方面有点弱(没有计算实际的冲突,但是创建一个的方法是已知的,虽然很昂贵,但它比什么便宜得多它应该是)。通常的建议是使用 SHA-256 或 SHA-512(SHA-256 足以保证安全性;SHA-512 在大型 64 位系统上可能会快一点,但文件读取带宽将比散列速度更受限制) .

      注意:使用加密哈希函数时,无需存储和比较文件长度;哈希足以消除文件的歧义。

      在非安全设置中(即您只担心随机冲突),则可以使用 MD4。它作为加密哈希函数被彻底“破坏”了,但它仍然是一个非常好的校验和,而且速度非常快(在一些基于 ARM 的平台上,它甚至比 CRC-32 更快,因为它可以更好地抵抗随机碰撞)。基本上,你不应该使用 MD5:如果你有安全问题,那么一定不能使用 MD5(它坏了;使用 SHA-256);如果您确实没有有安全问题,那么 MD4 比 MD5 快。

      【讨论】:

        【解决方案4】:

        CRC32+size 将使用的空间为您提供了足够的空间来容纳更大的 CRC,这将是一个更好的选择。如果您不担心恶意碰撞,那么在这种情况下,Thomas 的回答就适用了。

        您没有指定语言,但例如在 C++ 中,您得到了 Boost CRC 为您提供所需大小的 CRC(或者您有能力存储)。

        【讨论】:

        • 语言实现是 C。我将研究 BoostCRC。谢谢