使用场景有:
- 上传对象后,如何确定对象存储收到的数据和客户端本地的数据是否一致。
- 下载对象后,如何确定本地收到的数据和对象存储保存的数据是否一致。
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值。