Art*_*yom 4 checksum md5 azure azure-storage-blobs
我已使用 AzCopy 实用程序将一个大型 zip 存档上传到 Azure 存储 BLOB 容器(约 9GB)。现在我想检查它是否正确。我可以从 Azure 门户获取文件的“CONTENT-MD5”值。然后我需要在我这边计算这个,对吗?有没有其他方法来检查有效性(除了下载这个文件)?它是使用 7zip 实用程序存档的,该实用程序没有用于 MD5 的哈希算法。
rog*_*ack 13
以下是 MD5 验证和属性设置在 Azure 上的工作方式。
Azure 在服务器端计算每次上传的 MD5。
如果该上传恰好代表“完整文件”(完整 blob - PutBlob 是内部名称),那么它还会在 blob 属性中“免费”为您存储该 MD5 值。它碰巧还返回它计算出的值作为响应 HTTP 标头。
如果您在上传时传递“Content-MD5”标头,azure(服务器)还将根据该值验证上传,如果不匹配则上传失败。它再次为您存储 MD5 值。
如果您没有在“一次性”上传中上传“完整文件”,那么真正的奇怪之处就会出现。
如果您的文件大于client.SingleBlobUploadThresholdInBytes(通常为 32MB,对于 C# 为256MB ),则 Azure 客户端将“将您的上传分成 4 MB 块[PutBlock 的最大值],使用 PutBlock 上传每个块,然后使用以下命令提交所有块PutBlockList 方法。” 可能并行上传块。Azure 本身对任何类型的单次上传都有 100MB 硬性限制,因此您无法调整 client.SingleBlobUploadThresholdInBytes 超过此其他限制(更新:可能已更改为5GB)。您被迫将上传内容分割成每个 4MB 的“块”(块)。(不相关的副作用:在天蓝色中,“块”是可更改/可更新的,但不是单个字节。“一次”上传(达到该限制)基本上包含一个大“块”,因此本质上是不可变的。如果您进行多块上传,您可以更改该 blob 中的单个块)
如果您以“块”形式上传,azure 仅支持让服务器在上传时“验证”每个块的 MD5 值。因此,如果您将客户端参数设置为setComputeMd5(true)(java) 或validate_content = true(python),它将执行的操作是在上传时计算每个 4MB 块的 MD5,并将其传递到块上传时进行验证。文档称“使用 HTTPS 时不需要”,因为 HTTPS 还会计算相同字节的校验和并将其包含在传输中,因此有些多余。每个块的 CONTENT-MD5 被“称为”事务性(有点像临时)MD5。一旦验证了该块,似乎就会被丢弃。
这意味着,对于使用“分块”上传的文件上传来说,最终不会在 Azure 中设置 CONTENT-MD5 属性,因为它需要申请“整个 blob”。Azure 不知道所有块按顺序组合在一起的 MD5 值应该是多少(它只处理数据传入时每次传输的 MD5),并且在放置所有块时它不会重新计算全局值。最后拼凑在一起。据我们所知,它实际上并没有将它们“放在一起”本身,只是在内部将点块彼此链接起来。这意味着“有时”当您使用相同的客户端调用上传时,它将设置 CONTENT-MD5 属性,有时则不会(当文件被认为太大时)。
那么,如果我们在上传时有整个文件的 MD5,我们还有什么选择呢?我们不能将其用作特定块的上传标头。因此,Azure 的 PutBlockList 命令被更改为接受 MD5 的“另一种”形式,称为x-ms-blob-content-md5. 如果您使用它,它基本上会在 azure 中设置 blob 的 CONTENT-MD5 属性,并且不会检查或验证它。事实上,如果您对 azure 中的 blob 进行更新,它根本不会修改 CONTENT-MD5 属性,并且它可能会过时。您还可以在上传后通过事后“设置 blob 属性”调用在 Azure 中设置此属性,这同样将其设置为任意值而不进行检查。C# 客户端有一个 BlobOption 来设置 this StoreBlobContentMD5,但似乎不允许您提供该值。Java 客户端似乎没有相应的选项,也许可以设置手动标头来在任何一种情况下提供它。如果您有任何客户端具有像 azcopy 的“--put-md5”这样的选项,则可能只是为大文件设置此属性。唯一的选择是在将字节传递给客户端时计算字节的 MD5,并查看是否对齐,并假设它们已对齐(包装的 InputStream 样式)。或者在上传后(本地)重新计算文件的 MD5,并“希望”客户端读取并上传与您刚刚读取的相同的字节(它会计算每个块的事务性 md5 和/或 HTTPS 校验和) 。
或者痛苦的选择:重新下载它以验证其 MD5 是否有效。如果您想以这种方式执行此操作,“简单”的方法是首先设置 azure CONTENT-MD5 属性(参见上文),然后使用 azure 客户端执行文件下载。在客户端,它会在下载时计算 md5,将其与 azure 中“当前设置”的 md5 进行比较(如果 azure 中存在,它会作为下载标头发送),如果不这样做,客户端将导致操作失败最后匹配。所以基本上 azure 支持在客户端验证大文件的完整文件 MD5,但不支持服务器端...或者创建一个Azure 函数来执行相当于上传后客户端验证的操作。
azure 支持另一种 MD5 风格的东西:如果您执行指定范围为 4MB 或更少的“获取 blob”,您也可以指定x-ms-range-get-content-md5,它将在 CONTENT-MD5 HTTP 标头中返回该范围的 MD5 。FWIW。
Azure 存储 Blob 服务不为每个实时 Blob 内容维护上传的 Blob 的“Content-MD5”属性。实际上,它是在上传过程中由 AzCopy 计算的,并在 AzCopy 完成上传时设置为目标 blob。因此,如果您确实要验证数据完整性,则必须使用带有 /CheckMD5 选项的 AzCopy 下载文件,然后将下载的文件与本地原始文件进行比较。
但是,鉴于 AzCopy 已尽最大努力保护传输过程中的数据完整性,上述验证步骤可能是多余的,强烈不建议执行,除非在您的场景下数据完整性比性能重要得多。
| 归档时间: |
|
| 查看次数: |
5013 次 |
| 最近记录: |