Amazon S3 的服务器端加密(Server-Side Encryption, SSE) 是 AWS 提供的一项核心安全机制,用于自动加密对象在持久化存储时的数据(即"静态数据加密")。启用 SSE 后,S3 会在将对象写入磁盘前对其进行加密,并在授权用户或应用程序请求访问时自动解密,整个过程对用户透明。
Amazon S3 支持三种主要的 SSE 加密方式:
- SSE-S3:Amazon S3 全权管理加密密钥,管理所有的加密和解密过程
- SSE-KMS:AWS Key Management Service (KMS) 管理加密密钥,可以设置使用权限,审计密钥使用情况
- SSE-C:客户自己提供并管理加密密钥,每次请求必须提供密钥(通过 HTTPS 头部),S3 仅用于加密/解密操作
S3 的服务器端加密(SSE)过程:
- 上传时(加密):当上传的数据到达 AWS S3 服务器后,S3 会在数据写入磁盘存储之前使用相应的密钥对其进行加密,数据以加密形式存储在 S3 的物理存储设备上
- 下载时(解密): S3 从存储中读取加密数据后,会使用相应的密钥在服务器端即时解密,然后将解密后的明文数据通过 HTTPS/TLS 传输回客户端
结论: S3 保证的是数据在 AWS 存储介质上是加密的,但它在传输给授权用户时会自动解密。
DEK (Data Encryption Key) :DEK 是实际用于加密和解密对象数据(即上传的文件内容)的密钥
上传 (加密) 过程:
- AWS KMS 随机生成一个一次性的对称 DEK
- S3 使用这个 DEK 快速地对上传的对象明文数据进行加密,生成密文
- S3 再使用 KMS Key (CMK) 对这个 DEK 本身进行加密,生成一个加密的 DEK
- S3 将对象密文和加密的 DEK 一起存储在 S3 上
下载 (解密) 过程:
- 用户请求下载对象
- S3 提取加密的 DEK,并发送给 KMS
- KMS 使用 KMS Key (CMK) 对加密的 DEK 进行解密,将明文 DEK 返回给 S3
- S3 使用这个明文 DEK 快速解密对象密文,并将明文数据通过 HTTPS 发送给用户