对象存储服务的完整性检查
1.MinIO客户端之alias2.MinIO客户端之tree3.MinIO客户端之cat4.MinIO客户端之ping5.MinIO客户端之ls6.MinIO客户端之license7.MinIO客户端之mb8.MinIO客户端之du9.MinIO客户端之rb10.MinIO客户端之cp11.MinIO客户端之mv12.MinIO客户端之rm13.MinIO客户端之share14.MinIO客户端之stat15.MinIO客户端之head16.MinIO客户端之diff17.MinIO入门18.Jetty使用入门19.Jetty的https模块20.Jetty的http模块21.Jetty的server模块22.Jetty的ssl模块23.Jetty的工作参数24.Jetty的模块25.Jetty的threadpool模块26.Jetty的console-capture模块27.Jetty的bytebufferpool模块28.Jetty的http3模块29.Jetty的http2模块30.Jetty的http-forwarded模块31.基于开源软件构建存储解决方案的思考32.基于文件语义实现S3接口语义的注意事项33.Lustre架构介绍的阅读笔记-基础知识34.Lustre架构介绍的阅读笔记-客户端35.Lustre架构介绍的阅读笔记-SMB协议36.为什么选择入行分布式存储37.为什么需要分布式存储38.对象存储服务中对象业务的非标接口39.对象存储服务的元数据检索特性40.对象存储服务的事件通知特性41.对象存储服务的图像处理特性42.对象存储服务的Lambda特性43.Lustre的资料44.对象业务的追加写接口45.对象业务的修改元数据接口46.对象业务的修改数据接口47.对象业务的重命名接口48.对象存储服务的加密特性49.对象存储服务的回源特性
50.对象存储服务的完整性检查
51.对象业务的select接口52.对象业务的批量删除接口53.对象存储服务的压缩特性使用场景有:
- 上传对象后,如何确定对象存储收到的数据和客户端本地的数据是否一致。
- 下载对象后,如何确定本地收到的数据和对象存储保存的数据是否一致。
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值。
本文来自博客园,作者:jackieathome,转载请注明原文链接:https://www.cnblogs.com/jackieathome/p/18287178
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性