boto3 Python SDK“boto3.complete_multipart_upload()”是否计算每个部分的 SHA1?

问题描述 投票:0回答:1

对我来说,文档不清楚。

如果您为多部分对象启用了附加校验和值,Amazon S3 会计算 使用指定的校验和算法计算每个单独部分的校验和。 已完成对象的校验和的计算方式与 Amazon S3 计算分段上传的 MD5 摘要的方式相同。 您可以使用此校验和来验证对象的完整性。

当我将计算出的 SHA1 作为参数传递给

upload_part()
方法时,在此方法的响应中,我会收到返回的 SHA1。

问题响应中的SHA1实际上是由AWS计算的吗?如果是这样,当它与我计算并发送到 AWS 的 SHA1 不匹配时会发生什么?

使用multipart_upload上传数据的函数:

def upload_chunk_to_s3(s3_client, chunk, chunk_sha1, bucket, key, part_number, upload_id):
    resp = s3_client.upload_part(
        Bucket=bucket,
        Key=key,
        PartNumber=part_number,
        UploadId=upload_id,
        Body=chunk,
        ChecksumAlgorithm='SHA1',
        ChecksumSHA1=chunk_sha1  #<--this is calculated by me
    )
    return {'PartNumber': part_number, 'ETag': resp['ETag'], 'ChecksumSHA1': resp['ChecksumSHA1']}

AWS 的回复

{
  "ResponseMetadata": {
    "RequestId": "<redact>",
    "HostId": "<redact>",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amz-id-2": "<redact>",
      "x-amz-request-id": "<redact>",
      "date": "Wed, 18 Oct 2023 20:39:50 GMT",
      "etag": ""<redact>"",
      "x-amz-checksum-sha1": "<redact>b+KCk=",
      "x-amz-server-side-encryption": "AES256",
      "server": "AmazonS3",
      "content-length": "0"
    },
    "RetryAttempts": 0
  },
  "ServerSideEncryption": "AES256",
  "ETag": ""<md5_here>"",
  "ChecksumSHA1": "<redact>b+KCk=" #<-- calculated by AWS for each part of the multipart_upload?
}
amazon-web-services boto3 sha1
1个回答
0
投票

响应中的 SHA1 是 AWS 实际计算的吗?

是的,由AWS计算。

如果是这样,当它与我计算并发送到 AWS 的 SHA1 不匹配时会发生什么?

S3将拒绝上传并返回错误状态以达到此效果。


对我来说,文档不清楚。

这是您引用的摘录中的一行:

已完成对象的校验和的计算方式与 Amazon S3 计算分段上传的 MD5 摘要的方式相同。

,指的是文档的这一部分:

分片上传对象时,对象的 ETag 不是整个对象的 MD5 摘要。 Amazon S3 在上传时计算每个单独部分的 MD5 摘要。 MD5 摘要用于确定最终对象的 ETag。 Amazon S3 将 MD5 摘要的字节连接在一起,然后计算这些连接值的 MD5 摘要。创建 ETag 的最后一步是 Amazon S3 在末尾添加一个包含部件总数的破折号。

如果您使用

GetObjectProperties
查询对象,它将返回
Checksum
对象,其中字段
ChecksumSHA1
填充如下:

对象的 base64 编码、160 位 SHA-1 摘要。仅当它与对象一起上传时才会出现。对于分段上传,这可能不是对象的校验和值。有关如何通过分段上传计算校验和的更多信息,请参阅 Amazon S3 用户指南中的检查对象完整性。

要验证对象作为一个整体的完整性,您需要知道其上传的所有部分的哈希值。

这也意味着,如果您将对象作为一个整体复制到另一个地方(并且不使用多部分复制),它的摘要将会改变。

© www.soinside.com 2019 - 2024. All rights reserved.