HTTP 响应中的校验和 header - 为什么不呢?
Checksum in HTTP response header - why not?
当我开始从 HTTP 服务器下载文件时,我想知道某种文件校验和(如 SHA-256 哈希或其他任何东西)。它可以作为 HTTP 响应之一传输 headers.
HTTP etag
类似,但它仅用于使浏览器缓存无效,据我所知,每个站点都以不同的方式计算它,它看起来不像任何哈希知道。
一些软件下载站点提供各种文件校验和作为单独的文件下载(例如,最新的 Ubuntu 16.04 SHA1 哈希值:http://releases.ubuntu.com/16.04/SHA1SUMS)。将它们包含在 HTTP 响应中会不会更容易 header 并强制浏览器在下载结束时计算它(并且不要强制用户手动执行)。
我想整个 HTTP-based Internet 都可以正常工作,因为我们使用的是 TCP 协议,它是可靠的并确保接收到的字节与服务器发送的字节完全相同。但是,如果 TCP 是如此 "cool",为什么我们要手动检查文件哈希值(参见上面的 Ubuntu 示例)?在文件下载过程中很多事情都可能出错(client/server 磁盘损坏、服务器端文件修改等)。如果我是对的,只需在下载开始时传递文件哈希即可解决所有问题。
ubuntu.com 和类似网站上的哈希值有两个目的:
- 检查文件的完整性(是的,假设浏览器可以为您检查)
- 检查文件的正确性,以避免篡改(例如,攻击者可能拦截您的下载请求并为您提供恶意文件。虽然您可能被 https 浏览器端覆盖,但对于静态数据而言并非如此,例如 USB 外部磁盘,您可能希望通过比较哈希值来检查其正确性)
Digest
是标准 header,用于传送所选资源表示的校验和(即有效负载 body)。
带摘要的示例响应。
>200 OK
>...
>Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
>
>{"hello": "world"}
Digest
可以在请求和响应中使用。
在处理数据之前根据摘要验证数据是一种很好的做法。
您可以查看 related page on mozilla website 以深入讨论 http 中的负载 body。
I guess that whole HTTP-based Internet is working, because we're using TCP protocol
不,网络上的完整性由 TLS 确保。 Non-TLS 沟通不应该
被信任。参见 rfc8446
与文件分开提供的校验和用于在进行 Non TLS
或 indirect
传输时进行完整性检查。
也许我知道你的疑问,因为我对校验和也有同样的疑问,让我们找出来。
有两个任务需要考虑:
- 文件在传输过程中损坏
- 文件被黑客更改
以及本题中的三个协议:
- HTTP协议
- SSL/TLS 协议
- TCP 协议
现在我们分为两种情况:
1。文件提供者和客户端直接传输文件,无代理,无离线(U盘)。
TCP protocol
承诺:来自服务器的数据与客户端收到的数据完全相同,通过校验和确认。
TLS protocol
承诺:服务器已通过身份验证(真正ubuntu.com)并且数据不会被任何中间人更改。
所以在做HTTPS的时候就不需要在HTTP协议中加入checksum header了。
但是当 TLS 未启用时,可能会发生伪造:中间的坏人给客户端一个错误的文件。
2。文件提供者和客户端间接传输文件,通过CDN
,通过镜像,通过离线方式(U盘)。
许多站点,如 ubuntu.com 使用 3 方 CDN
来提供静态文件,CDN 服务器不受 ubuntu.com 管理。
http://releases.ubuntu.com/somefile.iso
重定向到 http://59.80.44.45/somefile.iso
。
现在必须在带外提供校验和,因为它没有经过身份验证,我们不信任连接。所以HTTP协议中的checksum header在这种情况下是束手无策的。
当我开始从 HTTP 服务器下载文件时,我想知道某种文件校验和(如 SHA-256 哈希或其他任何东西)。它可以作为 HTTP 响应之一传输 headers.
HTTP etag
类似,但它仅用于使浏览器缓存无效,据我所知,每个站点都以不同的方式计算它,它看起来不像任何哈希知道。
一些软件下载站点提供各种文件校验和作为单独的文件下载(例如,最新的 Ubuntu 16.04 SHA1 哈希值:http://releases.ubuntu.com/16.04/SHA1SUMS)。将它们包含在 HTTP 响应中会不会更容易 header 并强制浏览器在下载结束时计算它(并且不要强制用户手动执行)。
我想整个 HTTP-based Internet 都可以正常工作,因为我们使用的是 TCP 协议,它是可靠的并确保接收到的字节与服务器发送的字节完全相同。但是,如果 TCP 是如此 "cool",为什么我们要手动检查文件哈希值(参见上面的 Ubuntu 示例)?在文件下载过程中很多事情都可能出错(client/server 磁盘损坏、服务器端文件修改等)。如果我是对的,只需在下载开始时传递文件哈希即可解决所有问题。
ubuntu.com 和类似网站上的哈希值有两个目的:
- 检查文件的完整性(是的,假设浏览器可以为您检查)
- 检查文件的正确性,以避免篡改(例如,攻击者可能拦截您的下载请求并为您提供恶意文件。虽然您可能被 https 浏览器端覆盖,但对于静态数据而言并非如此,例如 USB 外部磁盘,您可能希望通过比较哈希值来检查其正确性)
Digest
是标准 header,用于传送所选资源表示的校验和(即有效负载 body)。
带摘要的示例响应。
>200 OK
>...
>Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
>
>{"hello": "world"}
Digest
可以在请求和响应中使用。
在处理数据之前根据摘要验证数据是一种很好的做法。
您可以查看 related page on mozilla website 以深入讨论 http 中的负载 body。
I guess that whole HTTP-based Internet is working, because we're using TCP protocol
不,网络上的完整性由 TLS 确保。 Non-TLS 沟通不应该 被信任。参见 rfc8446
与文件分开提供的校验和用于在进行 Non TLS
或 indirect
传输时进行完整性检查。
也许我知道你的疑问,因为我对校验和也有同样的疑问,让我们找出来。
有两个任务需要考虑:
- 文件在传输过程中损坏
- 文件被黑客更改
以及本题中的三个协议:
- HTTP协议
- SSL/TLS 协议
- TCP 协议
现在我们分为两种情况:
1。文件提供者和客户端直接传输文件,无代理,无离线(U盘)。
TCP protocol
承诺:来自服务器的数据与客户端收到的数据完全相同,通过校验和确认。
TLS protocol
承诺:服务器已通过身份验证(真正ubuntu.com)并且数据不会被任何中间人更改。
所以在做HTTPS的时候就不需要在HTTP协议中加入checksum header了。
但是当 TLS 未启用时,可能会发生伪造:中间的坏人给客户端一个错误的文件。
2。文件提供者和客户端间接传输文件,通过CDN
,通过镜像,通过离线方式(U盘)。
许多站点,如 ubuntu.com 使用 3 方 CDN
来提供静态文件,CDN 服务器不受 ubuntu.com 管理。
http://releases.ubuntu.com/somefile.iso
重定向到 http://59.80.44.45/somefile.iso
。
现在必须在带外提供校验和,因为它没有经过身份验证,我们不信任连接。所以HTTP协议中的checksum header在这种情况下是束手无策的。