更新时间:2024-11-26 GMT+08:00
如何指定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/intl/zh-cn/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.ap-southeast-1.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算法。
父主题: 常见问题(Python SDK)