【CDN】通过crc64校验数据传输的完整性-阿里云开发者社区

开发者社区> 云上有内容> 正文

【CDN】通过crc64校验数据传输的完整性

简介: 数据在客户端和服务器之间传输时有可能会出错。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值验证数据传输的完整性。

  1. 计算crc64。
import oss2
from oss2.models import PartInfo
import os
import crcmod
import random
import string
do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693L, initCrc=0L, xorOut=0xffffffffffffffffL, rev=True)
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.lowercase) for i in range(length))
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
  1. 验证PutObject。
content = random_string(1024)
 key = 'normal-key'
 result = bucket.put_object(key, content)
 oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
 local_crc64 = str(do_crc64(content))
 check_crc64(local_crc64, oss_crc64, "put object")
  1. 验证GetObject。
content = random_string(1024)
 key = 'normal-key'
 result = bucket.put_object(key, content)
 oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
 local_crc64 = str(do_crc64(content))
 check_crc64(local_crc64, oss_crc64, "put object")
  1. 验证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(part_1))
 #check 上传的 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(part_2))
 #check 上传的 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(part_2, do_crc64(part_1)))
 #check 最终oss上的object和本地文件是否一致
 check_crc64(local_crc64, oss_crc64, "complete object")


OSS SDK支持

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

SDK是否支持CRC示例
Java SDKCRCSample.java
Python SDKobject_check.py
PHP SDK
C# SDK
C SDKoss_crc_sample.c
JavaScript SDK
Go SDKcrc_test.go
Ruby SDK
iOS SDKOSSCrc64Tests.m
Android SDKCRC64Test.java


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CRC校验
1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
700 0
大数据下的玩法 DNS MAPPING
https://dnsdumpster.com/ https://scans.io/ http://www.
617 0
通过MD5校验游戏安装文件完整性实例演示,MD5校验工具Hash使用演示
通过MD5校验游戏安装文件完整性实例演示,MD5校验工具Hash使用演示
13 0
手把手的numpy入门教程,从此数据处理不再慌
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape。在保证数组当中所有元素不变的前提下,变更数组形状的操作。
707 0
26
文章
52
问答
来源圈子
更多
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载