客户端加密是指将文件(Object)发送到对象存储OSS之前在本地进行加密,本文介绍客户端加密的方式与流程。

免责声明

  • 使用客户端加密功能时,您需要对主密钥的完整性和正确性负责。因您维护不当导致主密钥用错或丢失,从而导致加密数据无法解密所引起的一切损失和后果均由您自行承担。
  • 在对加密数据进行复制或者迁移时,您需要对加密元信息的完整性和正确性负责。因您维护不当导致加密元信息出错或丢失,从而导致加密数据无法解密所引起的一切损失和后果均由您自行承担。

操作方式

客户端加密目前提供Java和Python两个语言的SDK:

背景信息

使用客户端加密时,会为每个Object生成一个随机密钥,用该随机密钥对Object的数据进行对称加密。主密钥用于对该随机的对称密钥进行加密,加密后的内容会当作Object的meta信息保存在服务端。解密时先用主密钥将加密后的随机密钥解密出来,再用解密出来的随机密钥解密Object的数据。主密钥只参与客户端本地计算,不会在网络上进行传输或保存在服务端,以保证主密钥的数据安全。
说明
  • 客户端加密当前只支持5 GB以下的文件,支持加密通用文本和字节流。
  • 调用客户端加密上传文件后,不允许再调用Python SDK的update_object_meta接口或CopyObject修改Object meta信息。
对于主密钥的使用,目前支持如下两种方式:

完整的示例代码请参见GitHub

使用KMS托管用户主密钥

当使用KMS托管用户主密钥用于客户端数据加密时,无需向OSS加密客户端提供任何加密密钥,只需要在上传对象时指定KMS用户主密钥ID(也就是CMK ID)。具体工作原理如下图所示。
  • 加密并上传Object
    1. 获取加密密钥。

      通过使用CMK ID,客户端首先向KMS发送一个请求,申请1个用于加密Object的数据密钥(Data Key)。作为响应,KMS会返回一个随机生成的数据明文密钥(Data Key)以及一个数据密文密钥(Encrypted Data Key)。

    2. 加密数据并上传至OSS。

      本地客户端接收到KMS返回的数据明文密钥以及数据密文密钥后,将使用数据明文密钥进行本地加密,并且将加密后的对象以及数据密文密钥上传至OSS。

  • 下载并解密Object
    1. 下载Object。

      客户端从OSS服务端下载加密的Object以及作为对象元数据存储的数据密文密钥。

    2. 解密Object。

      客户端将数据密文密钥以及CMK ID发送至KMS服务器。作为响应,KMS将使用指定的CMK解密,并且将数据明文密钥返回给本地加密客户端。

说明
  • 本地加密客户端为每一个上传的对象获取一个唯一的数据加密密钥。
  • 为了保证数据的安全性,建议CMK定期轮换或者更新。
  • 您需要维护CMK ID与Object之间的映射关系。

使用用户自主管理密钥

使用用户自主管理密钥时,需要您自主生成并保管加密密钥。当本地客户端加密Object时,由用户自主上传加密密钥(对称加密密钥或者非对称加密密钥)至本地加密客户端。其具体加密过程如下图所示。客户端加密2
  • 加密并上传Object
    1. 用户向本地加密客户端提供1个用户主密钥(对称密钥或者非对称密钥)。
    2. 本地加密客户端在本地生成一个一次性的对称密钥,即数据密钥(Data Key)。它将用于加密单个对象(针对每个对象,客户端都会随机生成1个数据密钥)。
    3. 客户端使用数据密钥加密对象,并使用用户提供的主密钥来加密数据密钥。
    4. 客户端将加密的数据密钥(Encrypted Data Key)作为对象元数据的一部分上传至OSS。
  • 下载并解密Object
    1. 客户端从OSS下载加密的对象以及元数据。
    2. 通过使用元数据中的材料,客户端将授权确定使用对应主密钥来解密数据密钥,之后使用解密后的数据密钥来解密对象。
注意
  • OSS本地加密客户端不会将用户主密钥以及未加密的数据发送至OSS。所以,请务必妥善保管加密密钥,如果密钥丢失,将无法解密数据。
  • 数据密钥由本地加密客户端随机生成。