使用场景有:

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

AWS S3

相关API

应用场景

依据文档
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
      ,返回给客户端,执行服务端校验。
  • 使用对象的API创建的对象,使用文件的API修改过,比如修改写、截断、追加写等,对象的
    ETag
    的取值为全0。
  • 使用对象的多段API上传的对象,则可选策略如下:
    • 合并多段接口的响应中,对象的
      ETag
      的取值为全0。
    • 参照
      Checking object integrity
      的方案,计算对象的
      ETag
      的取值。
  • 使用对象的
    HeadObject

    GetObject
    访问对象的元数据时,更新对象的
    ETag
    值。
  • 后台增加周期性任务,比如可基于快照,定时扫描
    ETag
    值不正确的对象,重新计算对象的
    ETag
    值。

标签: none

添加新评论