本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
OSS客户端加密是在数据上传至OSS之前,由用户在本地对数据进行加密处理,确保只有密钥持有者才能解密数据,增强数据在传输和存储过程中的安全性。
免责声明
使用客户端加密功能时,您需要对主密钥的完整性和正确性负责。因您维护不当导致主密钥用错或丢失,从而导致加密数据无法解密所引起的一切损失和后果均由您自行承担。
在对加密数据进行复制或者迁移时,您需要对加密元数据的完整性和正确性负责。因您维护不当导致加密元数据出错或丢失,从而导致加密数据无法解密所引起的一切损失和后果均由您自行承担。
使用场景
高度敏感数据:对于包含极高敏感度信息的数据,如个人身份信息(PII)、金融交易记录、医疗健康数据等,用户可能希望在数据离开本地环境之前就对其进行加密处理,确保即使数据在传输过程中被截获,原始数据仍能得到有效保护。
合规要求:某些行业和法规(例如HIPAA、GDPR等)要求对存储在第三方平台上的数据进行严格的加密控制,客户端加密能够满足这些合规性要求,因为密钥由用户自己管理,不通过网络传递,也不由云服务商直接掌握。
更强的自主控制权:企业或者开发者可能希望对加密过程有完全的控制权,包括选择加密算法、管理和轮换密钥。通过客户端加密,可以实现这一目标,确保只有合法授权的用户才能解密和访问数据。
跨区域数据迁移安全性:在将数据从一个地区迁移到另一个地区的过程中,使用客户端加密可以在数据迁移前后保持数据始终处于加密状态,增强了数据在公网传输的安全性。
注意事项
本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS访问域名、数据中心、开放端口。
本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证。
本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化。
背景信息
使用客户端加密时,会为每个Object生成一个随机数据加密密钥,用该随机数据加密密钥明文对Object的数据进行对称加密。主密钥用于生成随机的数据加密密钥,加密后的内容会当作Object的meta信息保存在服务端。解密时先用主密钥将加密后的随机密钥解密出来,再用解密出来的随机数据加密密钥明文解密Object的数据。主密钥只参与客户端本地计算,不会在网络上进行传输或保存在服务端,以保证主密钥的数据安全。
客户端加密支持分片上传超过5 GB的文件。在使用分片方式上传文件时,需要指定上传文件的总大小和分片大小, 除了最后一个分片外,每个分片的大小要一致,且分片大小目前必须是16的整数倍。
调用客户端加密上传文件后,加密元数据会被保护,无法通过CopyObject修改Object meta信息。
加密方式
对于主密钥的使用,目前支持如下两种方式:
使用KMS托管用户主密钥
当使用KMS托管用户主密钥用于客户端数据加密时,需要将KMS用户主密钥ID(即CMK ID)传递给SDK。
使用用户自主管理的主密钥(RSA)
主密钥信息由用户提供,需要用户将主密钥的公钥、私钥信息当做参数传递给SDK。
使用以上两种加密方式能够有效地避免数据泄漏,保护客户端数据安全。即使数据泄漏,其他人也无法解密得到原始数据。
加密元数据
参数 | 描述 | 是否必需 |
x-oss-meta-client-side-encryption-key | 加密后的密钥。 经过主密钥加密后再经过base64编码的字符串。 | 是 |
x-oss-meta-client-side-encryption-start | 随机产生的用于加密数据的初始值 。经过主密钥加密后再经过base64编码的字符串。 | 是 |
x-oss-meta-client-side-encryption-cek-alg | 数据的加密算法。 | 是 |
x-oss-meta-client-side-encryption-wrap-alg | 数据密钥的加密算法。 | 是 |
x-oss-meta-client-side-encryption-matdesc | 主密钥的描述信息。JSON格式。 警告 强烈建议为每个主密钥都配置描述信息,并保存好主密钥和描述信息之间的对应关系。否则不支持更换主密钥进行加密。 | 否 |
x-oss-meta-client-side-encryption-unencrypted-content-length | 加密前的数据长度。如未指定content-length则不生成该参数。 | 否 |
x-oss-meta-client-side-encryption-unencrypted-content-md5 | 加密前数据的MD5。如未指定MD5,则不生成该参数。 | 否 |
x-oss-meta-client-side-encryption-data-size | 若加密Multipart文件需要在init_multipart时传入整个大文件的总大小。 | 是(分片上传) |
x-oss-meta-client-side-encryption-part-size | 若加密Multipart文件需要在init_multipart时传入分片大小。 说明 目前分片大小必须是16的整数倍。 | 是(分片上传) |
示例代码
使用主密钥RSA普通上传和下载Object
使用主密钥RSA分片上传Object
解密使用主密钥为不同的RSA加密的Object
使用主密钥KMS普通上传和下载Object
相关文档
关于配置服务器端加密的API接口说明,请参见SetBucketEncryption。
关于获取服务器端加密配置的API接口说明,请参见GetBucketEncryption。