关于Http大文件下载的MD5校验码

9

MD5校验和通常用于检查Http下载大文件的完整性。我的问题是,既然TCP本身提供可靠的机制(即为每个TCP数据包提供校验和以确保其完整性),那么简而言之,TCP就是可靠的。Http基于TCP(因此Http也应该是可靠的),那么为什么我们需要另一种完整性检查机制(即MD5校验和)呢?

谢谢,George


3
校验和仅针对该数据包。这并不意味着所有经过完整性检查的小数据块会生成具有相同完整性的大文件。 - Thai
1
嗨,Thai,我感到困惑。我认为如果小包的完整性没问题,那么由这些小包组成的整个文件也应该是没有问题的。你有什么意见吗? - George2
4个回答

12

通常情况下,您使用哈希值校验下载完整性时会采用离线方式(例如在网站上打印),而不是以编程方式实现。

这可以防止下载文件被篡改。


2
我的意思只是一种下载被替换的攻击方式——入侵服务器,进行有创意的重定向……你只会下载到另一个被篡改的文件。但如果你与其他方式提供的校验和进行比较,可能会察觉到欺骗。这种其他方式通常称为“带外”——攻击者必须破解两个机制。 - mtraut
1
他也许可以,但他必须侵入下载区域和包含校验和的页面所在的内容管理系统(通常是数据库)。 - mtraut
2
请查看典型的下载页面,例如http://hc.apache.org/downloads.cgi。校验和始终与apache一起托管。下载在某些镜像上。如果您有安全基础,则可以使用较不安全的代理。但是,如果有人闯入apache服务器,这将对您没有太大帮助。如果您需要更高的安全性需求,则必须使用其他OOB(某人在下载后向您发送电子邮件,打电话给您等)或其他技术(签名提供更高的安全性,在apache页面上也可以找到它们)。 - mtraut
2
我不会在像HTTP请求/响应场景这样的纯TCP协议中添加哈希功能。也许(没有实际经验)如果你在这之上挂载一个更复杂的协议(例如可以恢复下载的下载器),那么这可能是有用的,因为在下载过程中可能会出现微妙的错误(双方在下载时失去文件指针同步,文件内容在下载时发生变化等)。 - mtraut
很好的回答。我可以再添加一个原因吗:下载管理器可能存在漏洞。TCP仅确保:1.一旦接收到数据包,它就是无误的;2.接收到的数据包顺序与发送顺序相同。如何处理这些数据包是下载管理器的工作。 - hungson175
显示剩余5条评论

5

在我的生活中,有超过三次我下载了损坏的ISO或EXE文件,但当我再次下载时,它们却能正常工作。这证明TCP机制并不能保证完整性。


我也遇到过这种情况,可能是来自浏览器。 - David 天宇 Wong

4

答案很简单。在开始下载之前,源文件可能已经损坏。TCP仅验证您下载的文件是否与源文件相同。而MD5可确保您知道它是损坏的,无论原因是传输问题还是初始文件本身。


1
“传输中可能存在问题”——我对这一点感到困惑。我认为TCP传输是可靠的。你为什么认为在传输过程中会出现问题?能给个例子吗? - George2
TCP是一种可靠的连接方式,但在使用TCP进行传输时仍可能存在潜在问题。如果连接中断(例如从网络中拔掉计算机),TCP会尽最大努力重新建立连接并继续未完成的传输,但在一定次数的尝试后会停止。未完成的文件会留存在磁盘上。尽管这种情况很少发生,因为大多数失败的连接都可以在几次尝试内重新建立。 - Neil

1

当涉及到35G的TED-LIUM语料库或更大的400G的tiny-images时,每次下载文件时似乎几乎都会出现错误。对于35G的TED-LIUM语料库,我至少下载了20次,并在数月内进行了总计700G的网络传输。 CRC只是一场噩梦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接