通过使用客户提供的加密密钥的服务器端加密 (SSE-C) 保护数据
服务器端加密是为了保护静态数据。服务器端加密仅加密对象数据而不是对象元数据。使用客户提供的加密密钥的服务器端加密 (SSE-C) 允许您设置自己的加密密钥。使用您作为请求的一部分提供的加密密钥,Amazon S3 在其写入磁盘时管理加密,并在您访问对象时管理解密。因此,您不需要维护任何代码来执行数据加密和解密。您只需管理您提供的加密密钥。
在您上传对象时,Amazon S3 将使用您提供的加密密钥对您的数据应用 AES-256 加密并从内存中移除加密密钥。在检索对象时,必须提供相同的加密密钥作为您请求的一部分。Amazon S3 在将对象数据返回给您之前,会首先验证您提供的加密密钥是否匹配,然后再解密对象。
将服务器端加密与客户提供的加密密钥 (SSE-C) 结合使用不会产生新的费用。但是,配置和使用 SSE-C 的请求会产生标准的 Amazon S3 请求费用。有关定价的信息,请参阅 Amazon S3 定价
Amazon S3 不存储您提供的加密密钥,而是存储加密密钥添加了随机数据的 HMAC 值来验证未来的请求。无法使用添加了随机数据的 HMAC 值来推导出加密密钥的值或解密加密对象的内容。这意味着,如果您丢失加密密钥,则会失去该对象。
有关 SSE-C 的更多信息,请参阅以下主题。
SSE-C 概览
本部分提供 SSE-C 的概述:
-
您必须使用 HTTPS。
重要 在使用 SSE-C 时,Amazon S3 会拒绝通过 HTTP 提出的所有请求。出于安全原因,我们建议您考虑您错误地使用 HTTP 发送的任何密钥都将被外泄。您应丢弃该密钥,并根据需要轮换密钥。
-
响应中的 ETag 不是对象数据的 MD5。
-
您管理哪个加密密钥用于加密哪个对象的映射。Amazon S3 不存储加密密钥。您负责跟踪为哪个对象提供了哪个加密密钥。
-
如果您的存储桶启用了版本控制,则您使用此功能上传的每个对象版本可能都具有自己的加密密钥。您负责跟踪哪个加密密钥用于哪个对象版本。
-
因为您在客户端管理加密密钥,所以也要在客户端管理所有额外的保护措施,例如密钥轮换。
警告 如果您丢失加密密钥,则针对某个对象的没有其加密密钥的任何 GET 请求都会失败,并且您将失去该对象。
-
要求和限制 SSE-C
如果要求将使用客户提供密钥的服务器端加密 (SSE-C) 用于特定 Amazon S3 桶中的所有对象,则可以使用桶策略。
例如,如果请求不包括用于请求 SSE-C 的 x-amz-server-side-encryption-customer-algorithm 标头,以下桶策略将拒绝针对所有此类请求的上载对象(s3:PutObject)权限。
{ "Version": "2012-10-17", "Id": "PutObjectPolicy", "Statement": [ { "Sid": "RequireSSECObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "Null": { "s3:x-amz-server-side-encryption-customer-algorithm": "true" } } } ] }
要限制对特定 Amazon S3 桶中的所有对象进行服务器端加密,也可以使用策略。
例如,如果请求包含 s3:PutObject 标头 [该标头用于请求使用客户提供密钥的服务器端加密(SSE-C)],则下面的桶策略将拒绝所有人的上载对象(x-amz-server-side-encryption-customer-algorithm)权限。
{ "Version": "2012-10-17", "Id": "PutObjectPolicy", "Statement": [ { "Sid": "RestrictSSECObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "Null": { "s3:x-amz-server-side-encryption-customer-algorithm": "false" } } } ] }
预签名 URL 和 SSE-C
您可以生成可用于上传新对象、检索现有对象或对象元数据等操作的预签名 URL。预签名 URL 支持 SSE-C,如下所示:
-
在创建预签名 URL 时,您必须在签名计算中使用
x-amz-server-side-encryption-customer-algorithm指定算法。 -
在使用预签名 URL 上传新对象、检索现有对象或仅检索对象元数据时,您必须在您的客户端应用程序中提供所有加密标头。
注意 对于非 SSE-C 对象,您可以生成预签名 URL 并将其直接复制到浏览器中,(例如)以便访问数据。
但对于 SSE-C 对象并非如此,因为除了预签名 URL 外,还需要包含 SSE-C 对象特定的 HTTP 标头。因此,您只能以编程方式将预签名 URL 用于 SSE-C 对象。
指定使用客户提供的密钥的服务器端加密 (SSE-C)。
在使用 REST API 创建对象时,您可以使用客户提供的加密密钥 (SSE-C) 指定服务器端加密。使用 SSE-C 时,必须使用以下请求标头提供加密密钥信息。
| 名称 | 说明 |
|---|---|
x-amz-server-side-encryption-customer-algorithm
|
使用此标头来指定加密算法。标头值必须为“AES256”。 |
x-amz-server-side-encryption-customer-key
|
使用此标头来提供 256 位的 base64 编码的加密密钥以供 Amazon S3 用于加密或解密您的数据。 |
x-amz-server-side-encryption-customer-key-MD5
|
使用此标头根据 RFC 1321 |
您可以使用 Amazon 软件开发工具包包装库将这些标头添加到您的请求中。如果需要,您可以直接在应用程序中调用 Amazon S3 REST API。
您不能使用 Amazon S3 控制台上载对象并请求 SSE-C。也不能使用控制台来更新使用 SSE-C 存储的现有对象(例如,更改存储类别或添加元数据)。
支持 SSE-C 的 Amazon S3 REST API
以下 Amazon S3 API 支持使用客户提供的加密密钥进行服务器端加密 (SSE-C)。
-
GET 操作 — 在使用 GET API 检索对象(请参阅 GET Object)时,您可以指定请求标头。
-
HEAD 操作 — 要使用 HEAD API 检索对象元数据(请参阅 HEAD Object),可以指定这些请求标头。
-
PUT 操作 — 使用 PUT Object API 上传数据(请参阅 PUT Object)时,可以指定这些请求标头。
-
分段上传 — 在使用分段上传 API 上传大对象时,可以指定这些标头。您可以在以下请求中指定这些标头:启动请求(请参阅启动分段上传)和每个后续分段上传请求(请参阅上传分段或
对于每个分段上传请求,加密信息必须与您在启动分段上传请求中提供的信息相同。
-
POST 操作 — 使用 POST 操作上传对象(请参阅 POST Object)时,可在表单字段而不是请求标头中提供相同的信息。
-
Copy 操作 — 复制对象(请参阅 PUT Object - 复制)时,您同时具有源对象和目标对象:
-
如果您希望使用具有 Amazon 托管式密钥的服务器端加密对目标对象加密,则必须提供
x-amz-server-side-encryption请求标头。 -
如果您希望使用 SSE-C 对目标对象加密,则必须使用上表中描述的三个标头提供加密信息。
-
如果源对象是使用 SSE-C 加密的,则您必须使用以下标头提供加密密钥信息,以便 Amazon S3 可以解密对象以进行复制。
名称 说明 x-amz-copy-source-server-side-encryption-customer-algorithm包括此标头以指定 Amazon S3 用于解密源对象的算法。此值必须是
AES256。x-amz-copy-source-server-side-encryption-customer-key包括此标头以提供 base64 编码的加密密钥,供 Amazon S3 用于解密源对象。此加密密钥必须是您在创建源对象时为 Amazon S3 提供的加密密钥。否则,Amazon S3 无法解密对象。
x-amz-copy-source-server-side-encryption-customer-key-MD5包括此标头以根据 RFC 1321
提供加密密钥的 base64 编码的 128 位 MD5 摘要。
-
以下示例演示如何为对象请求使用客户提供的密钥的服务器端加密 (SSE-C)。这些示例执行以下操作。每个操作均演示了如何在请求中指定 SSE-C 相关标头:
-
放置对象 — 上传对象并请求使用客户提供的加密密钥的服务器端加密。
-
获取对象 — 下载上一步中上传的对象。在请求中,应提供上传对象时提供的同一加密信息。Amazon S3 需要此信息来解密对象,以便将对象返回给您。
-
获取对象元数据 — 检索对象的元数据。提供创建对象时使用的同一加密信息。
-
复制对象 — 复制之前上传对象的副本。因为源对象是使用 SSE-C 存储的,因此必须在复制请求中提供其加密信息。默认情况下,仅当您显式请求加密时,Amazon S3 才会为对象的副本加密。此示例指示 Amazon S3 存储对象的加密副本。
上一部分中的示例显示了如何在 PUT、GET、Head 和 Copy 操作中请求使用客户提供的密钥的服务器端加密 (SSE-C)。本节介绍支持 SSE-C 的其他 Amazon S3 API。