数据加密

对象存储OSS提供服务器端加密和客户端加密,并支持基于SSL/TLS的HTTPS加密传输,有效防止数据在云端的潜在安全风险。

服务器端加密

OSS支持在服务器端对上传的数据进行加密(Server-Side Encryption)。上传数据时,OSS对收到的用户数据进行加密,然后再将得到的加密数据持久化保存下来;下载数据时,OSS自动对保存的加密数据进行解密并把原始数据返回给用户,并在返回的HTTP请求Header中,声明该数据进行了服务器端加密。

OSS通过服务器端加密机制,提供静态数据保护。适合于对于文件存储有高安全性或者合规性要求的应用场景。例如,深度学习样本文件的存储、在线协作类文档数据的存储。针对不同的应用场景,OSS有以下两种服务器端加密方式:

  • 使用KMS托管密钥进行加解密(SSE-KMS)

    上传文件时,可以使用默认KMS(Key Management Service)托管的CMK(Customer Master Key)或者指定的CMK ID进行加解密操作。这种场景适合于大量的数据加解密。数据无需通过网络发送到KMS服务端进行加解密,是一种低成本的加解密方式。

    KMS是阿里云提供的一款安全、易用的管理类服务。用户无需花费大量成本来保护密钥的保密性、完整性和可用性。借助密钥管理服务,用户可以安全、便捷的使用密钥,专注于开发加解密功能场景。用户可以通过KMS控制台中查看和管理KMS密钥。

    除了采用AES-256加密算法外,KMS负责保管用户主密钥CMK(对数据密钥进行加密的密钥),以及生成数据加密的密钥,通过信封加密机制,进一步防止未经授权的数据访问。CMK可通过使用OSS默认托管的KMS密钥的方式或者通过BYOK的方式生成,其中使用的BYOK材料可以由阿里云提供,也可以由用户自主提供。

    SSE-KMS服务器端加密的逻辑示意图如下。

    image
  • 使用OSS完全托管加密(SSE-OSS)

    基于OSS完全托管的加密方式,是Object的一种属性。OSS服务器端加密使用行业标准的强加密算法AES-256(即256位高级加密标准)加密每个对象,并为每个对象使用不同的密钥进行加密。作为额外的保护,使用主密钥对加密密钥本身进行加密。该方式适合于批量数据的加解密。

    该加密方式下,数据加密密钥的生成和管理由OSS负责。您可以将Bucket默认的服务器端加密方式设置为AES-256,也可以在上传Object或修改Object的元数据时,在请求中携带X-OSS-server-side-encryption并指定其值为AES256,即可实现该Object的服务器端加密存储。

更多信息请参见OSS开发指南中的服务器端加密

客户端加密

客户端加密是指将文件(Object)发送到对象存储OSS之前在本地进行加密。使用客户端加密功能时,您需要对主密钥的完整性和正确性负责。在对加密数据进行复制或者迁移时,您需要对加密元数据的完整性和正确性负责。

使用客户端加密时,会为每个Object生成一个随机数据加密密钥,用该随机数据加密密钥明文对Object的数据进行对称加密。主密钥用于生成随机的数据加密密钥,加密后的内容会当作Object的元数据保存在服务端。解密时先用主密钥将加密后的随机密钥解密出来,再用解密出来的随机数据加密密钥明文解密Object的数据。主密钥只参与客户端本地计算,不会在网络上进行传输或保存在服务端,以保证主密钥的数据安全。

对于主密钥的使用,目前支持以下两种方式:

  • 使用KMS托管用户主密钥

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

    image
  • 使用用户自主管理密钥

    使用用户自主管理密钥时,需要您自主生成并保管加密密钥。当本地客户端加密Object时,由用户自主上传加密密钥(对称加密密钥或者非对称加密密钥)至本地加密客户端。其具体加密过程如下图所示。

    image

更多信息请参见OSS开发指南中的客户端加密

基于SSL/TLS的HTTPS加密传输

OSS支持通过HTTP或HTTPS的方式访问。您也可以在Bucket Policy中设置仅允许通过HTTPS(TLS)来访问OSS资源,实现更加安全的数据传输。安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。详情请参见通过Bucket Policy授权用户访问指定资源