【问题标题】:Why do you need to immediately verify checksums when uploading or downloading from an object storage system?为什么在从对象存储系统上传或下载时需要立即验证校验和?
【发布时间】:2020-04-24 17:19:13
【问题描述】:

AWS S3 和 Google Cloud Storage 等对象存储系统讨论了需要在传输后立即检查下载和上传对象的完整性,以确保没有发生损坏。

例如,AWS CLI doc 提到:

上传: AWS CLI 将为标准上传和分段上传计算并自动填充 Content-MD5 标头。如果 S3 计算的校验和与提供的 Content-MD5 不匹配,S3 将不会存储该对象,而是会向 AWS CLI 返回一条错误消息。

下载: AWS CLI 将在可能的情况下尝试验证下载的校验和,基于 AWS CLI 从 S3 下载对象时执行的 GetObject 请求返回的 ETag 标头。如果计算的 MD5 校验和与预期的校验和不匹配,则删除文件并重试下载。

鉴于 TCP 包含自动完整性检查,为什么这些系统需要额外的校验和来验证完整性?似乎通过使用 TCP,我们应该能够确保传输过程中不会发生损坏。

【问题讨论】:

    标签: amazon-s3 google-cloud-storage object-storage


    【解决方案1】:

    可能有很多原因,但首先想到的是验证客户端的有效负载在从数据源读取时,在数据实际传输之前没有被损坏(或被恶意修改)。同样,云端的存储可能存在损坏写入。在两端使用校验和是一种避免这种情况的方法,即使这种可能性极小。

    【讨论】:

    • 对象存储系统是否有一些独特之处会增加读取/写入存储时损坏的可能性?这种额外的完整性校验和似乎对他们来说有些独特。它们也不一定是安全校验和(Google 使用 CRC32),所以我不确定它们是否试图防止恶意修改。
    • 我不认为有什么特别之处。依靠正确数据开展业务的企业客户可能需要这种保证。 cloud.google.com/storage/docs/hashes-etags
    【解决方案2】:

    TCP(和 UDP)校验和并不总能保护您,而且多年来(如果不是几十年),它们一直很弱,快速搜索会产生这些,我相信您可以找到其他(也许更好)参考:

    https://www.evanjones.ca/tcp-and-ethernet-checksums-fail.html https://www.evanjones.ca/tcp-checksums.html

    这不是唯一的原因,您可能会在本地磁盘中遇到数据损坏,或者您的 CPU 在加密数据时可能会损坏位(确实会发生),或者其他一些不常见的问题。

    更一般地说,所有这些系统都旨在处理极端情况和奇怪的情况,这些情况很少发生,以至于我们大多数人在几十年内都不会遇到它们。但是因为这些系统被这么多人使用,并且读/写这么多字节,所以他们每天都在体验它们。换句话说:规模足够大的罕见事件经常发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-10
      • 2012-12-30
      • 1970-01-01
      • 2016-01-18
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多