
# SSE-C加密（用户提供密钥）
SSE-C是使用客户密钥来进行服务器端加密的方式，适用于需要用户自行保存和管理密钥的场景。
#### 费用说明
使用SSE-C加密不会产生额外费用，但配置对象使用SSE-C加密会产生请求费用。
#### 注意事项
- 使用SSE-C时，**必须** 严格使用**HTTPS协议**发送请求，以保证您的密钥安全性，OBS会拒绝非HTTPS的SSE-C相关请求。
- OBS不会存储您的密钥，如果您丢失了密钥，可能会失去使用该密钥加密的对象。
- 加密后对象的ETag值不是对象明文的MD5值，而是对象密文的MD5值。
- 您需要自行跟踪密钥与对象的对应关系。例如对象开启了多版本控制，可能每个对象版本都有自己对应的加密密钥，您需要跟踪好密钥与对象版本的对应关系。
- 建议您在客户端对密钥进行必要的保护措施，例如密钥轮换，以保护您的数据安全。
 
#### 约束限制
- SSE-C支持**AES256**一种加密算法。
- 仅支持为**对象**配置SSE-C加密方式。
- 如果您上传对象的方式为多段上传，需要在**初始化上传段任务** 、**上传段** 、**拷贝段** 的过程中携带密钥信息，且同一个任务内的多段操作，携带的密钥必须保持一致。**合并段无需携带密钥**，合并后的对象是一个使用SSE-C方式加密的对象。
 
#### SSE-C原理介绍
图1SSE-C加密流程   
![](https://support.huaweicloud.com/usermanual-obs/figure/zh-cn_image_0000002399856085.png "点击放大")
加密对象时，如[图1]所示，加密流程如下：
1. 用户调用API接口时，将密钥发送给OBS。
2. OBS使用密钥加密对象，并在使用后将密钥从内存中删除。
3. OBS存储对象密文。
图2SSE-C解密流程   
![](https://support.huaweicloud.com/usermanual-obs/figure/zh-cn_image_0000002366376184.png "点击放大")
解密对象时，如[图2]所示，解密流程如下：
1. 下载对象时，用户调用API接口将密钥发送给OBS。
2. OBS使用密钥解密对象，得到对象明文，并在使用后将密钥从内存中删除。
 
#### 相关权限配置
- 设置桶的加密方式为SSE-C，您必须是桶拥有者或拥有设置桶加密方式的权限。建议使用IAM或桶策略进行授权，如果使用IAM则需授予**obs:bucket:** **PutEncryptionConfiguration** 、**obs:bucket:** **GetEncryptionConfiguration** 权限，如果使用桶策略则需授予**PutEncryptionConfiguration** 、**GetEncryptionConfiguration** 权限。相关授权方式介绍可参见[OBS权限控制概述](https://support.huaweicloud.com/perms-cfg-obs/obs_40_0001.html)，配置方式详见[使用IAM自定义策略](https://support.huaweicloud.com/usermanual-obs/obs_03_0121.html)、[自定义创建桶策略](https://support.huaweicloud.com/usermanual-obs/obs_03_0123.html)。
- 上传对象时使用SSE-C方式加密对象，需要拥有对象上传权限。使用IAM则需授予**obs:object:PutObject** ，使用桶策略则需授予**PutObject**。
- 下载使用SSE-C方式加密的对象，需要拥有对象下载权限。使用IAM则需授予**obs:object:GetObject** ，使用桶策略则需授予**GetObject。**
- 您可以通过设置桶策略，对桶的访问请求执行服务端加密限制。例如，要求使用PUT上传方式向名为ExampleBucket的桶中上传对象时，对象必须选择SSE-C加密方式，可使用以下桶策略达成，该桶策略拒绝不包含头域**x-obs-server-side-encryption-customer-algorithm** :"AES256"的上传操作：
  ```
  {
      "Statement": [
          {
              "Sid": "DenyUnEncryptedObjectUploads",
              "Effect": "Deny",
              "Principal": "*",
              "Action": "PutObject",
              "Resource": "ExampleBucket/*",
              "Condition": {
                  "StringNotEquals": {
                      "x-obs-server-side-encryption-customer-algorithm": "AES256"
                  }
              }
          }
      ]
  }
  ```
  
 
#### 为对象配置SSE-C加密
OBS支持通过API、SDK方式对上传对象SSE-C进行加密，不支持通过[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)、OBS Browser+、obsutil、obsfs方式配置。
#### 使用API
详见[服务端加密相关接口概览](https://support.huaweicloud.com/usermanual-obs/obs_03_0094.html#ZH-CN_TOPIC_0000002384025230)。
#### 使用SDK
| [Java](https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_1901.html) | [Python](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1303.html) | [C](https://support.huaweicloud.com/sdk-c-devg-obs/obs_20_1500.html) | [Go](https://support.huaweicloud.com/sdk-go-devg-obs/obs_33_0603.html) | [BrowserJS](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_1500.html) | [.NET](https://support.huaweicloud.com/sdk-dotnet-devg-obs/obs_25_1500.html) | [Android](https://support.huaweicloud.com/sdk-android-devg-obs/obs_26_1500.html) | [iOS](https://support.huaweicloud.com/sdk-ios-devg-obs/obs_27_1500.html) | [PHP](https://support.huaweicloud.com/sdk-php-devg-obs/obs_28_1500.html) | [Node.js](https://support.huaweicloud.com/sdk-nodejs-devg-obs/obs_29_1500.html) |
|---|---|---|---|---|---|---|---|---|---|
   
#### 相关操作
您可以使用**复制同名对象** 的方式，将桶中已有的未加密对象更改为加密状态，或者修改对象的加密方式。了解详情请参见[修改已有对象的加密状态](https://support.huaweicloud.com/usermanual-obs/obs_03_0090.html#ZH-CN_TOPIC_0000002384025226__zh-cn_topic_0000002360455272_section4842949112614)。
