对象存储服务的完整性检查

使用场景有:

  • 上传对象后,如何确定对象存储收到的数据和客户端本地的数据是否一致。
  • 下载对象后,如何确定本地收到的数据和对象存储保存的数据是否一致。

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值。
上一篇:Interview preparation--Https 工作流程


下一篇:Mybatis