为什么下载文件时比较校验和是一个好习惯?


16

提供ISO文件以供下载的网站通常会提供这些文件的md5校验和,我们可以用来确认该文件已正确下载并且未损坏。

为什么这是必要的?当然,TCP的纠错属性就足够了。如果未正确接收到数据包,则将重新发送该数据包。TCP / IP连接的本质不保证数据完整性吗?


10
另外,不要忘记端点之间以及端点之间进行数据传输的软件和硬件中可能存在的错误。
sebix

下载可能已经提前终止了几个字节。除非您注意,否则不一定会通过文件大小来注意到它,并且TCP错误更正只能验证实际到达的数据部分。
凯文·基恩

校验和可能很方便,但是在使用计算机的20年中,我不记得曾经使用过它。
Pedro Lobito

2
MD5是散列,而不是校验和。校验和用于检查错误,特别是传输期间的位错误。加密哈希意味着确保数据完全相同。从这个意义上说,哈希将是校验和的超集,但它们并不相同。除此之外,MD5已经被破坏了10年(请参阅Wikipedia文章的“安全性”部分)。
2015年

Answers:


20

正如其他人所指出的,在传输层的任何校验和都无济于事的情况下,数据损坏的可能性有很多,例如在发送端计算校验和之前已经发生的损坏,MITM拦截和修改流(以及数据)作为校验和),在接收端验证校验和后会发生损坏等。

如果我们忽略所有其他可能性,而只关注TCP校验和本身的细节以及它在验证数据完整性方面的实际作用,那么事实证明,此校验和的属性在检测错误方面根本不全面。选择此校验和算法的方式更能反映对速度和时间段(1970年代末)的要求。

这是TCP校验和的计算方式:

校验和:16位

校验和字段是标题和文本中所有16位字的一个补码之和的16位一个补码。如果段中包含奇数个要校验和的标题和文本八位位组,则在右边用零填充最后一个八位位组,以形成16位字用于校验和。打击垫不作为片段的一部分发送。在计算校验和时,校验和字段本身将替换为零。

这意味着在以这种方式对数据求和时任何平衡的破坏都将不会被发现。这将允许对数据进行多种损坏,但仅举一个简单的例子:更改16位字的顺序将始终未被发现。


实际上,它会捕获许多典型错误,但完全不能保证完整性。L2层还执行完整性检查(例如,以太网帧的CRC32),尽管它仅用于本地链路上的传输,而且损坏数据的许多情况甚至从未传递到TCP堆栈,这也为它提供了帮助。

就确保数据完整性而言,使用强哈希(最好是加密签名)验证数据在完全不同的级别上。两者几乎无法比较。


最佳答案!我讨厌其他答案如何将加密散列和校验和的概念混淆在一起。
0xC0000022L

20

为什么应该检查md5sum的原因不胜枚举,但我想到了几个:

  • 恶意活动-您的ISO在从服务器途中可能已被篡改
  • 页面本身是伪造的(最好也对md5sums签名:))
  • 下载中断(尽管纠正了TCP错误)(请检查此内容
  • ISO刻录错误

而且只需要几秒钟。


21
这也意味着从随机镜像站点下载ISO是相当安全的,只要您从受信任的位置获取校验和。例如,将PGP签名的帖子发布到foo-announce邮件列表中。
richardb

2
实际上,它与防止恶意活动无关。如果ISO可以被恶意的ISO取代,那么MD5校验和值也可以。让他们签名是另一回事,但不是OP要求的。因此,而不是“恶意行为”是第一个列表(它肯定听起来不错)上,它实际上甚至不应该你的名单上。您给人一种错误的安全感,这很危险。superuser.com/questions/849845/...
奥斯汀的“危险”的权力

1
@ Austin'Danger'Powers Umm,不,Konrad的权利。其一,下载镜像通常从表示校验的地点不同,二是有不少在世界上操纵流量的互联网服务供应商- TCP校验码将被罚款,但你下载一个不同的文件。当然,他也遗漏了另一点-创建校验和后,文件可能已在服务器上损坏。它一直在发生,特别是对于更多的“业余爱好者”服务器(没有正确的RAID设置等)。
a安2015年

2
2015年的答案应该建议不要使用 MD5哈希值。该算法在过去十年中被打破(毫不夸张!)。另外,您正在混合校验和和哈希。它们是两个不同的事物,它们背后都有不同的意图。
0xC0000022L

1
如果安全已经成为主要问题,则最好避免使用@ 0xC0000022L SHA1添加注释,尽管SHA1和MD5都足以防止意外损坏。
David Spillett

6

TCP / IP确实保证了数据完整性*。但是,它不能保证已下载文件的100%。发生这种情况的原因可能有很多。例如:您可能会在中间某处挂接丢失一个或两个字节的ISO。除非您需要一个或两个损坏的特定文件,否则您不会有任何问题。比较校验和可确保您确实下载了整个文件。

*查看评论


8
我认为“确实可以保证数据完整性” 实际上超出了实际销售量。它确实尝试使用一种非常精简的方法来检查数据完整性,这并不是特别强大。
哈坎·林德奎斯特(HåkanLindqvist)

6

TCP校验和仅为16位。这意味着,在没有其他校验和的情况下,每65536个损坏的数据包中有一个将被视为未损坏。例如,如果您正在通过一个噪声率为1%的嘈杂链接下载8GB DVD映像,则可能会希望有81个未检测到损坏的数据包。

MD5是更大的校验和,为128位。这81个数据包产生的校验和与原始数据相同的几率约为1,000,000,000,000,000,000,000,000,000,000,000,000,000中的1。


6

验证通过HTTP下载的文件的校验和有几个原因:

  • 确保您收到了整个文件
    • 某些客户端(例如Firefox)可能会将连接中断视为成功下载,使您的文件被截断,但声称下载成功
  • 确保收到正确的文件
    • 例如,有漏洞的服务器,受到感染或恶意的服务器可能会向您发送其他内容
    • 有人可能会篡改传输(中间人攻击)-如果您的系统受到Superfish等的威胁,或者所使用的加密方法很弱,即使HTTPS也不是安全的
    • 他们可能还会为您提供错误的下载页面,因此您甚至都没有连接到真实服务器(但是在这种情况下,如果您从同一台伪造的服务器获得校验和,将不会有太大帮助)
    • 出于各种原因,许多ISP被发现将Javascript注入页面进行传输1;根据实施情况的好坏,它可能还会破坏一些文件下载
    • 镜像可能正在托管文件的过时版本,或者管理员可能上传了错误的文件
  • 确保文件没有被TCP无法检测到的损坏
    • 例如,文件可能在服务器上被损坏,因此TCP将仅确保已损坏的文件不会在传输中进一步受到破坏
    • 否则可能由于内存/磁盘故障,错误的文件系统驱动程序等而损坏了它。
    • TCP校验和仅为16位,因此并非天文数字(65536中为1)不会检测到损坏的数据包
  • 使用ISO,确保光盘正确刻录

1条评论的来源,因为哈哈rep


2
来源:* security.stackexchange.com / questions / 70970 /… * adblockplus.org/forum/viewtopic.php?t=8156 “攻击性ISP注入/嵌入脚本/可阻止广告” * iamsrijit.wordpress.com/2012/09/ 14 /… *可以在Google上轻松找到更多信息,但这里并没有真正的话题
Rena 2015年

2

丹尼尔(Daniel),取决于您说的ISO下载所使用的工具。如果是Say Firefox,则可能显示文件下载。但是,您可能没有完整的ISO。如果将其刻录,然后尝试使用它,则信息可能会丢失。这有时会在不同的托管文件的Web服务器上发生。

最好至少比较文件大小(总字节或位)以确保它们匹配,这是一个好习惯。Windows将显示与Linux不同的文件字节数。MD5总和检查将显示相同的值,无论使用哪个操作系统。希望这个对你有帮助。干杯...


2
Windows显示的字节数与Linux显示的字节数不同?真?我以为CP / M的“文件大小为块数”文件系统已不复存在。(现在,如果您正在查看字节数以外的其他内容(例如,资源管理器中的文件大小显示),则可能会大为不同。但是,任何理智的sysadmin都不应以这种方式检查下载的文件的完整性,因此,问题。)字节就是字节。但是,以位来查看它是没有意义的。您上次下载和存储半字节是什么时候?
CVn 2015年

2

我注意到许多有趣的答案,但还有最后一件事要考虑:两位将军的问题

两位将军问题和拜占庭将军问题专门考虑了通过不可靠渠道可靠地传递信息的含义。

校验和只是“提高可靠性”的另一层,并且发生故障的可能性很小。这就是它如此受欢迎的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.