使用 aws-sdk-go-v2 时,校验和完整性检查似乎不适用于 S3 分段上传。我做错了什么?

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

我正在尝试使用 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,但我已经阅读了很多文档,但我仍然无法弄清楚我做错了什么以及如何获得以下的校验和:每个部分。

上传本身运行良好,但校验和计算我无法弄清楚。

amazon-web-services go amazon-s3 sdk upload
1个回答
0
投票

来自文档:

x-amz-checksum-sha256
对象的 base64 编码、256 位 SHA-256 摘要。 仅当与对象一起上传时才会出现。当您对使用分段上传上传的对象使用 API 操作时,该值可能不是完整对象的直接校验和值。相反,它是基于每个单独部分的校验和值的计算。有关如何通过分段上传计算校验和的更多信息,请参阅 Amazon S3 用户指南中的检查对象完整性。

您似乎没有随上传请求一起提供校验和。

校验和的全部目的是确保您的对象在上传时没有被损坏

为此,您应该在客户端计算校验和,并将其与您的请求一起传递,然后S3将在其端计算它,并且只有匹配时才会接受该请求。

S3上传后返回的校验和只是为了您的方便。严格来说,这是多余的。它将始终与您随请求传递的内容匹配,否则将返回异常而不是响应。

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