对我来说,文档不清楚。
如果您为多部分对象启用了附加校验和值,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?
}
响应中的 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 用户指南中的检查对象完整性。
要验证对象作为一个整体的完整性,您需要知道其上传的所有部分的哈希值。
这也意味着,如果您将对象作为一个整体复制到另一个地方(并且不使用多部分复制),它的摘要将会改变。