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

是否要将 .NET 应用程序部署到Amazon通过几个简单点击即可? 尝试我们的新.NET CLI 工具为了简化部署体验!阅读我们的博客帖子然后提交反馈GitHub

有关更多信息,请参阅部署工具

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

Amazon S3 加密客户端迁移

本主题介绍了如何将应用程序从 Amazon 简单存储服务 (Amazon S3) 加密客户端的版本 1 (V1) 迁移到版本 2 (V2),并确保应用程序在整个迁移过程中的可用性。

使用 V2 客户端加密的对象无法使用 V1 客户端解密。为了简化迁移到新客户端而不必一次重新加密所有对象,我们提供了 “v1-Trocess” 客户端。这个客户可以解密V1 和 V2 加密的对象都是加密的对象,但加密仅采用 V1 兼容格式的对象。V2 客户端可以解密V1 和 V2 加密对象(当对 V1 对象启用时),但加密仅适用于 v2 兼容格式的对象。

迁移概述

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

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

    注意

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

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

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

将现有客户端更新为 V1 过渡客户端以阅读新格式

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

V1 过渡客户端使您的应用程序能够解密 V1 和 V2 加密的对象。这个客户是卓越亚马逊扩展 s.S3. 加密NuGet 程序包。对每个应用程序执行以下步骤以使用 v1 过渡客户端。

  1. 以新的依赖关系卓越亚马逊扩展 s.S3. 加密程序包。如果你的项目直接依赖于AWSSDK.S3或者awssdk.Key 管理服务软件包,您必须更新这些依赖项或者删除它们,以便它们的更新版本将与此新软件包一起拉入。

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

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

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

将 v1 过渡客户端迁移到 V2 客户端以编写新格式

V2 客户端是卓越亚马逊扩展 s.S3. 加密NuGet 程序包。它使您的应用程序能够同时解密 V1 和 V2 加密对象(如果配置为这样做),但只能以 V2 兼容格式加密对象。

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

  1. EncryptionMaterials 更改为 EncryptionMaterialsV2

    1. 使用 KMS 时:

      1. 提供 KMS 密钥 ID。

      2. 声明你正在使用的加密方法;也就是说,KmsType.KmsContext.

      3. 向 KMS 提供加密上下文以与此数据密钥关联。您可以发送空白字典(亚马逊加密上下文仍将被合并),但我们鼓励提供其他上下文。

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

      1. 提供AES或者RSA包含加密材料的实例。

      2. 声明要使用哪种加密算法;也就是说,SymmetricAlgorithmType.AesGcm或者AsymmetricAlgorithmType.RsaOaepSha1.

  2. 变更AmazonS3CryptoConfigurationAmazonS3CryptoConfigurationV2使用SecurityProfile设置为的属性SecurityProfile.V2AndLegacy.

  3. AmazonS3EncryptionClient 更改为 AmazonS3EncryptionClientV2。此客户端采用新转换的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可以是ObjectMetadata或者InstructionFile.

预迁移

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可以是ObjectMetadata或者InstructionFile.

预迁移

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 客户端进行加密或重新加密。此转换完成后,您可以通过在 V2 客户端中设置SecurityProfile财产到SecurityProfile.V2,如以下代码段所示。

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