AWS S3 SetContentMD5失效:设置任意值均能成功上传
关于AWS S3 PutObject请求中Content-MD5校验异常的问题
我希望通过MD5校验确保AWS S3接收到的内容与发送的一致,但发现向请求中设置任意内容都能成功上传至S3。
我编写的代码如下:
void put_object_buf(Aws::String& bucketName, Aws::String& objectName, S3::S3Client& s3_client) { Aws::S3::Model::PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(bucketName); std::shared_ptr<Aws::IOStream> bigStream = Create5MbStreamForUploadPart("La"); putObjectRequest.SetBody(bigStream); putObjectRequest.SetContentLength(static_cast<long>(putObjectRequest.GetBody()->tellp())); // putObjectRequest.SetContentMD5(Aws::Utils::HashingUtils::Base64Encode(Aws::Utils::HashingUtils::CalculateMD5(*putObjectRequest.GetBody()))); putObjectRequest.SetContentMD5("123"); // 仍然能成功上传 putObjectRequest.SetKey(objectName); Aws::S3::Model::PutObjectOutcome outcome = s3_client.PutObject(putObjectRequest); if (!outcome.IsSuccess()) { std::cerr << "Error: PutObjectBuffer: " << outcome.GetError().GetMessage() << std::endl; } else { std::cout << "Success: Object '" << objectName << "' uploaded to bucket '" << bucketName << "'." << std::endl; std::cout << "outcome crc32: " << outcome.GetResult().GetChecksumCRC32() << std::endl; std::cout << "outcome etag: " << outcome.GetResult().GetETag() << std::endl; } }
我尝试设置真实MD5和伪造MD5,均能正常完成上传。
此外,我发现AWS SDK日志中的PUT请求内容如下:
Host: xxx Accept: */* amz-sdk-invocation-id: xxx amz-sdk-request: attempt=1 authorization: AWS4-HMAC-SHA256 Credential=xxx/20230412/xxx/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=xxx content-length: 32 content-md5: Ipcfs07LlrdQhzZWTVN5/Q== content-type: binary/octet-stream user-agent: aws-sdk-cpp/1.11.0 Darwin/22.1.0 arm64 Clang/14.0.0 x-amz-content-sha256: UNSIGNED-PAYLOAD x-amz-date: 20230412T021756Z Expect: 100-continue
其中的content-md5并非我在请求中设置的值,这是否是AWS C++ SDK的Bug?
内容的提问来源于stack exchange,提问作者Fei Peng
相关产品推荐
相关产品推荐

