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-阿裏雲