HTTPS 协议文件完整性

HTTPS protocol file integrity

我了解到,当您使用 HTTP/HTTPS 协议将文件从客户端发送到服务器时,您可以保证所有发送的数据都已成功到达目的地。但是,如果您正在发送一个巨大的文件,然后 Internet 连接突然中断,则不会发送所有包,因此您会失去文件的逻辑完整性。

我的陈述中有什么遗漏的地方吗?

我想知道是否有一种方法可以让目标节点在不使用 "custom code/api" 的情况下检查文件逻辑完整性。

HTTPS 只是 TLS 层上的 HTTP,因此所有内容也适用于 HTTPS:

HTTP 通常通过 TCP/IP 传输。现在,TCP 具有流量控制(即丢失的数据包将被重新发送)和校验和(即,在接收方没有注意到并重新请求数据包的情况下数据被更改的可能性很小)。因此,如果您真的只是传输数据,那么您基本上已经设置好了(只要您的 HTTP 服务器配置为以字节为单位发送文件的长度,至少对于静态文件,通常是这样)。

如果您的传输在达到您的服务器发送给客户端的 HTTP GET 回复中公布的整个文件大小之前停止,您的客户端就会知道!许多 HTTP libraries/clients 可以重新启动 HTTP 传输(如果服务器支持)。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.15 甚至指定一个 MD5 校验和头字段。您可以将 Web 服务器配置为使用该字段,客户端可能会使用它来验证整个文件的完整性。

编辑:rfc2616 指定的 Content-MD5 似乎已被弃用。您现在可以使用 a content digest,它更加灵活。

此外,您提到要检查客户端发送到服务器的文件。这个问题可能会更难一些——虽然您通常可以完全控制您的网络服务器,但您不能强制任意客户端(例如浏览器)在上传之前对其文件进行哈希处理。

另一方面,如果您实际上可以控制客户端的 HTTP 实现,那么您很可能还可以使用比普通 HTTP 更面向文件传输的东西——想想 WebDav、AtomPUB 等,它们是协议在 HTTP 之上,甚至是更多面向文件交换的协议,如 rsync(如果你真的在同步东西,我会衷心推荐它——如果双方的版本只是部分不同,它会将网络使用量减少到最低限度)。如果出于某种原因,你的用户在一个定义明确的圈子内共享他们的大部分数据(例如,你正在构建摄影师共享他们相册的东西),你甚至可以只使用 bittorrent,它具有-chunk 散列,广泛的负载平衡选项,并允许 "plain old HTTP seeds"。

在HTTP/1.1中,收件人总是可以检测到它是否收到了完整的消息(通过比较Content-Length,或者通过正确处理transfer-encoding: chunked)。

(如果您怀疑传输层出现位错误,添加内容哈希会有帮助。)

这里有几个问题:

  1. 正如 Marcus 所说的那样,他的回答是 TCP 保护您的字节不被意外损坏,但如果下载中断则无济于事
  2. HTTPS 还确保那些字节在服务器和客户端(您)之间没有被篡改
  3. 如果您想验证文件的完整性(其传输是否中断)您应该使用旨在防止意外文件损坏的校验和(例如 CRC32,可能有更好的,你应该检查)
    1. 如果您还使用 HTTPS,那么您也可以免受蓄意攻击,因为您知道您的校验和是正确的,并且您获得的文件部分没有被篡改。
  4. 如果您使用校验和,但不使用 HTTPS(但您确实应该使用),那么您应该可以安全地防止意外数据损坏,但不能防止恶意攻击。它可以减轻,但它超出了这个问题的范围