在这种情况下,AWS S3 Buckets 是否运行 MD5 校验和?我无法验证

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

将对象保存在 S3 存储桶中。保存有效,但如何判断 MD5 校验和是否有效?

string base64Checksum;
using (var md5 = MD5.Create())
{
    byte[] fileBytes = File.ReadAllBytes(filePath);
    byte[] hash = md5.ComputeHash(fileBytes, 0, fileBytes.Length);
    base64Checksum = Convert.ToBase64String(hash);
}

// request

var putRequest = new PutObjectRequest()
{
    BucketName = bucketName,
    Key = objectKey,
    FilePath = filePath,
    ContentType = "application/txt",
    MD5Digest = base64Checksum 
};

// !!! Adding this makes no difference 
putRequest.Headers["Content-MD5"] = base64Checksum;

在回复中我得到以下内容

亚马逊医生说

根据 RFC 1864 对消息进行 Base64 编码的 128 位 MD5 摘要(不带标头)。此标头可用作消息完整性检查,以验证数据是否与最初发送的数据相同。

如果提供,在文件上传到 S3 后,S3 会检查以确保上传文件的 MD5 哈希值与提供的哈希值匹配。

虽然它是可选的,但我们建议使用Content-MD5机制作为端到端的完整性检查。

此外,如果我设置

request.ChecksumAlgorithm = ChecksumAlgorithm.SHA256
,校验和将在AWS 上计算,但
ChecksumAlgorithm
ChecksumValidationStatus
与您在图片上看到的保持一致。如果我自己计算并设置属性
request.ChecksumSHA256
,这个(或重新计算的)校验和将被保存,但返回值与您在图像上看到的保持相同。

我做错了什么?

c# amazon-web-services amazon-s3 aws-sdk .net-6.0
1个回答
0
投票

这里有很多东西。

首先,

ChecksumValidationStatus
用于使用 SDK 生成/客户端提供的 CRC32、CRC32C、SHA1 和 SHA256 校验和值进行附加校验和验证。

不是用于MD5校验和验证。

这是由 S3 根据 SDK 生成/客户端提供的校验和自动完成的。如果作为

MD5Digest
传递的 MD5 校验和与 S3 服务器生成的文件 MD5 哈希值不匹配,您将收到此抛出错误代码
BadDigest
:

Amazon.S3.AmazonS3Exception: The Content-MD5 you specified did not match what we received.

如果哈希匹配,

PutRequest
将成功,表明 MD5 摘要已成功验证。

其次,应在

ChecksumValidationStatus
上检查
GetRequest
,而不是在
PutRequest
上检查。即使您指定额外的校验和进行验证,
PutRequest
也将始终具有
NOT_VALIDATED
状态。 S3 服务正在验证校验和,而不是客户端。

但是,似乎存在一个错误,

GetRequest
上的验证状态不会从
PENDING_RESPONSE_READ
更改为
SUCCESSFUL
。这超出了问题的范围,但我已将其标记给 AWS SDK for .NET 团队进行澄清。

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