详情页标题前

阿里云对象存储OSS通过crc64校验数据传输的完整性-云淘科技

详情页1

数据在客户端和服务器之间传输时有可能会出错。OSS现在支持对各种方式上传的Object返回其crc64,客户端可以和本地计算的crc64值做对比,从而完成数据完整性的验证。

背景信息

OSS对新上传的Object进行crc64的计算,并将结果作为Object的元信息存储,随后在返回的response header中增加x-oss-hash-crc64ecma头部,表示其crc64值,该64位CRC根据ECMA-182标准计算得出。

对于crc64上线之前就已经存在于OSS上的Object,OSS不会对其计算crc64值,所以获取此类Object时不会返回其crc64值。

操作说明

  • PutObject、AppendObject、PostObject、MultipartUploadPart均会返回对应的crc64值,客户端可以在上传完成后拿到服务器返回的crc64值和本地计算的数值进行校验。

  • MultipartComplete时,如果所有的Part都有crc64值,则会返回整个Object的crc64值;若某些Part没有crc64值,则不返回整个Object的crc64值。例如某个Part在crc64上线之前就已经上传,则不返回crc64值。

  • GetObject、HeadObject、GetObjectMeta都会返回对应的crc64值(如有)。客户端可以在GetObject完成后,拿到服务器返回的crc64值和本地计算的数值进行校验。

    说明

    range get请求返回的将会是整个Object的crc64值。

  • Copy相关的操作,如CopyObject、UploadPartCopy,新生成的Object/Part不保证具有crc64值。

应用示例

以下为完整的Python示例代码,演示如何基于crc64值验证数据传输的完整性。

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import crcmod
import random
import string
from oss2.models import PartInfo

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填写存储空间名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 创建CRC64校验函数。
do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693, initCrc=0, xorOut=0xffffffffffffffff, rev=True)

# 校验CRC64和打印结果。
def check_crc64(local_crc64, oss_crc64, msg="check crc64"):
    if local_crc64 != oss_crc64:
        print("{0} check crc64 failed. local:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64))
        return False
    else:
        print("{0} check crc64 ok.".format(msg))
        return True

# 生成指定长度的随机字符串。
def random_string(length):
    return ''.join(random.choice(string.ascii_lowercase) for i in range(length))

# 生成一个长度为1024的随机字符串content。
content = random_string(1024)

# 设置文件的路径。
key = 'normal-key'

# 验证PutObject。
result = bucket.put_object(key, content)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(content)))
check_crc64(local_crc64, oss_crc64, "put object")

# 验证PutObject。
result = bucket.get_object(key)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(result.resp.read()))
check_crc64(local_crc64, oss_crc64, "get object")

# 验证UploadPart和Complete。
part_info_list = []
key = "multipart-key"
result = bucket.init_multipart_upload(key)
upload_id = result.upload_id
part_1 = random_string(1024 * 1024)
result = bucket.upload_part(key, upload_id, 1, part_1)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_1)))
# 检查上传的part 1数据是否完整。
check_crc64(local_crc64, oss_crc64, "upload_part object 1")
part_info_list.append(PartInfo(1, result.etag, len(part_1)))
part_2 = random_string(1024 * 1024)
result = bucket.upload_part(key, upload_id, 2, part_2)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2)))
# 检查上传的part 2数据是否完整。
check_crc64(local_crc64, oss_crc64, "upload_part object 2")
part_info_list.append(PartInfo(2, result.etag, len(part_2)))
result = bucket.complete_multipart_upload(key, upload_id, part_info_list)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2), do_crc64(oss2.to_bytes(part_1))))
# 检查最终oss上的object和本地文件是否一致。
check_crc64(local_crc64, oss_crc64, "complete object")

OSS SDK支持

部分OSS SDK已经支持上传、下载使用crc64进行数据校验,用法见下表中的示例。

SDK

是否支持CRC

示例

Java SDK

CRCSample.java

Python SDK

object_check.py

PHP SDK

C# SDK

C SDK

oss_crc_sample.c

JavaScript SDK

Go SDK

crc_test.go

Ruby SDK

iOS SDK

OSSCrc64Tests.m

Android SDK

CRC64Test.java

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/158672.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云对象存储OSSJava查询文件-云淘科技

    本文介绍如何使用Java SDK的SelectObject查询CSV和JSON文件。 说明 关于SelectObject的更多信息,请参见开发指南中的查询文件和API参考中的SelectObject。 注意事项 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的R…

    阿里云对象存储 2023年12月10日
  • 腾讯云容器服务TKE Kubernetes 大版本更新说明同尘科技

    1.24 changes since 1.22 注意:1. Kubernetes 1.24通过 Dockershim 对 Docker 的支持已移除,TKE 新建节点的容器运行时仅支持 Containerd 1.6.9。2. 针对集群1.22 升级1.24场景,运行时为 docker、containerd 1.4 版本以下(不包含 1.4)的节点,仅支持通过…

    腾讯云 2023年12月9日
  • 腾讯云GPU云服务器概述

    背景信息 近几年随着 AI 模型参数的倍增及训练数据的日益增长,用户对模型迭代效率的需求也随之增长,单个 GPU 的算力和显存资源已无法满足大部分业务场景,使用单机多卡或多机多卡训练已成为趋势。单机多卡训练场景的参数同步借助 NVIDIA NVLINK 技术,基本可以获得较高的线性扩展比,但多机多卡训练场景严重依赖多机之间的网络互联技术。网卡厂商提供了高速互…

    2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 腾讯云容器服务原生节点开启 SSH 密钥登录同尘科技

    操作场景 本文档介绍为原生节点开启 SSH 密钥登录的相关操作,包括为节点池、节点指定和修改 SSH 密钥等。 操作步骤 节点池维度 创建节点池时指定为已有节点池指定您可在创建时为节点池指定全局维度的 SSH 密钥,通过节点池扩容的节点默认会下发该密钥。1. 登录 容器服务控制台,选择左侧导航栏中的集群。2. 在集群列表页中,单击集群 ID,进入该集群详情页…

    2023年12月9日
  • 阿里云大数据开发治理平台 DataWorksListBaselines-云淘科技

    获取基线配置列表。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 请求参数 名称 类型 是否必选 示例值 描述 Action String 是 ListBaselines 系统规定参数。取值:ListBaselines。 Owner String…

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。