将对象保存在 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
,这个(或重新计算的)校验和将被保存,但返回值与您在图像上看到的保持相同。
我做错了什么?
这里有很多东西。
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 团队进行澄清。