九游平台/ 对象存储服务 obs/ sdk参考/ / / 服务端加密(python sdk)
更新时间:2025-02-26 gmt 08:00

服务端加密(python sdk)-九游平台

功能说明

用户可以使用普通方式上传、下载对象,也可以使用服务端加密方式进行上传、下载对象。

obs支持服务端加密功能,使加密的行为在服务端进行。

用户可以根据自身的需求,使用不同的密钥管理方式来使用服务端加密功能。当前支持两种服务端加密方式: kms托管密钥的服务端加密(sse-kms)和客户提供加密密钥的服务端加密(sse-c)。上述两种方式都采用行业标准的aes256加密算法。

sse-kms方式,obs使用kms(key management service)服务提供的密钥进行服务端加密。

sse-c方式,obs使用用户提供的密钥和密钥的md5值进行服务端加密。

使用服务端加密,返回的etag值不是对象的md5值。无论是否使用服务端加密上传对象,请求消息头中加入content-md5参数时,obs均会对对象进行md5校验。

更多关于服务端加密的内容请参考服务端加密

接口约束

  • 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用iam或桶策略进行授权,如果使用iam则需授予obs:object:putobject权限,如果使用桶策略则需授予putobject权限。相关授权方式介绍可参见obs权限控制概述,配置方式详见、。
  • obs支持的region与endpoint的对应关系,详细信息请参见。

方法定义

obsclient.putfile(bucketname, objectkey, file_path, metadata, headers, extensionheaders)

支持接口

obs python sdk支持服务端加密的接口见下表:

obs python sdk接口方法

描述

支持加密类型

obsclient.putcontent

上传内容时设置加密算法、密钥,对对象启用服务端加密。

sse-kms

sse-c

obsclient.putfile

上传文件时设置加密算法、密钥,对对象启用服务端加密。

sse-kms

sse-c

obsclient.getobject

下载对象时设置解密算法、密钥,用于解密对象。

sse-c

obsclient.copyobject

  1. 复制对象时设置源对象的解密算法、密钥,用于解密源对象。
  2. 复制对象时设置目标对象的加密算法、密钥,对目标对象启用加密算法。

sse-kms

sse-c

obsclient.getobjectmetadata

获取对象元数据时设置解密算法、密钥,用于解密对象。

sse-c

obsclient.initiatemultipartupload

初始化分段上传任务时设置加密算法、密钥,对分段上传任务最终生成的对象启用服务端加密。

sse-kms

sse-c

obsclient.uploadpart

上传段时设置加密算法、密钥,对分段数据启用服务端加密。

sse-c

obsclient.copypart

  1. 复制段时设置源对象的解密算法、密钥,用于解密源对象。
  2. 复制段时设置目标段的加密算法、密钥,对目标段启用加密算法。

sse-c

返回结果

表1 返回结果

类型

说明

getresult

参数解释:

sdk公共结果对象。

表2 getresult

参数名称

参数类型

描述

status

int

参数解释:

http状态码。

取值范围:

状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见。

默认取值:

reason

str

参数解释:

http文本描述。

默认取值:

errorcode

str

参数解释:

obs服务端错误码,当status参数小于300时为空。

默认取值:

errormessage

str

参数解释:

obs服务端错误描述,当status参数小于300时为空。

默认取值:

requestid

str

参数解释:

obs服务端返回的请求id。

默认取值:

indicator

str

参数解释:

obs服务端返回的错误定位码。

默认取值:

hostid

str

参数解释:

请求的服务端id,当status参数小于300时为空。

默认取值:

resource

str

参数解释:

发生错误时相关的桶或对象,当status参数小于300时为空。

默认取值:

header

list

参数解释:

响应消息头列表,由多个元组构成。每个元组均包含两个元素,代表响应头的键值对。

默认取值:

body

object

参数解释:

操作成功后的结果数据,当status大于300时为空。该值根据调用接口的不同而不同,参见“”章节和“”章节的详细描述。

默认取值:

代码样例

本示例使用服务端加密sse-kms方式加密上传文件和下载加密文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from obs import obsclient
from obs import putobjectheader, getobjectheader
from obs import ssekmsheader
import os
import traceback
# 推荐通过环境变量获取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"
# 创建obsclient实例
# 如果使用临时aksk和securitytoken访问obs,需要在创建实例时通过security_token参数指定securitytoken值
obsclient = obsclient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    put_headers = putobjectheader()
    # 设置sse-kms算法加密对象
    put_headers.sseheader = ssekmsheader.getinstance()
    bucketname = "examplebucket"
    # 对象名,即上传后的文件名
    objectkey = "objectname"
    # 待上传文件/文件夹的完整路径,如aa/bb.txt,或aa/
    file_path = 'localfile'
    # 上传对象加密
    resp = obsclient.putfile(bucketname, objectkey, file_path, headers=put_headers)
    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp.status < 300:
        print('put file succeeded')
        print('requestid:', resp.requestid)
    else:
        print('put file failed')
        print('requestid:', resp.requestid)
        print('errorcode:', resp.errorcode)
        print('errormessage:', resp.errormessage)
# ---------------------------------------------------------------------------------------------------------------------
    get_headers = getobjectheader()
    # 设置sse-kms算法解密对象
    get_headers.sseheader = ssekmsheader.getinstance()
    bucketname = "examplebucket"
    objectkey = "objectname"
    # 下载到本地的路径,localfile为包含本地文件名称的全路径
    downloadpath = 'localfile'
    # 下载对象解密
    resp2 = obsclient.getobject(bucketname, objectkey, downloadpath, headers=get_headers)
    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp2.status < 300:
        print('get object succeeded')
        print('requestid:', resp2.requestid)
    else:
        print('get object failed')
        print('requestid:', resp2.requestid)
        print('errorcode:', resp2.errorcode)
        print('errormessage:', resp2.errormessage)
except:
    print(traceback.format_exc())

本示例使用服务端加密sse-c方式加密上传文件和下载加密文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from obs import obsclient
from obs import putobjectheader, getobjectheader
from obs import ssecheader
import os
import traceback
# 推荐通过环境变量获取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"
# 创建obsclient实例
# 如果使用临时aksk和securitytoken访问obs,需要在创建实例时通过security_token参数指定securitytoken值
obsclient = obsclient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    put_headers = putobjectheader()
    # 设置sse-c算法加密对象,encryption为加密方式,key为由aes-256算法生成的sse-c密钥
    put_headers.sseheader = ssecheader(encryption='aes256', key='your sse-c key generated by aes-256 algorithm')
    bucketname = "examplebucket"
    # 对象名,即上传后的文件名
    objectkey = "objectname"
    # 待上传文件/文件夹的完整路径,如aa/bb.txt,或aa/
    file_path = 'localfile'
    # 上传对象加密
    resp = obsclient.putfile(bucketname, objectkey, file_path, headers=put_headers)
    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp.status < 300:
        print('put file succeeded')
        print('requestid:', resp.requestid)
    else:
        print('put file failed')
        print('requestid:', resp.requestid)
        print('errorcode:', resp.errorcode)
        print('errormessage:', resp.errormessage)
# ---------------------------------------------------------------------------------------------------------------------
    get_headers = getobjectheader()
    # 设置sse-c算法解密对象,此处的密钥必须和上传对象加密时使用的密钥一致
    get_headers.sseheader = ssecheader(encryption='aes256', key='your sse-c key generated by aes-256 algorithm')
    bucketname = "examplebucket"
    objectkey = "objectname"
    # 下载到本地的路径,localfile为包含本地文件名称的全路径
    downloadpath = 'localfile'
    # 下载对象解密
    resp2 = obsclient.getobject(bucketname, objectkey, downloadpath, headers=get_headers)
    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp2.status < 300:
        print('get object succeeded')
        print('requestid:', resp2.requestid)
    else:
        print('get object failed')
        print('requestid:', resp2.requestid)
        print('errorcode:', resp2.errorcode)
        print('errormessage:', resp2.errormessage)
except:
    print(traceback.format_exc())

相关链接

  • 关于服务端加密的api说明,请参见。
  • 更多关于服务端加密的示例代码,请参见。
  • 服务端加密接口返回的错误码含义、问题原因及处理措施可参考obs错误码

相关文档

网站地图