我正在尝试使用 Sha256 校验和来验证通过 S3 MultiPartUpload 上传的各个部分的数据完整性。
我尝试过这样的事情:
... := s3c.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
ChecksumAlgorithm: types.ChecksumAlgorithmSha256,
})
// ... Later ... //
part := s3c.UploadPartInput{
Body: bytes.NewReader(part),
Bucket: bucket,
Key: key,
UploadId: uploadId,
PartNumber: partNumber,
ContentLength: int64(len(part)),
ChecksumAlgorithm: types.ChecksumAlgorithmSha256,
}
out, err := s3c.UploadPart(ctx, &part)
fmt.Printf("%v\n", err == nil && out.ChecksumSHA256 == nil) // Prints true.
为什么 ChecksumSHA256 为零?我如何获得这个值?
我也尝试过
ChecksumSHA256: aws.String("[some hash]")
而不是使用 ChecksumAlgorithm
达到相同的效果。即使[some hash]
完全是假的,S3似乎也不在乎。
更重要的是,如果我这样做的话
parts, err := s3c.ListParts(ctx, &s3.ListPartsInput{
Bucket: bucket,
Key: key,
UploadId: uploadId,
PartNumberMarker: nextPartNumberMarker,
})
fmt.Printf("%v\n", err == nil) // true
fmt.Printf("%s\n", parts.ChecksumAlgorithm) // empty string
fmt.Printf("%s\n", parts[0].ChecksumSHA256 == nil) // true
这是怎么回事?我确信我误解了和/或误用了 API,但我已经阅读了很多文档,但我仍然无法弄清楚我做错了什么以及如何获得以下的校验和:每个部分。
上传本身运行良好,但校验和计算我无法弄清楚。
来自文档:
对象的 base64 编码、256 位 SHA-256 摘要。 仅当与对象一起上传时才会出现。当您对使用分段上传上传的对象使用 API 操作时,该值可能不是完整对象的直接校验和值。相反,它是基于每个单独部分的校验和值的计算。有关如何通过分段上传计算校验和的更多信息,请参阅 Amazon S3 用户指南中的检查对象完整性。x-amz-checksum-sha256
您似乎没有随上传请求一起提供校验和。
校验和的全部目的是确保您的对象在上传时没有被损坏。
为此,您应该在客户端计算校验和,并将其与您的请求一起传递,然后S3将在其端计算它,并且只有匹配时才会接受该请求。
S3上传后返回的校验和只是为了您的方便。严格来说,这是多余的。它将始终与您随请求传递的内容匹配,否则将返回异常而不是响应。