当我开始从HTTP服务器下载文件时,我想知道某种文件校验和(如SHA-256哈希或其他任何东西)。它可以作为HTTP响应标头之一传输。
Http etag
是类似的,但它仅用于使浏览器缓存无效,而且从我注意到,每个网站都以不同的方式计算它,它看起来不像我知道的任何哈希。
某些软件下载站点提供各种文件校验和作为单独的文件进行下载(例如,最新的Ubuntu 16.04 SHA1哈希值:http://releases.ubuntu.com/16.04/SHA1SUMS)。将它们包含在HTTP响应头中并强制浏览器在下载结束时计算它(并且不强迫用户手动执行)会不会更容易。
我猜整个基于HTTP的互联网正在运行,因为我们正在使用TCP协议,这是可靠的,并确保接收的字节与服务器发送的字节完全相同。但是如果TCP是如此“酷”,我们为什么要手动检查文件哈希(请参阅Ubuntu示例)?在文件下载期间(客户端/服务器磁盘损坏,服务器端的文件修改等),很多事情都可能出错。如果我是对的,只需在下载开始时传递文件哈希就能解决所有问题......
答案 0 :(得分:2)
Digest
是用于传送资源(即有效负载主体)的所选表示形式的校验和的标准标头。
带有摘要的示例响应。
>200 OK
>...
>Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
>
>{"hello": "world"}
Digest
可以在请求和响应中使用。
在处理摘要之前,最好先对摘要进行验证。
您可以在related page on mozilla website上找到有关http中有效内容正文的深入讨论。
我想整个基于HTTP的Internet都可以正常工作,因为我们使用的是TCP协议
否,TLS可以确保Web的完整性。非TLS通信不应 被信任。参见rfc8446
答案 1 :(得分:1)
Non TLS
或indirect
传输时用于完整性检查。也许我知道您的疑问,因为我对校验和有相同的疑问,让我们找出答案。
要考虑两个任务:
此问题中的三个协议:
现在我们分为两种情况:
TCP protocol
的承诺:通过校验和和确认,来自服务器的数据与客户端接收的数据完全相同。
TLS protocol
承诺:服务器已通过身份验证(实际上是ubuntu.com),并且任何中间人都不会更改数据。
因此,在执行HTTPS时无需在HTTP协议中添加校验和标头。
但是当未启用TLS时,可能会发生伪造:中间的坏人向客户端提供了错误的文件。
CDN
,通过镜像,通过脱机方式(usb磁盘)间接传输文件。许多站点,例如ubuntu.com,都使用3方CDN
来提供静态文件,而CDN服务器不受ubuntu.com管理。
http://releases.ubuntu.com/somefile.iso
重定向到http://59.80.44.45/somefile.iso
。
现在必须以带外方式提供校验和,因为该校验和未经身份验证,我们不信任该连接。因此,在这种情况下,HTTP协议中的校验和标头是无能为力的。
答案 2 :(得分:0)
ubuntu.com和类似网站上的哈希有两个目的: