首页 > 其他分享 >对象存储服务的完整性检查

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

时间:2024-07-06 13:19:14浏览次数:16  
标签:存储 对象 完整性检查 ETag 客户端 上传 服务端 MD5

使用场景有:

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

AWS S3

相关API

应用场景

依据文档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,客户端,上传,服务端,MD5
From: https://www.cnblogs.com/jackieathome/p/18287178

相关文章

  • Java面试八股之MySQL存储引擎都有哪些
    MySQL存储引擎都有哪些MySQL提供了多种存储引擎,每种引擎都有其独特的特性和用途。以下是一些常用的MySQL存储引擎:InnoDB默认存储引擎(自MySQL5.5版本起)。支持事务(ACID属性)、行级锁定和外键约束。使用B+树作为索引结构。适合需要高并发的事务处理和高可靠性的场景。MyISA......
  • InnoDB存储引擎中的锁
    InnoDB存储引擎中的锁一、锁类型在InnoDB中实现了两个标准的行级锁,可以简单的看为两个读写锁:S共享锁:又叫读锁,其他事务可以继续加共享锁,但是不能继续加排他锁。X排他锁:又叫写锁,一旦加了写锁之后,其他事务就不能加锁了。如果一个事务T1已经获得了行r的共享锁,那么另外的事务T......
  • pwn的linux基础(计算机内部数据结构存储形式)
    linux基础保护层级:分为四个ring0-ring3一般来说就两个,0和30为内核3为用户 权限:用户分为多个组文件和目录等等的权限一般都是三个,即可读可写可执行。读:R,写:W,执行:X赋予一个可执行文件执行权限就是chmod+xfilename虚拟内存和物理内存:物理内存很直白,就是内存......
  • Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载
    Typecho 简介Typecho是一个简单、强大的轻量级开源博客平台,用于建立个人独立博客。它具有高效的性能,支持多种文件格式,并具有对设备的响应式适配功能。Typecho相对于其他CMS还有一些特殊优势:包括可扩展性、不同数据库之间的切换能力、体积小巧以及易于部署上等。Typecho的......
  • 【Unity几种数据存储之间的区别】PlayerPrefs、Json、XML、二进制、SQLite数据存储之
    ......
  • Windows编程之多线程事件对象(Event Object)用法详解
    目录一、前言二、基础用法三、API详解1.创建事件对象2控制事件状态3.等待事件对象:四、实战案例1.案例描述 2.代码设计 3.总设计代码4.运行结果一、前言        事件对象(EventObject)是我们在大型项目中,进行多线程同步处理的时候经常用到的一种内核对象......
  • UWA学堂上新|MMO游戏创建加载游戏角色对应服务器数据存储和读取
    课程是《基于.NetCore开发MMORPG分布式游戏服务器》系列课程第5节,课程旨在帮助大家从零开始搭建商业化MMORPG的分布式服务器框架,包括不同种类服务器的线程模型,如中心服务器、网关服务器、游戏服务器、寻路服务器等,并讲解了这些服务器该如何根据各自的职责进行业务模块分工。 ......
  • BeanUtil复制时,两对象中数据类型不一致导致的问题Can not set java.time.LocalDateTim
    @DatapublicclassAVo{privateLongendTime;privateStringname;privateStringid;}@DatapublicclassABVo{privateLocalDateTimeendTime;privateStringname;privateStringid;}AVoaVo=newAVo();......
  • 面向对象设计的6大原则
    一.软件设计的六大原则,通常被称为SOLID原则,是面向对象设计(OOD)中最重要的指导方针之一。这些原则旨在提高软件的可维护性、可扩展性和可读性。以下是SOLID原则的详细解释:1.单一职责原则(SingleResponsibilityPrinciple,SRP)单一职责原则指出,一个类应该只有一个引起它变化的......
  • 阿里云OSS存储--java
    在yml文件配置属性,使用@Value进行注入@ComponentpublicclassAliOSSUtils{//外部属性注入@Value("${aliyun.oss.endpoint}")Stringendpoint;//@Value("${aliyun.oss.accessKeyId}")@Value("${aliyun.oss.accessKeySecret}")......