更新时间:2024-11-13 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权限控制概述,配置方式详见使用IAM自定义策略配置对象策略
  • 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说明,请参见服务端加密简介
  • 更多关于服务端加密的示例代码,请参见Github示例
  • 服务端加密接口返回的错误码含义、问题原因及处理措施可参考OBS错误码

相关文档