228
微信
通过crc64校验数据传输的完整性__数据安全_最佳实践_对象存储 OSS-阿里云
背景
数据在客户端和服务器之间传输时有可能会出错。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值。
操作说明
- Put Object / Append Object / Post Object / Multipart upload part 均会返回对应的crc64值,客户端可以在上传完成后拿到服务器返回的crc64值和本地计算的数值进行校验。
- Multipart Complete时,如果所有的part都有crc64值,则会返回整个object的crc64值;否则,比如有crc64上线之前就已经上传的part,则不返回crc64值。
- Get Object / Head Object / Get ObjectMeta 都会返回对应的crc64值(如有)。客户端可以在Get Object完成后,拿到服务器返回的crc64值和本地计算的数值进行校验。注意,range get请求返回的将会是整个object的crc64值。
- Copy相关的操作,如Copy Object / Upload Part Copy, 新生成的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)
2. 验证Put Object。
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")
3. 验证Get Object。
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")
4. 验证Upload Part 和 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 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 | 否 | |
Android SDK | 否 |
最后更新:2016-12-15 17:45:07
上一篇:
STS临时授权访问__权限管理_最佳实践_对象存储 OSS-阿里云
下一篇:
通过客户端加密保护数据__数据安全_最佳实践_对象存储 OSS-阿里云
支持的命令参数__开发者工具_容器服务-阿里云
虚拟主机访问 ASP 页面显示 An error occurred on the server when processing the URL___安全问题_技术分享_云虚机主机-阿里云
ApiTrafficControlItem__数据类型_API_API 网关-阿里云
阿里云3大核心板块落成:狠抓IoT、推出云小蜜、一大波新应用来袭
简讯:阿里云协助警方破获的一起国内规模最大黑客攻击案;等
本地运行__功能介绍_MapReduce_大数据计算服务-阿里云
回滚磁盘__磁盘_用户指南_云服务器 ECS-阿里云
重置账号__账号管理_API 参考_云数据库 RDS 版-阿里云
查询请求缓存命中率__资源监控接口_API 手册_CDN-阿里云
格式转换___图片处理指南_对象存储 OSS-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云