服务端加密是指 TOS 在收到您上传的数据时,在文件级别加密这些数据,再将加密的数据持久化存储;您下载文件时,TOS 自动将加密数据解密后返回给您。
使用场景
服务端加密适用于需要加密存储数据或者合规性要求的应用场景。通过服务端加密可以有效保证数据的安全,且访问加密对象会自动解密,在体验上与未加密对象完全一致。
加密方式
TOS 提供了多种服务端加密方式,您可以根据实际使用场景选用。
使用 TOS 托管密钥的服务端加密(SSE-TOS)
SSE-TOS 加密方式,即由对象存储管理您的密钥信息。SSE-TOS 采用了多因素强加密,确保使用唯一的密钥加密每个文件,同时支持采用 AES-256 或 SM4 算法来加密数据,并且会通过定期轮换的主密钥来对密钥本身进行加密。您可以使用以下方式对文件进行 SSE-TOS 加密。
使用对象存储控制台
- 您可以在上传文件时开启 SSE-TOS 服务端加密,具体操作,请参见上传文件。
- 为存储桶开启 SSE-TOS 服务端加密后,在该存储桶上传文件时,如果您没有指定文件的服务端加密方式,文件会默认继承存储桶的服务端加密方式。
使用 REST API
使用 API 上传服务端加密文件时,您需要在请求 Header 中提供 x-tos-server-side-encryption 参数。支持该参数的 API 如下:
说明
- 当使用分片上传 API 上传大对象时,您可以通过在 CreateMultipartUpload 请求中添加 x-tos-server-side-encryption 头域来指定对象的服务端加密方式。
- 当您复制一个现有对象时,无论源对象是否被加密,目标对象都不会被加密,除非您在请求中明确指定服务端加密方式。
当一个对象采用 SSE-TOS 加密存储时,以下 REST API 的响应头会返回 x-tos-server-side-encryption 头域:
注意
- 当使用 POST 操作上传对象时,请在表单字段中提供相同的信息,而不是提供该请求头部,详情请参见 PostObject。
- 如果对象使用 SSE-TOS 加密,就不应在 GET 和 HEAD 请求中携带 x-tos-server-side-encryption 加密头域,如果携带了该加密头域,会收到 HTTP 400 BadRequest 错误。
使用用户提供密钥的服务端加密(SSE-C)
SSE-C 加密即用户自定义密钥的服务端加密,加密密钥由您自己管理,您在上传对象时,TOS 使用提供的加密密钥对数据进行 AES-256 加密。使用 SSE-C 时,您必须使用以下请求头域提供加密密钥信息。
使用 REST API
当请求以下接口时,对于 PUT 和 POST 请求可以通过提供 x-tos-server-side-encryption-customer-* 头部来应用服务端加密,对于 GET 和 HEAD 请求使用 SSE-C 加密的对象时,需要提供 x-tos-server-side-encryption-customer-* 头部来解密指定对象。以下操作支持此头部:
当您复制一个对象时,您同时拥有一个源对象和一个目标对象:
- 如果要使用 SSE-C 加密目标对象,则必须使用上表中描述的三个头域提供加密信息。
- 如果源对象使用 SSE-C 加密,您必须使用以下头域提供加密密钥信息,以便 TOS 能够解密该对象进行复制。
注意
- TOS 不会存储您提供的加密密钥,只会存储添加了随机数据的加密密钥 HMAC 值,该值用于验证访问对象的请求。TOS 无法使用随机数据的 HMAC 值来推导出加密密钥的值或解密加密对象的内容。因此,如果您丢失了加密密钥,则无法再次获取到该对象。
- 当使用 POST 操作上传对象时,需在表单字段中提供相同的信息,而不是提供 x-tos-server-side-encryption-* 头部。详情请参见 PostObject。
- SSE-C 仅能通过 API 进行使用,不支持控制台操作。
使用火山引擎 KMS 的服务端加密(SSE-KMS)
TOS 使用 KMS 托管的用户主密钥生成唯一的数据密钥,并通过 AES-256 或 SM4 算法加密数据。通过信封加密技术,TOS 使用数据密钥的明文对用户数据进行加密,加密之后仅存储数据密钥的密文,数据密钥明文则会丢弃,保证数据的安全。
KMS 说明
KMS 是火山引擎上一站式的密钥管理和数据加密服务平台,提供简单易用的加密接口,帮助您轻松管理密钥、保护云上核心数据的安全。KMS 对密钥的所有操作都会进行访问控制及日志跟踪,提供所有密钥的使用记录,满足监督和合规性要求。您可以通过 KMS 控制台 自主创建密钥,也可以将外部密钥导入到 KMS。关于 KMS 的详细介绍,请参见 KMS 快速入门。 注意事项
- 首次使用 SSE-KMS 进行服务端加密,您需要开通 KMS 服务。开通 KMS 服务免费,使用 KMS 服务会收费。使用 SSE-KMS 进行服务端加密会产生 API 调用费用,创建 KMS 密钥会产生密钥托管费用,由 KMS 收取,更多信息,请参见 KMS 计费说明。
- 目前 SSE-KMS 仅支持使用从 KMS 创建的自定义密钥,不支持使用 TOS 服务托管的默认密钥。
- SSE-KMS 仅加密对象数据而不加密对象元数据。
- 使用 SSE-KMS 上传加密对象,您需要具备该密钥的 kms:GenerateDataKey 权限;若要下载 SSE-KMS 加密对象,您需要具备该密钥的 kms:Decrypt 权限。
- 使用 SSE-KMS 加密的对象不支持匿名用户访问。您必须开通 KMS 服务,具备访问主密钥的权限,才能使用有效签名访问 SSE-KMS 加密的对象。
使用对象存储控制台
- 您可以在上传文件时开启 SSE-KMS 服务端加密,具体操作,请参见上传文件。
- 为存储桶开启 SSE-KMS 服务端加密后,在该存储桶上传文件时,如果您没有指定文件的服务端加密方式,文件会默认继承存储桶的服务端加密方式。
使用 REST API
使用 REST API 请求创建 SSE-KMS 加密对象时,您需要提供 x-tos-server-side-encryption、x-tos-server-side-data-encryption 和 x-tos-server-side-encryption-kms-key-id 请求头。
以下 API 支持 SSE-KMS 加密头域:
说明
- 使用分片上传 API 上传大对象时,您可以在 CreateMultipartUpload 请求中添加 x-tos-server-side-encryption、x-tos-server-side-data-encryption 和 x-tos-server-side-encryption-kms-key-id 头域来指定对象的 SSE-KMS 加密信息。
- 复制对象时,不会复制源对象的服务端加密方式,您需要在 CopyObject 请求中明确指定服务端加密方式。
当一个对象采用 SSE-KMS 服务端加密存储时,以下 REST API 的响应头会返回 x-tos-server-side-encryption 和 x-tos-server-side-encryption-kms-key-id 头域:
注意
- 当使用 POST 操作上传对象时,请在表单字段中提供相同的信息,而不是提供该请求头部,详情请参见 PostObject。
- 如果对象使用 SSE-KMS 加密,就不应在 GET 和 HEAD 请求中携带 x-tos-server-side-encryption 加密头域,如果携带了该加密头域,将会收到 HTTP 400 BadRequest 错误。