静态数据的 Azure 存储加密

在将数据保存到云时,Azure 存储会使用服务端加密 (SSE) 自动对数据加密。 Azure 存储加密可以保护数据,并帮助组织履行在安全性与合规性方面做出的承诺。

Azure 建议在大多数方案中使用服务端加密来保护数据。 但是,用于 Blob 存储和队列存储的 Azure 存储客户端库还为需要在客户端上加密数据的客户提供客户端加密。 有关详细信息,请参阅 Blob 和队列的客户端加密

关于 Azure 存储服务端加密

Azure 存储中的数据将使用 256 位 AES 加密法(可用的最强大块加密法之一)以透明方式进行加密和解密,并符合 FIPS 140-2 规范。 Azure 存储加密法类似于 Windows 上的 BitLocker 加密法。

已为所有存储帐户(包括资源管理器和经典存储帐户)启用 Azure 存储加密。 无法禁用 Azure 存储加密。 由于数据默认受到保护,因此无需修改代码或应用程序,即可利用 Azure 存储加密。

不管存储帐户的性能层级(标准或高级)、访问层级(热访问层或冷访问层)或部署模型(Azure 资源管理器或经典)如何,都会将存储帐户中的数据加密。 所有新的和现有的块 Blob、追加 Blob 和页 Blob 都已加密,包括存档层中的 Blob。 所有 Azure 存储冗余选项都支持加密,当启用了异地复制时,会对主要区域和次要区域中的所有数据进行加密。 所有 Azure 存储资源(包括 Blob、磁盘、文件、队列和表)都会加密。 所有对象元数据也会加密。

Azure 存储加密不会产生额外的费用。

有关 Azure 存储加密的底层加密模块的详细信息,请参见加密 API:下一代

有关 Azure 托管磁盘的加密和密钥管理的信息,请参阅 Azure 托管磁盘的服务器端加密

关于加密密钥管理

默认情况下,新存储帐户中的数据使用 Microsoft 管理的密钥进行加密。 你可以继续依赖于使用 Microsoft 管理的密钥来加密数据,也可以使用你自己的密钥来管理加密。 如果你选择使用自己的密钥来管理加密,则有两种选择。 可以使用任何一种类型的密钥管理,或者使用这两种类型:

  • 可以指定客户管理的密钥,用于对 Blob 存储和 Azure 文件存储中的数据进行加密和解密。1,2 客户管理的密钥必须存储在 Azure Key Vault 中。 若要详细了解客户管理的密钥,请参阅使用客户管理的密钥进行 Azure 存储加密
  • 可以在 Blob 存储操作中指定客户提供的密钥。 对 Blob 存储发出读取或写入请求的客户端可以在请求中包含加密密钥,以便精细控制 Blob 数据的加密和解密方式。 有关客户提供的密钥的详细信息,请参阅在对 Blob 存储的请求中提供加密密钥

默认情况下,使用作用域为整个存储帐户的密钥对存储帐户进行加密。 通过使用加密范围,可以使用范围限定为容器或单个 blob 的密钥来管理加密。 可以使用加密范围在驻留在同一存储帐户中但属于不同客户的数据之间创建安全边界。 加密范围可以使用 Microsoft 管理的密钥或客户管理的密钥。 有关加密范围的详细信息,请参阅 Blob 存储的加密范围

下表比较了 Azure 存储加密的密钥管理选项。

密钥管理参数 Microsoft 管理的密钥 客户管理的密钥 客户提供的密钥
加密/解密操作 Azure Azure Azure
支持的 Azure 存储服务 全部 Blob 存储、Azure 文件存储1,2 Blob 存储
密钥存储 Microsoft 密钥存储 Azure Key Vault 客户自己的密钥存储
密钥轮换责任 Microsoft 客户 客户
密钥控制 Microsoft 客户 客户
密钥范围 帐户(默认)、容器或 Blob 帐户(默认)、容器或 Blob 空值

1 若要了解如何创建支持在队列存储中使用客户管理的密钥的帐户,请参阅为队列创建支持客户管理的密钥的帐户
1 若要了解如何创建支持在表存储中使用客户管理的密钥的帐户,请参阅为表创建支持客户管理的密钥的帐户

注意

Microsoft 管理的密钥会根据合规性要求进行适当的轮换。 如果有特定密钥轮换要求,Microsoft 建议你改为使用客户管理的密钥,以便自行管理和审核轮换。

通过基础结构加密对数据进行双重加密

如果客户要求较高级别的数据安全保证,则客户还可以在 Azure 存储基础结构级别启用 256 位 AES 加密。 启用基础结构加密后,将对存储帐户中的数据进行两次加密,分别在服务级别和基础架构级别使用两种不同的加密算法和两个不同的密钥。 Azure 存储数据的双重加密可以在其中一种加密算法或密钥可能泄露的情况下提供保护。 在此方案中,附加的一层加密会继续保护你的数据。

服务级别加密支持将 Microsoft 管理的密钥或客户管理的密钥与 Azure Key Vault 配合使用。 基础结构级别的加密依赖于 Microsoft 管理的密钥并始终使用单独的密钥。

若要详细了解如何创建启用基础结构加密的存储帐户,请参阅创建启用了基础结构加密的存储帐户以便对数据进行双重加密

Blob 和队列的客户端加密

适用于 .NET、Java 和 Python 的 Azure Blob 存储客户端库支持在上传到 Azure 存储之前加密客户端应用程序中的数据,并在下载到客户端时解密数据。 适用于 .NET 和 Python 的队列存储客户端库还支持客户端加密。

注意

请考虑使用 Azure 存储提供的服务端加密功能来保护数据,而不是使用客户端加密。

Blob 存储和队列存储客户端库使用 AES 来加密用户数据。 客户端库中提供了两个版本的客户端加密:

  • 版本 2 结合使用伽罗瓦/计数器模式 (GCM) 模式与 AES。 Blob 存储和队列存储 SDK 支持使用 v2 进行客户端加密。
  • 版本 1 结合使用加密块链接 (CBC) 模式与 AES。 Blob 存储、队列存储和表存储 SDK 支持使用 v1 进行客户端加密。

警告

由于客户端库的 CBC 模式实现中存在安全漏洞,因此不再建议使用客户端加密 v1。 有关此安全漏洞的详细信息,请参阅 Azure 存储更新 SDK 中的客户端加密以解决安全漏洞。 如果当前正在使用 v1,建议更新应用程序来使用客户端加密 v2,并迁移数据。

Azure 表存储 SDK 仅支持客户端加密 v1。 不建议将客户端加密与表存储结合使用。

下表显示了哪些客户端库支持哪些版本的客户端加密,并提供迁移到客户端加密 v2 的准则。

客户端库 支持的客户端加密版本 建议的迁移 其他指南
适用于 .NET(版本 12.13.0 及更高版本)、Java(版本 12.18.0 及更高版本)以及 Python(版本 12.13.0 及更高版本)的 Blob 存储客户端库 2.0

1.0(仅为保持后向兼容性)
更新代码以使用客户端加密 v2。

下载任何加密数据以进行解密,然后使用客户端加密 v2 重新加密。
Blob 的客户端加密
适用于 .NET(版本 12.12.0 及更低版本)、Java(版本 12.17.0 及更低版本)以及 Python(版本 12.12.0 及更低版本)的 Blob 存储客户端库 1.0(不建议使用) 更新应用程序以使用支持客户端加密 v2 的 Blob 存储 SDK 版本。 有关详细信息,请参阅客户端加密的 SDK 支持矩阵

更新代码以使用客户端加密 v2。

下载任何加密数据以进行解密,然后使用客户端加密 v2 重新加密。
Blob 的客户端加密
适用于 .NET(版本 12.11.0 及更高版本)以及 Python(版本 12.4 及更高版本)的队列存储客户端库 2.0

1.0(仅为保持后向兼容性)
更新代码以使用客户端加密 v2。 队列的客户端加密
适用于 .NET(版本 12.10.0 及更低版本)以及 Python(版本 12.3.0 及更低版本)的队列存储客户端库 1.0(不建议使用) 更新应用程序以使用支持客户端加密 v2 的队列存储 SDK 版本。 请参阅客户端加密的 SDK 支持矩阵

更新代码以使用客户端加密 v2。
队列的客户端加密
适用于 .NET、Java 和 Python 的表存储客户端库 1.0(不建议使用) 不可用。 空值

后续步骤