我想知道与 md5 校验和相比,adler32 校验和的可靠性如何?维基百科上有人说 adler32 比 md5"可靠得多",所以我想知道多少,以哪种方式?
更具体地说,我想知道它是否足够可靠,可以长期存档大小为 20GB+ 的(tar)文件的一致性检查?
有关 Adler-32 校验和的错误检查功能的详细信息,请参阅例如重访弗莱彻和阿德勒校验和。马克西诺,2006年。
本文包含对这两个校验和提供的汉明距离的分析,并提供了最大约2^11位的数据字的残差错误率的指示。这显然远低于您对 2^38 位的要求......
Adler32 的目的与 MD5 完全不同。Adler32 是一个校验和。MD5 是一个安全的消息摘要。Adler32用于快速哈希,具有较小的位空间和简单的算法。它的碰撞率很低,但还不够低,无法确保安全。MD5、SHA 和其他加密/安全哈希(或消息摘要)具有更大的位空间和更复杂的算法,因此冲突要少得多。例如,比较 SHA2-256;256位,而Adler32的32位可怜
。Adler确实有其用途,例如在哈希表中,或者快速数据完整性检查。尽管如此,它的设计目的与 MD5 或其他安全摘要不同。
顺便说一句,如果您需要一个简单但有点可靠的校验和,那么弗莱彻的表现似乎优于阿德勒。我推测它们的性能都优于 CRC,尽管可能不是简单的基于加法的校验和(尽管它很容易发生冲突)。如果您同时想要性能和安全性,请使用这两种算法。将校验和算法用作快速计算和查找,然后在找到时使用较大的摘要进行更彻底的确认。
为了回答你关于确保档案有效性的问题,我想说这可能就足够了。最佳选择?可疑。出错的可能性?很低。
这是一个古老的算法; 正如维基百科页面所说,"以准确性换取速度"。简而言之,不,你不应该依赖它。
关键是,对于多个损坏,此校验和可能仍会传递为"正常"。由于雪崩效应,这在现代算法(即使是旧的MD5)中发生的可能性要小得多。
对于今天的机器,速度并不是一个问题,因此我建议使用现代算法(以当前者为准),即使对于TB范围内的文件也是如此。恕我直言,使用旧的校验和系统节省的微不足道的时间不足以平衡未检测到的数据损坏的显着增加的风险 - 老实说,如今 20GB 的文件并不是您需要使用弱(我敢说损坏)算法的那么多数据。
它不如MD5或CRC可靠(实际上与CRC大致相同)。优点是速度,缺点更多地显示短数据(几百字节) - 意思是哈希值的分布不能很好地覆盖可用的 32 位输出。对于大文件,这是一个不错的选择。
Adler-32和MD5在这种方式上没有可比性。 当您想要确保文件未被对手篡改时,MD5实际上旨在成为加密校验和,而Adler-32(以及CRC,可与Adler-32相当)旨在确保文件没有被意外篡改(完整性校验和)。
MD5实际上被认为是出于其加密目的而损坏的,并且仅在需要更多确定性位时才用作完整性检查。 Adler-32"不太可靠"的唯一方法是,它允许在保留相同输出的同时更改潜在的更多位,这意味着有更多的碰撞空间。
此链接很好地讨论了如何使用 Adler-32 为某些需要使用加密总和以增加确定性的代码提供性能优势。 也就是说,您可以使用更小和更便宜的校验和来查看在文件更改的情况下是否值得考虑使用更昂贵的MD5/SHA/Whirlpool。