如何指定Content-SHA256?(Python SDK)
上传对象和上传段支持携带x-obs-content-sha256头域。
x-obs-content-sha256头域值为请求消息体256-bit SHA256值转十六进制值,计算方式为Hex(SHA256Hash(<payload>),服务端会对携带此头域的请求计算其消息体的sha256值做校验(性能会有部分下降,在安全上推荐该算法)。
上传对象示例代码如下:
# -*- coding:utf-8 -*- # 本示例用于上传文件D:\\example.txt到examplebucket桶中的example/objectname,并指定content-sha256头域。 from obs import ObsClient import os import traceback import hashlib # 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险 # 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html ak = os.getenv("AccessKeyID") sk = os.getenv("SecretAccessKey") # 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取 security_token = os.getenv("SecurityToken") # server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。 server = "https://obs.cn-north-4.myhuaweicloud.com" # 计算文件sha256 def getSha256(file_path): # 以二进制方式读取文件内容 with open(file_path, 'rb') as f: # 创建SHA256哈希对象 sha256_hash = hashlib.sha256() # 循环读取文件内容并更新哈希值 while True: data = f.read(65536) # 每次读取64KB if not data: break sha256_hash.update(data) # 返回哈希值的十六进制表示 sha256 = sha256_hash.hexdigest() f.close() return sha256 # 创建obsClient实例 # 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值 obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server) bucketName = 'examplebucket' objectKey = 'example/objectname1' file_path = 'D:\\example.txt' # 自定义头域 extensionHeaders = {'x-obs-content-sha256': getSha256(file_path)} try: # 上传文件 resp = obsClient.putFile(bucketName, objectKey, file_path, extensionHeaders=extensionHeaders) # 返回码为2xx时,接口调用成功,否则接口调用失败 if resp.status < 300: print('Put File Succeeded') print('requestId:', resp.requestId) print('etag:', resp.body.etag) print('versionId:', resp.body.versionId) else: print('Put File Failed') print('requestId:', resp.requestId) print('errorCode:', resp.errorCode) print('errorMessage:', resp.errorMessage) except: print(traceback.format_exc())
Python SDK 同时支持MD5与SHA256校验,在安全上更推荐使用SHA256算法。