使用檢查總和保護資料完整性 - 適用於 Go 的 AWS SDK v2

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用檢查總和保護資料完整性

Amazon Simple Storage Service (Amazon S3) 可讓您在上傳物件時指定檢查總和。當您指定檢查總和時,它會與 物件一起存放,並在下載物件時驗證。

當您傳輸檔案時,檢查總和可提供多一層的資料完整性。透過檢查總和,您可以確認收到的檔案符合原始檔案,以驗證資料一致性。如需使用 Amazon S3 檢查總和的詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南,包括支援的演算法

您可以靈活地選擇最符合您需求的演算法,並讓 SDK 計算檢查總和。或者,您可以使用其中一個支援的演算法提供預先計算的檢查總和值。

注意

Amazon S3 模組 1.74.1 版開始,軟體開發套件會自動計算上傳的CRC32檢查總和,以提供預設完整性保護。如果您未提供預先計算的檢查總和值,或未指定 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 使用CRC32演算法來計算檢查總和,並在請求中提供檢查總和。Amazon S3 透過計算自己的CRC32檢查總和來驗證傳輸的完整性,並將其與 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) }

下載物件

當您使用 GetObject 方法下載物件時,開發套件會在 的 ChecksumMode 欄位GetObjectInput設定為 時自動驗證檢查總和types.ChecksumModeEnabled

以下程式碼片段中的請求會指示 SDK 透過計算檢查總和並比較值來驗證回應中的檢查總和。

out, err := s3Client.GetObject(context.Background(), &s3.GetObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ChecksumMode: types.ChecksumModeEnabled, })

如果物件未使用檢查總和上傳,則不會進行驗證。