Amazon S3 加密客户端迁移 - 适用于 .NET 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 加密客户端迁移

本主题介绍如何从的版本1(V1)迁移应用程序 Amazon Simple Storage Service (Amazon S3)加密客户端到版本2(V2),并确保整个迁移过程中的应用程序可用性。

用V2客户端加密的对象不能用V1客户端解密。为了便于迁移到新客户端而不必同时重新加密所有对象,提供了“V1过渡”客户端。这个客户可以 解密 V1和V2加密对象,但 加密 仅V1兼容格式的对象。V2客户端可以 解密 V1-和V2-加密对象(当为V1对象启用时),但 加密 仅V2兼容格式的对象。

迁移概述

此迁移分三个阶段进行。此处介绍这些阶段,稍后详细描述。每个阶段必须完成 全部 在下一阶段开始之前使用共享对象的客户端。

  1. 将现有客户端更新为V1过渡客户端以读取新格式。 首先,更新您的应用程序以依赖V1转换客户端而非V1客户端。V1转换客户端使现有代码能够解密新V2客户端写入的对象和V1兼容格式写入的对象。

    注意

    V1过渡客户端仅用于迁移目的。移动到V1转换客户端后,继续升级到V2客户端。

  2. 将V1转换客户端迁移到V2客户端,以写入新格式。 接下来,使用V2客户端替换应用程序中的所有V1过渡客户端,并将安全配置文件设置为 V2AndLegacy。在V2客户端上设置此安全配置文件使这些客户端能够解密以V1兼容格式加密的对象。

  3. 更新V2客户端不再读取V1格式。 最后,将所有客户端迁移到V2并且所有对象都已加密或重新加密V2兼容格式后,将V2安全配置文件设置为 V2 而不是 V2AndLegacy。这可以防止对V1兼容格式的对象进行解密。

将现有客户端更新为V1转换客户端以读取新格式

V2加密客户端使用旧版本的客户端不支持的加密算法。迁移的第一步是更新您的V1解密客户端,以便他们可以读取新格式。

V1转换客户端使应用程序能够对V1和V2加密的对象进行解密。此客户是 亚马逊.分机.S3.加密 NuGet包。对每个应用程序执行以下步骤,以使用V1转换客户端。

  1. 重新依赖 亚马逊.分机.S3.加密 包裹。如果您的项目直接依赖于 AWSSDK.S3AWSSDK.密钥管理服务 软件包,您必须更新这些依赖项或删除它们,以便其更新版本将与此新软件包一起拉入。

  2. 更改适当的 using 语句来自 Amazon.S3.EncryptionAmazon.Extensions.S3.Encryption,如下所示:

    // using Amazon.S3.Encryption; using Amazon.Extensions.S3.Encryption;
  3. 重新构建和重新部署应用程序。

V1过渡客户端与V1客户端完全兼容API,因此无需更改其他代码。

将V1转换客户端迁移到V2客户端以写入新格式

V2客户端是 亚马逊.分机.S3.加密 NuGet包。它使应用程序能够对V1和V2加密对象(如果配置为这样做)进行解密,但只能以V2兼容格式加密对象。

更新现有客户端以读取新的加密格式后,您可以继续安全地将应用程序更新为V2加密和解密客户端。在每个应用程序上执行以下步骤,以使用V2客户端:

  1. 改变 EncryptionMaterialsEncryptionMaterialsV2.

    1. 使用KMS时:

      1. 提供KMS密钥ID。

      2. 声明您正在使用的加密方法;即 KmsType.KmsContext.

      3. 向KMS提供加密上下文以与此数据密钥关联。您可以发送空字典(Amazon加密上下文仍会合并在中),但建议提供其他上下文。

    2. 使用用户提供的密钥包络方法(对称或非对称加密)时:

      1. 提供 AESRSA 包含加密材料的实例。

      2. 声明使用哪种加密算法;即 SymmetricAlgorithmType.AesGcmAsymmetricAlgorithmType.RsaOaepSha1.

  2. 改变 AmazonS3CryptoConfigurationAmazonS3CryptoConfigurationV2SecurityProfile 属性设置为 SecurityProfile.V2AndLegacy.

  3. 改变 AmazonS3EncryptionClientAmazonS3EncryptionClientV2。此客户将新转换的 AmazonS3CryptoConfigurationV2EncryptionMaterialsV2 对象。

示例:KMS到KMS+上下文

迁移前

using System.Security.Cryptography; using Amazon.S3.Encryption; var encryptionMaterial = new EncryptionMaterials("1234abcd-12ab-34cd-56ef-1234567890ab"); var configuration = new AmazonS3CryptoConfiguration() { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);

迁移后

using System.Security.Cryptography; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV2("1234abcd-12ab-34cd-56ef-1234567890ab", KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);

示例:对称算法(AES-CBC至AES-GCM密钥包)

StorageMode 可以是 ObjectMetadataInstructionFile.

迁移前

using System.Security.Cryptography; using Amazon.S3.Encryption; var symmetricAlgorithm = Aes.Create(); var encryptionMaterial = new EncryptionMaterials(symmetricAlgorithm); var configuration = new AmazonS3CryptoConfiguration() { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);

迁移后

using System.Security.Cryptography; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; var symmetricAlgorithm = Aes.Create(); var encryptionMaterial = new EncryptionMaterialsV2(symmetricAlgorithm, SymmetricAlgorithmType.AesGcm); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
注意

使用AES-GCM解密时,请先将整个对象读到末尾,然后再开始使用解密的数据。这是为了验证对象是否已修改,因为它已加密。

示例:不对称算法(RSA至RSA-OAEP-SHA1密钥包合)

StorageMode 可以是 ObjectMetadataInstructionFile.

迁移前

using System.Security.Cryptography; using Amazon.S3.Encryption; var asymmetricAlgorithm = RSA.Create(); var encryptionMaterial = new EncryptionMaterials(asymmetricAlgorithm); var configuration = new AmazonS3CryptoConfiguration() { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);

迁移后

using System.Security.Cryptography; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; var asymmetricAlgorithm = RSA.Create(); var encryptionMaterial = new EncryptionMaterialsV2(asymmetricAlgorithm, AsymmetricAlgorithmType.RsaOaepSha1); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);

将V2客户端更新为不再读取V1格式

最终,所有对象都将使用V2客户端加密或重新加密。完成转换后,您可以通过设置 SecurityProfile 属性到 SecurityProfile.V2,如以下片段所示。

//var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2);