【发布时间】:2014-03-13 10:38:27
【问题描述】:
背景
我正在努力将现有应用与文件选择器集成。在我们现有的设置中,我们依靠 md5 校验和来确保数据完整性。据我所知,文件选择器在响应 REST API 上传(也不使用 JavaScript 客户端)时不提供任何 md5。
S3 存储、md5 和数据完整性
我们使用 S3 进行存储,据我所知,您可以在 storing files 时向 S3 提供 md5 校验和,以便亚马逊可以在数据似乎错误时验证并拒绝存储请求。
为确保通过网络的数据不会损坏,请使用 Content-MD5 标头。当您使用此标头时,Amazon S3 会根据提供的 MD5 值检查对象,如果不匹配,则返回错误。此外,您可以在将对象放入 Amazon S3 时计算 MD5,并将返回的 ETag 与计算的 MD5 值进行比较。
我调查了亚马逊返回的 etag 标头,发现并不清楚实际返回的 etag 是什么。 Java documentation 声明:
获取此对象内容的十六进制编码 128 位 MD5 哈希,由 Amazon S3 计算。
Ruby 文档指出:
通常,ETAG 是对象的 MD5。如果对象是使用分段上传上传的,那么这是 MD5 all of the upload-part-md5s
their documentation 的另一个地方我发现了这个:
实体标签是对象的哈希值。 ETag 仅反映对象内容的更改,而不反映其元数据。 ETag 在创建对象时确定。对于由 PUT Object 操作和 POST Object 操作创建的对象,ETag 是一个带引号的 32 位十六进制字符串,表示对象数据的 MD5 摘要。对于其他对象,ETag 可能是也可能不是对象数据的 MD5 摘要。如果 ETag 不是对象数据的 MD5 摘要,它将包含一个或多个非十六进制字符和/或包含少于 32 或多于 32 个十六进制数字。
This seems 描述 etag 是如何在 S3 上实际计算的,this stack overflow post 似乎暗示着同样的事情:不能相信 Etag 总是等于文件 MD5。
所以 - 这是我的问题
- 一般来说,文件选择器如何将文件存储到s3?是否使用了多部分发布请求?
- 我看到,当我针对例如
https://www.filepicker.io/api/file/<file handle>执行 HEAD 请求时,我确实得到了一个 etag 标头。我得到的 etag 确实与我上传的文件的 md5 匹配。返回的标头是否或多或少直接取自 S3?或者这实际上是我可以信任的 filepicker 计算的 md5? - 是否可以将 md5 的显式语句返回给 File Picker API 的客户端?例如,当我们发布一个文件时,我们会返回一个 JSON 结构,包括文件的 URL 及其大小。 md5 可以包含在这里吗?
- 是否可以为文件选择器提供一个 md5,然后在将文件发布到 S3 时使用该 md5,以便我们可以对文件进行端到端检查?
【问题讨论】:
标签: amazon-s3 md5 checksum data-integrity filepicker.io