
# 客户端加密接口详情(Python SDK)
#### 客户端加密示例
完整示例代码参考[示例代码](https://github.com/huaweicloud/huaweicloud-sdk-python-obs/blob/master/examples/crypto_client_sample.py)
#### 初始化 CryptoCipher
OBS Python SDK 提供两种 CryptoCipher。您可根据使用场景自行选择。
CtrRSACipherGenerator 需要提供一个 RSA 公钥或 RSA 私钥，用以加密随机生产的数据密钥。
**方法定义**
```
CtrRSACipherGenerator(master_crypto_key_path, master_key_info=None, need_sha256=False)
```
**接口参数**
 表1CtrRSACipherGenerator 
| **参数名称**               | **参数类型** | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|:---|:---|
| master_crypto_key_path | str      | 必选       | **参数解释** **：** RSA 密钥文件的路径。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| master_key_info        | str      | 可选       | **参数解释** **：** 密钥信息，该信息会存至对象的自定义元数据中， 帮助您区分不同crypto_key，需您自行维护 master_key_info 与 crypto_key 的映射关系。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                     |
| need_sha256            | bool     | 可选       | **参数解释** **：** 是否校验加密后数据的sha256，并设置加密前后的sha256作为自定义元数据。 说明： 为了节省内存开销，SDK 采用了流式计算的方法，这也就意味着，普通上传时需要读取并加密文件两次；另外由于断点续传上传接口为分段上传接口的封装，在断点续传下，则需要读取并加密文件三次。 **取值范围：** True：校验加密后数据的sha256，SDK自动计算待上传对象的加密前 sha256 值与加密后的 sha256 值，并存至对象自定义元数据，同时也会在发送请求时置于请求头，服务端收到请求后会计算收到对象的 sha256，如果 sha256 不一致会返回错误信息。 False：不校验加密后数据的sha256。 **默认取值：** False |
   
CTRCipherGenerator 仅需提供一个数据密钥，所有对象均使用该数据密钥进行加密。
**方法定义**
```
CTRCipherGenerator(crypto_key, master_key_info=None, crypto_iv=None, need_sha256=False)
```
**接口参数**
 表2CTRCipherGenerator 
| **参数名称**        | **参数类型**     | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| crypto_key      | str or bytes | 必选       | **参数解释** **：** 加密数据所使用的数据密钥。 **约束限制：** - 长度为 32 bytes。  - 如果传入的是字符串也会被转换为bytes。   **默认取值：** 无                                                                                                                                                                           |
| master_key_info | str          | 可选       | **参数解释** **：** 密钥信息，该信息会存至对象的自定义元数据中， 帮助您区分不同crypto_key，需您自行维护 master_key_info 与 crypto_key 的映射关系。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                    |
| crypto_iv       | str or bytes | 可选       | **参数解释** **：** 加密数据时所使用的初始值。 **约束限制：** - 长度为 16 bytes。  - 指定crypto_iv时，所有对象均使用该初始值加密；未指定crypto_iv时，SDK会为每个对象随机生成不同初始值。   **默认取值：** 无                                                                                                                                  |
| need_sha256     | bool         | 可选       | **参数解释** **：** 是否校验加密后数据的sha256，并设置加密前后的sha256作为自定义元数据。 说明： 为了节省内存开销，SDK 采用了流式计算的方法，这也就意味着，普通上传时需要读取并加密文件两次；另外由于断点续传上传接口为分段上传接口的封装，在断点续传下，则需要读取并加密文件三次。 **取值范围：** True：校验加密后数据的sha256，SDK自动计算待上传对象的加密前 sha256 值与加密后的 sha256 值，并存至对象自定义元数据，同时也会在发送请求时置于请求头，服务端收到请求后会计算收到对象的 sha256，如果 sha256 不一致会返回错误信息。 False：不校验加密后数据的sha256。 **默认取值：** False |
   
#### 初始化 CryptoClient
初始化 CryptoClient 继承自初始化普通 OBS Client，详细配置可参考[OBS客户端初始化(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0601.html)
**方法定义**
```
CryptoClient(access_key_id,secret_access_key,server,cipher_generator=your-cipher_generator, *args, **kwargs)
```
**接口参数**
表3请求参数列表 
| **参数**            | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | **建议值** |
|:---|:---|:---|
| access_key_id     | **参数解释** **：** 访问密钥中的AK。 **默认取值：** 空字符串，表示匿名用户                                                                                                                                                                                                                                                                                                                              | N/A     |
| secret_access_key | **参数解释** **：** 访问密钥中的SK。 **默认取值：** 空字符串，表示匿名用户                                                                                                                                                                                                                                                                                                                                 | N/A     |
| server            | **参数解释** **：** 连接OBS的服务地址。可包含协议类型、域名、端口号。示例：https://your-endpoint:443。（出于安全性考虑，建议使用https协议）。 **默认取值：** 无                                                                                                                                                                                                                                                                        | N/A     |
| cipher_generator  | **参数解释** **：** 该加密客户端所使用的 cipher_generator。 **取值范围：** - [CtrRSACipherGenerator]  - [CTRCipherGenerator]   **默认取值：** 无 | N/A     |
   
#### 初始化加密上传段任务
初始化加密多段上传任务继承自普通 OBS Client 的初始化上传段任务接口，详细参数可参考[分段上传-初始化上传段任务(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1002.html)
**方法定义**
```
CryptoClient.initiateEncryptedMultipartUpload(bucketName, objectKey, crypto_cipher, *args, **kwargs)
```
**接口参数**
表4请求参数列表 
| **参数名称**      | **参数类型**  | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|:---|:---|
| bucketName    | str       | 必选       | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **默认取值：** 无 |
| objectKey     | str       | 必选       | **参数解释：** 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径，路径中不包含桶名。 例如，您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中，对象名为folder/test.txt。 **取值范围：** 长度大于0且不超过1024的字符串。 **默认取值：** 无 说明： 对象链接地址格式为：https://*桶名.域名/文件夹目录层级/对象名*。如果该对象存在于桶的根目录下，则链接地址将不需要有文件夹目录层级。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| crypto_cipher | OBSCipher | 必选       | **参数解释：** 调用 cipher_generator.new() 方法所生成的 OBSCipher，在初始化任务时设置必要的元数据。 **取值范围：** cipher_generator.new() ,cipher_generator为初始化时的cipher_generator参数。 示例：cipher = ctr_client.cipher_generator.new("")，ctr_client为加密客户端。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   
#### 上传加密段
上传加密段继承自普通 OBS Client 的上传段接口，详细参数可参考[分段上传-上传段(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1003.html)
**方法定义**
```
CryptoClient.initiateEncryptedMultipartUpload(bucketName, objectKey, partNumber, uploadId, crypto_cipher, *args, **kwargs)
```
**接口参数**
表5请求参数列表 
| **参数名称**      | **参数类型**  | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| bucketName    | str       | 必选       | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **默认取值：** 无 |
| objectKey     | str       | 必选       | **参数解释：** 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径，路径中不包含桶名。 例如，您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中，对象名为folder/test.txt。 **取值范围：** 长度大于0且不超过1024的字符串。 **默认取值：** 无 说明： 对象链接地址格式为：https://*桶名.域名/文件夹目录层级/对象名*。如果该对象存在于桶的根目录下，则链接地址将不需要有文件夹目录层级。                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| partNumber    | int       | 必选       | **参数解释：** 段号。 **取值范围：** \[1,10000\] **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| uploadId      | str       | 必选       | **参数解释：** 分段上传任务的ID。任务ID可以通过[初始化分段上传任务](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1002.html)生成。例如：000001648453845DBB78F2340DD460D8。 **约束限制：** 长度为32的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| crypto_cipher | OBSCipher | 必选       | **参数解释：** 调用 cipher_generator.new() 方法所生成的 OBSCipher **取值范围：** cipher_generator.new() ,cipher_generator为初始化时的cipher_generator参数。 示例：cipher = ctr_client.cipher_generator.new("")，ctr_client为加密客户端。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   
#### 相关链接
- 使用过程中返回的错误码含义、问题原因及处理措施可参考[OBS错误码](https://support.huaweicloud.com/api-obs/obs_04_0115.html#section1)。
 
