文档首页> 对象存储服务 OBS> Python> 常见问题(Python SDK)> 如何指定Content-SHA256?(Python SDK)
更新时间:2024-03-26 GMT+08:00

如何指定Content-SHA256?(Python SDK)

上传对象和上传段支持携带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算法