閱讀228 返回首頁    go 阿裏雲


通過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。

  1. import oss2
  2. from oss2.models import PartInfo
  3. import os
  4. import crcmod
  5. import random
  6. import string
  7. do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693L, initCrc=0L, xorOut=0xffffffffffffffffL, rev=True)
  8. def check_crc64(local_crc64, oss_crc64, msg="check crc64"):
  9. if local_crc64 != oss_crc64:
  10. print "{0} check crc64 failed. local:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64)
  11. return False
  12. else:
  13. print "{0} check crc64 ok.".format(msg)
  14. return True
  15. def random_string(length):
  16. return ''.join(random.choice(string.lowercase) for i in range(length))
  17. bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)

2. 驗證Put Object。

  1. content = random_string(1024)
  2. key = 'normal-key'
  3. result = bucket.put_object(key, content)
  4. oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
  5. local_crc64 = str(do_crc64(content))
  6. check_crc64(local_crc64, oss_crc64, "put object")

3. 驗證Get Object。

  1. result = bucket.get_object(key)
  2. oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
  3. local_crc64 = str(do_crc64(result.resp.read()))
  4. check_crc64(local_crc64, oss_crc64, "get object")

4. 驗證Upload Part 和 Complete。

  1. part_info_list = []
  2. key = "multipart-key"
  3. result = bucket.init_multipart_upload(key)
  4. upload_id = result.upload_id
  5. part_1 = random_string(1024 * 1024)
  6. result = bucket.upload_part(key, upload_id, 1, part_1)
  7. oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
  8. local_crc64 = str(do_crc64(part_1))
  9. #check 上傳的 part 1數據是否完整
  10. check_crc64(local_crc64, oss_crc64, "upload_part object 1")
  11. part_info_list.append(PartInfo(1, result.etag, len(part_1)))
  12. part_2 = random_string(1024 * 1024)
  13. result = bucket.upload_part(key, upload_id, 2, part_2)
  14. oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
  15. local_crc64 = str(do_crc64(part_2))
  16. #check 上傳的 part 2數據是否完整
  17. check_crc64(local_crc64, oss_crc64, "upload_part object 2")
  18. part_info_list.append(PartInfo(2, result.etag, len(part_2)))
  19. result = bucket.complete_multipart_upload(key, upload_id, part_info_list)
  20. oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
  21. local_crc64 = str(do_crc64(part_2, do_crc64(part_1)))
  22. #check 最終oss上的object和本地文件是否一致
  23. 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

  上一篇:go STS臨時授權訪問__權限管理_最佳實踐_對象存儲 OSS-阿裏雲
  下一篇:go 通過客戶端加密保護數據__數據安全_最佳實踐_對象存儲 OSS-阿裏雲