本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon S3 加密客户端迁移
本主题介绍如何将应用程序从 Amazon 简单存储服务 (Amazon S3) 加密客户端的版本 1 (V1) 迁移到版本 2 (V2),并在整个迁移过程中确保应用程序的可用性。
使用 V2 客户端加密的对象无法使用 V1 客户端解密。为了简化迁移到新客户端而不必一次重新加密所有对象,我们提供了 “V1-Transition” 客户端。这个客户可以解密V1 和 V2 加密的对象,但是加密对象只能采用 V1 兼容的格式。V2 客户端可以解密V1 和 V2 加密的对象(当为 V1 对象启用时),但是加密对象只能采用 V2 兼容的格式。
迁移概述
此迁移分三个阶段进行。这里将介绍这些阶段,稍后将详细介绍这些阶段。每个阶段都必须完成所有在下一阶段开始之前使用共享对象的客户端。
-
将现有客户端更新为 V1 过渡客户端以读取新格式。首先,更新您的应用程序,使其依赖于 V1 过渡客户端,而不是 V1 客户端。V1-Transition 客户端使您的现有代码能够解密新 V2 客户端写入的对象和以 V1 兼容格式编写的对象。
注意 V1 过渡客户端仅用于迁移目的。移至 V1 过渡客户端后,继续升级到 V2 客户端。
-
将 V1 过渡客户端迁移到 V2 客户端以编写新格式。接下来,将应用程序中的所有 V1 过渡客户端替换为 V2 客户端,并将安全配置文件设置为
V2AndLegacy
. 在 V2 客户端上设置此安全配置文件可使这些客户端解密以 V1 兼容格式加密的对象。 -
更新 V2 客户端以不再读取 V1 格式。最后,在所有客户机都迁移到 V2 并且所有对象都以 V2 兼容的格式加密或重新加密后,将 V2 安全配置文件设置为
V2
INSTEDV2AndLegacy
. 这样可以防止解密与 V1 兼容的格式的对象。
将现有客户端更新为 V1 过渡客户端以读取新格式
V2 加密客户端使用旧版本的客户端不支持的加密算法。迁移的第一步是更新 V1 解密客户端,以便它们可以读取新格式。
V1 过渡客户端使您的应用程序能够解密 V1 和 V2 加密的对象。此客户机是卓越亚马逊扩展 S3. 加密
-
换个新的依赖关系卓越亚马逊扩展 S3. 加密
程序包。如果你的项目直接依赖于AWSSDK.S3要么AWSSDK.KeyManagementServicepackages,则必须更新这些依赖项或删除它们,以便将它们的更新版本与这个新软件包一起提取。 -
更改适当的
using
声明来自Amazon.S3.Encryption
到Amazon.Extensions.S3.Encryption
,如下所示:// using Amazon.S3.Encryption; using Amazon.Extensions.S3.Encryption;
-
重建并重新部署您的应用程序。
V1 过渡客户端与 V1 客户端完全兼容 API,因此无需进行其他代码更改。
将 v1 过渡客户端迁移到 V2 客户端以编写新格式
V2 客户端是卓越亚马逊扩展 S3. 加密
更新现有客户端以读取新的加密格式后,您可以继续安全地将应用程序更新为 V2 加密和解密客户端。要使用 V2 客户端,请在每个应用程序上执行以下步骤:
-
将
EncryptionMaterials
更改为EncryptionMaterialsV2
。-
使用 KMS 时:
-
提供 KMS 密钥 ID。
-
声明您正在使用的加密方法;即
KmsType.KmsContext
. -
向 KMS 提供加密上下文以与此数据密钥关联。您可以发送空字典(仍将合并到 Amazon 加密上下文),但建议您提供其他上下文。
-
-
使用用户提供的密钥包装方法(对称或非对称加密)时:
-
提供
AES
或者一个RSA
包含加密材料的实例。 -
声明要使用哪种加密算法;即
SymmetricAlgorithmType.AesGcm
要么AsymmetricAlgorithmType.RsaOaepSha1
.
-
-
-
变更
AmazonS3CryptoConfiguration
到AmazonS3CryptoConfigurationV2
用SecurityProfile
属性设置为SecurityProfile.V2AndLegacy
. -
将
AmazonS3EncryptionClient
更改为AmazonS3EncryptionClientV2
。此客户使用新转换的AmazonS3CryptoConfigurationV2
和EncryptionMaterialsV2
前面步骤中的对象。
例如: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 客户机中禁用 V1 兼容性,方法是将SecurityProfile
属性到SecurityProfile.V2
,如下面的代码段所示。
//var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2);