物件儲存服務的完整性檢查

jackieathome發表於2024-07-06

使用場景有:

  • 上傳物件後,如何確定物件儲存收到的資料和客戶端本地的資料是否一致。
  • 下載物件後,如何確定本地收到的資料和物件儲存儲存的資料是否一致。

AWS S3

  • Checking object integrity
    實現完整性校驗時,AWS S3提供的演算法包括CRC32、CRC32C、SHA-1、SHA-256、MD5。
  • Amazon S3 data consistency model

相關API

  • HeadObject
  • GetObject
  • GetObjectAttributes
  • PutObject

    Content-MD5, The base64-encoded 128-bit MD5 digest of the message (without the headers) according to RFC 1864.

  • CopyObject
  • CreateMultipartUpload
  • UploadPart
  • UploadPartCopy

應用場景

依據文件Checking object integrity,基於MD5演算法,介紹完整性實現方案。

上傳物件時的服務端校驗方案

  • 客戶端計算物件的資料的MD5值,x1
  • 客戶端使用PutObject上傳物件時,在請求的頭部中增加Content-MD5,取值為x1
  • 服務端接收物件的資料,同步計算資料的MD5值。
  • 服務端接收物件結束,最終得到資料的MD5值,x2
  • 服務端對比x1x2
    • 如果兩者相同,則判定本次上傳過程中資料一致,上傳成功。
    • 如果兩者不相同,則判定本次上傳過程中資料不一致,上傳失敗。
  • 服務端在PutObject的響應訊息中,使用ETag欄位在頭部中返回MD5值,填充x2

上傳物件時的客戶端校驗方案

  • 客戶端使用PutObject上傳物件。
    • 客戶端在上傳過程中,同步計算資料的MD5值。
  • 服務端接收物件的資料,同步計算資料的MD5值。
  • 服務端接收物件結束,最終得到資料的MD5值,x2
    • 客戶端完成資料的MD5值的計算,x1
  • 服務端在PutObject的響應訊息中,使用ETag欄位在頭部中返回MD5值。
  • 客戶端對比x1和響應中的ETag欄位的值。
    • 如果兩者相同,則判定本次上傳過程中資料一致,上傳成功。
    • 如果兩者不相同,則判定本次上傳過程中資料不一致,上傳失敗。

客戶端下載物件時的校驗方案

  • 客戶端使用GetObject完整讀取物件的資料。
    • 從頭部中提取ETag,作為x1
  • 客戶端從HTTP流中讀取資料,同步計算MD5值。
  • 客戶端下載物件完畢,最終得到資料的MD5值,x2
  • 客戶端對比x1x2
    • 如果兩者相同,則判定本次下載過程中資料一致,下載成功。
    • 如果兩者不相同,則判定本次下載過程中資料不一致,下載失敗。

實現方案

依據文件Working with object metadata的如下描述:

An entity tag (ETag) that represents a specific version of an object. For objects that are not uploaded as a multipart upload and are either unencrypted or encrypted by server-side encryption with Amazon S3 managed keys (SSE-S3), the ETag is an MD5 digest of the data.

物件的ETag值是物件的後設資料。

基於檔案系統來實現物件儲存服務,對於相同的物件,同時提供檔案和物件的訪問能力,就ETag的實現方案,有如下場景:

  • 使用檔案的API建立、修改的檔案,使用物件的API訪問。
  • 使用物件的API建立的物件。
  • 使用物件的API建立的物件,使用檔案的API修改過,比如修改寫、截斷、追加寫等。
  • 使用物件的多段API上傳的物件。

ETag的實現策略,如下:

  • 使用檔案的API建立、修改過的檔案,ETag的取值為全0。
  • 使用物件的API建立的物件,上傳時沒有填充Content-MD5,則可選策略如下:
    • 服務端不使用物件的資料計算MD5值,ETag的取值為全0。
    • 服務端使用物件的資料計算MD5值,ETag按照實際填填充。
  • 使用物件的API建立的物件,上傳時填充了Content-MD5,則可選策略如下:
    • 服務端不使用物件的資料計算MD5值,以Content-MD5的值作為ETag,返回給客戶端,不執行服務端校驗。
    • 服務端使用物件的資料計算MD5值,作為ETag,返回給客戶端,不執行服務端校驗。
    • 服務端使用物件的資料計算MD5值,作為ETag,返回給客戶端,執行服務端校驗。
  • 使用物件的API建立的物件,使用檔案的API修改過,比如修改寫、截斷、追加寫等,物件的ETag的取值為全0。
  • 使用物件的多段API上傳的物件,則可選策略如下:
    • 合併多段介面的響應中,物件的ETag的取值為全0。
    • 參照Checking object integrity的方案,計算物件的ETag的取值。
  • 使用物件的HeadObjectGetObject訪問物件的後設資料時,更新物件的ETag值。
  • 後臺增加週期性任務,比如可基於快照,定時掃描ETag值不正確的物件,重新計算物件的ETag值。

相關文章