根据 Chilkat 支持,事实证明 Chilkat 版本 9.5.0.80 和 9.5.0.83 有意删除了Content-MD5
进行身份验证时使用标头AWS Signature V4
。相反,Chilkat 计算 SHA256 哈希值并将其放入x-amz-content-sha256
(如果使用较旧的 AWS 签名 V2 进行身份验证,则会计算Content-MD5
有人告诉我)因此,与 @Chilkat Software 的评论不同,在撰写该评论时,此问题尚未在后续版本中得到修复,并且删除是有意的。
这并不可怕,但它源于一种误解,即内容的 SHA-256 哈希对于构建有效的 AWS Signature V4 进行身份验证是必要的,而事实上这是not案子。虽然 SHA256 完全适合内容验证,但与用于内容验证的 MD5 相比,它也很浪费。
AWS C++ 开发工具包本身不使用 SHA-256 哈希x-amz-content-sha256
上传部分时的标头。我已经确认它使用:x-amz-content-sha256:UNSIGNED-PAYLOAD
而是使用“成本较低”的 MD5 哈希值,并将其放入Content-MD5
标头(请参阅此处的 AWS 文档https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html)
无符号有效负载选项 – 您包含文字字符串
UNSIGNED-PAYLOAD 在构造规范请求时,并设置
与发送时的 x-amz-content-sha256 标头值相同的值
向 Amazon S3 发出请求
以下是 Amazon AWS UploadPart 请求的示例,该请求使用 Content-MD5 进行内容验证,而不使用 SHA256 签署请求(使用适用于 C++ 的 AWS 开发工具包从请求中捕获):
PUT https://mybucket.s3.us-west-1.amazonaws.com/somefile.mfs01?partNumber=1&uploadId=6CHL6tPKFcRSoxD4iysjKMgQCNfcFAt87bn4fsduV1YI5_aFIz9e36BxFURH_iEX8EChUtQm06qT9oyIUDbAnA.2M.novpBBKsnGl_NqNvVllQ7L1VK6x1PiLlqq46tH HTTP/1.1
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
Content-Type: binary/octet-stream
Content-MD5: PV204S0m8zJY8zu9Q3EF+w==
Accept: */*
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIBYS55OSD2FOBFUSC/20200923/us-west-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;amz-sdk-request;content-length;content-md5;content-type;host;x-amz-content-sha256;x-amz-date, Signature=d013028d77e45f3dcce5f46f3fb53cdeeb3c9cfbd931371e69a9925047e61cd3
Host: nuix-nov-dev.s3.us-west-1.amazonaws.com
User-Agent: aws-sdk-cpp/1.7.333 Windows/10.0.19041.329 x86 MSVC/1927
amz-sdk-invocation-id: E57D09A7-B5E7-4E2A-8B2D-B493147F06D7
amz-sdk-request: attempt=1
x-amz-content-sha256: UNSIGNED-PAYLOAD
x-amz-date: 20200923T212738Z
Content-Length: 5242880
Chilkat 为我们提供了一个新的“测试版”版本,允许我们指定Content-MD5
即使对于 AWS Signature V4,它也不会删除它,但是,它是对自动计算的 SHA-256 的补充x-amz-content-sha256
所以这不必要地加倍了散列,并且最好能够指定UNSIGNED-PAYLOAD
出于 AWS 签名的目的。
如果出现内容不匹配错误Content-MD5
值,AWS 返回此值(状态为 400):
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidDigest</Code>
<Message>The Content-MD5 you specified was invalid.</Message>
<Content-MD5>thisisbad</Content-MD5>
<RequestId>8274DC9566D4AAA8</RequestId>
<HostId>H6kSy4cl+54nMon1Hq6AGjmTX/MfTVMQQr8vEVNXUnPlfMtIt8HPdObfusckhBpwpG/CJ6ORWv16c=</HostId>
</Error>
如果内容与x-amz-content-sha256
AWS 返回以下错误,我在网上很难找到该错误,并且略有不同,因此粘贴到此处(也是状态 400):
Status:400 : AWSCode: XAmzContentSHA256Mismatch : AWSMessage: The provided 'x-amz-content-sha256' header does not match what was computed.