本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用檢查總和保護資料完整性
Amazon Simple Storage Service (Amazon S3) 可讓您在上傳物件時指定檢查總和。當您指定檢查總和時,它會與 物件一起存放,並在下載物件時驗證。
當您傳輸檔案時,檢查總和可提供多一層的資料完整性。透過檢查總和,您可以確認收到的檔案符合原始檔案,以驗證資料一致性。如需使用 Amazon S3 檢查總和的詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南,包括支援的演算法。
您可以靈活地選擇最符合您需求的演算法,並讓 SDK 計算檢查總和。或者,您可以使用其中一個支援的演算法提供預先計算的檢查總和值。
注意
從 Amazon S3 模組 1.74.1CRC32
檢查總和,以提供預設完整性保護。如果您未提供預先計算的檢查總和值,或未指定 SDK 應該用來計算檢查總和的演算法,則 SDK 會計算此檢查總和。
軟體開發套件也提供全域設定,用於外部設定的資料完整性保護,您可以在軟體AWS SDKs和工具參考指南中閱讀這些保護。
我們討論兩個請求階段的檢查總和:上傳物件和下載物件。
上傳物件
當您使用 putObject
方法上傳物件並提供檢查總和演算法時,軟體開發套件會計算指定演算法的檢查總和。
下列程式碼片段顯示使用CRC32
檢查總和上傳物件的請求。當 SDK 傳送請求時,它會計算CRC32
檢查總和並上傳物件。Amazon S3 透過計算檢查總和並將其與 SDK 提供的檢查總和進行比較,來驗證內容的完整性。然後,Amazon S3 會將檢查總和與 物件一起存放。
out, err := s3Client.PutObject(context.Background(), &s3.PutObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ChecksumAlgorithm: types.ChecksumAlgorithmCrc32, Body: strings.NewReader("Hello World"), })
如果您未隨請求提供檢查總和演算法,檢查總和行為會因您使用的 SDK 版本而異,如下表所示。
未提供檢查總和演算法時的檢查總和行為
的 Amazon S3 模組版本 適用於 Go 的 AWS SDK | 檢查總和行為 |
---|---|
早於 v1.74.1 | 軟體開發套件不會自動計算以 CRC 為基礎的檢查總和,並在請求中提供該檢查總和。 |
v1.74.1 或更新版本 |
SDK 使用 |
使用預先計算的檢查總和值
請求隨附的預先計算檢查總和值會停用 SDK 的自動運算,並改用提供的值。
下列範例顯示具有預先計算 SHA256 檢查總和的請求。
out, err := s3Client.PutObject(context.Background(), &s3.PutObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ChecksumCRC32: aws.String("checksumvalue"), Body: strings.NewReader("Hello World"), })
如果 Amazon S3 判斷指定演算法的檢查總和值不正確,則服務會傳回錯誤回應。
分段上傳
您也可以搭配分段上傳使用檢查總和。
適用於 Go 的 AWS SDK 提供兩個選項,以使用具有分段上傳的檢查總和。第一個選項使用指定上傳CRC32
演算法的傳輸管理員。
s3Client := s3.NewFromConfig(cfg) transferManager := manager.NewUploader(s3Client) out, err := transferManager.Upload(context.Background(), &s3.PutObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), Body:
large file to trigger multipart upload
, ChecksumAlgorithm: types.ChecksumAlgorithmCrc32, })
如果您在使用傳輸管理員進行上傳時未提供檢查總和演算法,軟體開發套件會根據CRC32
演算法自動計算和檢查總和。軟體開發套件會針對所有版本的軟體開發套件執行此計算。
第二個選項使用 Amazon S3
s3Client := s3.NewFromConfig(cfg) createMultipartUploadOutput, err := s3Client.CreateMultipartUpload(context.Background(), &s3.CreateMultipartUploadInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ChecksumAlgorithm: types.ChecksumAlgorithmCrc32, }) if err != nil { log.Fatal("err create multipart upload ", err) } var partsBody []io.Reader // this is just an example parts content, you should load your target file in your code partNum := int32(1) var completedParts []types.CompletedPart for _, body := range partsBody { uploadPartOutput, err := s3Client.UploadPart(context.Background(), &s3.UploadPartInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ChecksumAlgorithm: types.ChecksumAlgorithmCrc32, Body: body, PartNumber: aws.Int32(partNum), UploadId: createMultipartUploadOutput.UploadId, }) if err != nil { log.Fatal("err upload part ", err) } completedParts = append(completedParts, types.CompletedPart{ PartNumber: aws.Int32(partNum), ETag: uploadPartOutput.ETag, ChecksumCRC32: uploadPartOutput.ChecksumCRC32, }) partNum++ } completeMultipartUploadOutput, err := s3Client.CompleteMultipartUpload(context.Background(), &s3.CompleteMultipartUploadInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), UploadId: createMultipartUploadOutput.UploadId, MultipartUpload: &types.CompletedMultipartUpload{ Parts: completedParts, }, }) if err != nil { log.Fatal("err complete multipart upload ", err) }
下載物件
當您使用 GetObjectChecksumMode
欄位GetObjectInput
設定為 時自動驗證檢查總和types.ChecksumModeEnabled
。
以下程式碼片段中的請求會指示 SDK 透過計算檢查總和並比較值來驗證回應中的檢查總和。
out, err := s3Client.GetObject(context.Background(), &s3.GetObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ChecksumMode: types.ChecksumModeEnabled, })
如果物件未使用檢查總和上傳,則不會進行驗證。