使用場景有:
- 上傳物件後,如何確定物件儲存收到的資料和客戶端本地的資料是否一致。
- 下載物件後,如何確定本地收到的資料和物件儲存儲存的資料是否一致。
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。
- 服務端對比x1和x2。
- 如果兩者相同,則判定本次上傳過程中資料一致,上傳成功。
- 如果兩者不相同,則判定本次上傳過程中資料不一致,上傳失敗。
- 服務端在PutObject的響應訊息中,使用
ETag
欄位在頭部中返回MD5值,填充x2。
上傳物件時的客戶端校驗方案
- 客戶端使用PutObject上傳物件。
- 客戶端在上傳過程中,同步計算資料的MD5值。
- 服務端接收物件的資料,同步計算資料的MD5值。
- 服務端接收物件結束,最終得到資料的MD5值,x2。
- 客戶端完成資料的MD5值的計算,x1。
- 服務端在PutObject的響應訊息中,使用
ETag
欄位在頭部中返回MD5值。 - 客戶端對比x1和響應中的ETag欄位的值。
- 如果兩者相同,則判定本次上傳過程中資料一致,上傳成功。
- 如果兩者不相同,則判定本次上傳過程中資料不一致,上傳失敗。
客戶端下載物件時的校驗方案
- 客戶端使用GetObject完整讀取物件的資料。
- 從頭部中提取ETag,作為x1。
- 客戶端從HTTP流中讀取資料,同步計算MD5值。
- 客戶端下載物件完畢,最終得到資料的MD5值,x2。
- 客戶端對比x1和x2。
- 如果兩者相同,則判定本次下載過程中資料一致,下載成功。
- 如果兩者不相同,則判定本次下載過程中資料不一致,下載失敗。
實現方案
依據文件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,返回給客戶端,執行服務端校驗。
- 服務端不使用物件的資料計算MD5值,以
- 使用物件的API建立的物件,使用檔案的API修改過,比如修改寫、截斷、追加寫等,物件的ETag的取值為全0。
- 使用物件的多段API上傳的物件,則可選策略如下:
- 合併多段介面的響應中,物件的ETag的取值為全0。
- 參照Checking object integrity的方案,計算物件的ETag的取值。
- 使用物件的HeadObject和GetObject訪問物件的後設資料時,更新物件的ETag值。
- 後臺增加週期性任務,比如可基於快照,定時掃描ETag值不正確的物件,重新計算物件的ETag值。