AWS KMS 鑰匙圈 - AWS Encryption SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS KMS 鑰匙圈

AWS KMS 金鑰圈使用對稱加密AWS KMS keys來產生、加密和解密資料金鑰。 AWS Key Management Service (AWS KMS) 保護您的 KMS 金鑰,並在 FIPS 界限內執行密碼編譯作業。我們建議您盡可能使用 AWS KMS 金鑰圈或具有類似安全性屬性的鑰匙圈。

您可以在 2.3 版開始的金鑰 AWS KMS 圈或主金鑰提供者中使用 AWS KMS 多區域金鑰。 和 3.0 版 AWS Encryption SDK 本的 x。 AWS 加密 CLI 的 x。如需使用新的多區域感知符號的詳細資訊和範例,請參閱。使用多地區 AWS KMS keys如需有關多區域金鑰的詳細資訊,請參閱AWS Key Management Service 開發人員指南中的使用多區域金鑰

注意

版本 4. AWS Encryption SDK 適用於 .NET 和版本 3 的 xx 適用於 JAVA 的 AWS Encryption SDK 是唯一支援使用非對稱 R AWS KMS keys SA 之 AWS KMS 金鑰環的程式設計語言實作。

如果您嘗試在任何其他語言實作的加密金鑰環中包含非對稱 KMS 金鑰,則加密呼叫會失敗。如果您將其包含在解密金鑰環中,則會忽略該金鑰環。

KMS 鑰匙圈中的所有提及都是 AWS Encryption SDK 指鑰匙圈。 AWS KMS

AWS KMS 鑰匙圈可以包含兩種類型的環繞鍵:

  • 產生器金鑰:產生純文字資料金鑰並加密。加密資料的金鑰環必須有一個產生器金鑰。

  • 其他金鑰:加密產生器金鑰所產生的純文字資料金鑰。 AWS KMS 鑰匙圈可以有零個或多個其他金鑰。

加密時,您使用的 AWS KMS 金鑰環必須有產生器金鑰。解密時,生成器密鑰是可選的,並忽略生成器密鑰和其他密鑰之間的區別。

如果加 AWS KMS 密金鑰圈只有一個 AWS KMS 金鑰,則會使用該金鑰來產生和加密資料金鑰。

與所有鑰匙圈一樣, AWS KMS 鑰匙圈可以單獨使用,也可以與其他相同或不同類型的鑰匙圈一起使用。

AWS KMS 金鑰圈所需的權限

AWS Encryption SDK 不需要一個 AWS 帳戶 ,它不依賴於任何 AWS 服務. 但是,若要使用 AWS KMS 金鑰圈,您需要在 AWS 帳戶 金鑰圈 AWS KMS keys 中具有以下最低權限。

如需有關權限的詳細資訊 AWS KMS keys,請參閱AWS Key Management Service 開發人員指南中的驗證和存取控制

在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

一個 AWS KMS 鑰匙圈可以包括一個或多 AWS KMS keys個。若要在金 AWS KMS 鑰環 AWS KMS key 中指定,請使用支援的 AWS KMS 金鑰識別碼。您可以用來識別金鑰圈 AWS KMS key 中的金鑰識別碼會隨作業和語言實作而有所不同。有關的密鑰標識符的詳細信息 AWS KMS key,請參閱AWS Key Management Service 開發人員指南中的密鑰標識符

最佳做法是使用適合您工作的最具體的金鑰識別碼。

  • 在的加密金鑰圈中 適用於 C 的 AWS Encryption SDK,您可以使用金鑰 ARN 或別名 ARN 來識別 KMS 金鑰。在所有其他語言實作中,您可以使用金鑰 ID金鑰 ARN別名別名 ARN 來加密資料。

  • 在解密 keyring 中,您必須使用金鑰 ARN 來識別 AWS KMS keys。此要求適用於 AWS Encryption SDK的所有語言實作。如需詳細資訊,請參閱 選擇包裝鍵

  • 在用於加密和解密的 keyring 中,您必須使用金鑰 ARN 來識別 AWS KMS keys。此要求適用於 AWS Encryption SDK的所有語言實作。

如果您在加密金鑰圈中為 KMS 金鑰指定別名或別名 ARN,則加密作業會將目前與別名關聯的金鑰 ARN 儲存在加密資料金鑰的中繼資料中。它不會儲存別名。變更別名不會影響用於解密加密資料金鑰的 KMS 金鑰。

建立用於加密的 AWS KMS 金鑰圈

您可以在相同或不同的 AWS 帳戶 和 AWS 區域中使用單個 AWS KMS key 或多 AWS KMS keys 個配置每個 AWS KMS 鑰匙圈。 AWS KMS keys 必須是對稱加密金鑰 (對稱加密金鑰)。您也可以使用對稱加密多區域 KMS 金鑰與所有鑰匙圈一樣,您可以在多個鑰匙圈中使用一個或多個 AWS KMS 鑰匙圈。

當您建立金 AWS KMS 鑰環來加密資料時,您必須指定產生器金鑰, AWS KMS key 這是用來產生純文字資料金鑰並加密的產生器金鑰。資料金鑰在數學上與 KMS 金鑰無關。然後,如果您選擇,您可以指定其他加密 AWS KMS keys 相同的純文字資料金鑰。

若要解密受此金鑰圈保護的加密訊息,您使用的金鑰圈必須至少包含金鑰圈中 AWS KMS keys 定義的其中一個,或者否。 AWS KMS keys(沒有的 AWS KMS 鑰匙圈稱 AWS KMS keys 為AWS KMS 探索鑰匙圈。)

在除了以外的 AWS Encryption SDK 語言實作中 適用於 C 的 AWS Encryption SDK,加密金鑰環或多重金鑰環中的所有包裝金鑰都必須能夠加密資料金鑰。如果有任何包裝金鑰無法加密,則加密方法會失敗。因此,呼叫者必須擁有金鑰環中所有金鑰的必要權限。如果您單獨使用探索金鑰環加密資料,或在多重金鑰環中加密資料,則加密作業會失敗。例外情況是 適用於 C 的 AWS Encryption SDK,加密作業會忽略標準探索金鑰環,但如果您單獨或在多重金鑰環中指定多區域探索金鑰環,則會失敗。

以下範例會建立包含一個產生器金鑰和一個其他金鑰的金鑰 AWS KMS 環。這些範例使用金鑰 ARN 來識別 KMS 金鑰。這是用於加密的 AWS KMS 金鑰圈的最佳作法,也是用於解密的 AWS KMS 金鑰圈要求。如需詳細資訊,請參閱 在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

C

若要識別 AWS KMS key 中的加密金鑰環 適用於 C 的 AWS Encryption SDK,請指定金鑰 ARN 或別名 ARN。在解密 Keyring 中,您必須使用金鑰 ARN。如需詳細資訊,請參閱 在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

如需完整範例,請參閱 string.cpp

const char * generator_key = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_encrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key,{additional_key});
C# / .NET

若要在 .NET 中建立含有一或多個 AWS KMS 金鑰的金鑰 AWS KMS 圈, AWS Encryption SDK 請建立多重金鑰圈。.NET 包括一個僅 AWS Encryption SDK 用於密鑰的多鑰匙圈。 AWS KMS

當您在中 AWS KMS key 為 .NET 指定加密金鑰環時,您可以使用任何有效的金鑰識別碼:金鑰識別碼、金鑰 ARN別名或名 ARN。 AWS Encryption SDK 如需識別 AWS KMS 金鑰圈 AWS KMS keys 中的說明,請參閱在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

下列範例使用版本 4。 用 AWS Encryption SDK 於 .NET 的 x 來建立含有產生器金 AWS KMS 鑰和其他金鑰的金鑰圈。如需完整範例,請參閱 AwsKmsMultiKeyringExample.cs。

// Instantiate the AWS Encryption SDK and material provider var mpl = new MaterialProviders(new MaterialProvidersConfig()); var esdk = new ESDK(new AwsEncryptionSdkConfig()); string generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<string> additionalKey = new List<string> { "alias/exampleAlias" }; // Instantiate the keyring input object var kmsEncryptKeyringInput = new CreateAwsKmsMultiKeyringInput { Generator = generatorKey, KmsKeyIds = additionalKey }; var kmsEncryptKeyring = materialProviders.CreateAwsKmsMultiKeyring(kmsEncryptKeyringInput);
JavaScript Browser

當您在中指定加 AWS KMS key 密金鑰環時 適用於 JavaScript 的 AWS Encryption SDK,您可以使用任何有效的金鑰識別碼:金鑰識別碼、金鑰 ARN別名或名 ARN。如需識別 AWS KMS 金鑰圈 AWS KMS keys 中的說明,請參閱在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

如需完整範例,請參閱中的儲存庫中的 kms_simple.ts。 適用於 JavaScript 的 AWS Encryption SDK GitHub

const clientProvider = getClient(KMS, { credentials }) const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey] })
JavaScript Node.js

當您在中指定加 AWS KMS key 密金鑰環時 適用於 JavaScript 的 AWS Encryption SDK,您可以使用任何有效的金鑰識別碼:金鑰識別碼、金鑰 ARN別名或名 ARN。如需識別 AWS KMS 金鑰圈 AWS KMS keys 中的說明,請參閱在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

如需完整範例,請參閱中的儲存庫中的 kms_simple.ts。 適用於 JavaScript 的 AWS Encryption SDK GitHub

const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey] })
Java

若要在中建立含有一或多個 AWS KMS 金鑰的鑰匙 AWS KMS 圈 適用於 JAVA 的 AWS Encryption SDK,請建立多重鑰匙圈。 適用於 JAVA 的 AWS Encryption SDK 包括一個僅用 AWS KMS 於鑰匙的多鑰匙圈。

當您在中指定加 AWS KMS key 密金鑰環時 適用於 JAVA 的 AWS Encryption SDK,您可以使用任何有效的金鑰識別碼:金鑰識別碼、金鑰 ARN別名或名 ARN。如需識別 AWS KMS 金鑰圈 AWS KMS keys 中的說明,請參閱在 AWS KMS 鑰匙圈 AWS KMS keys 中識別

如需完整範例,請參閱中的 適用於 JAVA 的 AWS Encryption SDK 存放庫中 GitHub的 BasicEncryptionKeyringExample.java。

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<String> additionalKey = Collections.singletonList("alias/exampleAlias"); // Create the AWS KMS keyring final CreateAwsKmsMultiKeyringInput keyringInput = CreateAwsKmsMultiKeyringInput.builder() .generator(generatorKey) .kmsKeyIds(additionalKey) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMultiKeyring(keyringInput);

建立用於解密的 AWS KMS 金鑰圈

您也可以在解密傳回的加密郵件時指定 AWS KMS 金鑰圈。 AWS Encryption SDK 如果解密金鑰圈指定 AWS KMS keys, AWS Encryption SDK 將僅使用這些包裝金鑰來解密加密訊息中的加密資料金鑰。(您也可以使用未指定任何的AWS KMS 探索金鑰環) AWS KMS keys。

解密時,會在 AWS KMS 金鑰圈中 AWS Encryption SDK 搜尋可以解密其中一個加密資料金鑰的金鑰。 AWS KMS key 具體而言,加密郵件中的每個加密資料金鑰 AWS Encryption SDK 會使用下列模式。

  • AWS Encryption SDK 會從加密郵件的中繼資料中取 AWS KMS key 得加密資料金鑰的金鑰 ARN。

  • 會在解密金鑰環中 AWS Encryption SDK 搜尋 AWS KMS key 具有相符金鑰 ARN 的。

  • 如果在金鑰圈中發現 AWS KMS key 具有相符金鑰 ARN,則 AWS Encryption SDK 會要求使用 KMS 金鑰 AWS KMS 來解密加密的資料金鑰。

  • 否則會跳到下一個加密的資料金鑰 (如果有)。

AWS Encryption SDK 永遠不會嘗試解密加密的資料金鑰,除非該加密資料金鑰 AWS KMS key 的金鑰 ARN 包含在解密金鑰圈中。如果解密金鑰圈不包含任何加密任何資料金鑰的 ARN,解密呼叫 AWS KMS keys 就會 AWS Encryption SDK 失敗,而不會呼叫。 AWS KMS

1.7 版本開始。 x,解密加密的資料金鑰時,一 AWS Encryption SDK 律會將的金鑰 ARN 傳遞 AWS KMS key 至「 AWS KMS 解密」作業的KeyId參數。在解密 AWS KMS key 時識別是 AWS KMS 最佳做法,可確保您使用要使用的包裝金鑰來解密加密的資料金鑰。

當解密金 AWS KMS 鑰圈中至少有一個可以解密加密訊息 AWS KMS key 中的一個加密資料金鑰時,含金鑰圈的解密呼叫會成功。同時,發起人必須具有該 AWS KMS key上的 kms:Decrypt 許可。此行為可讓您加密不同帳戶 AWS 區域 和帳戶 AWS KMS keys 中多個下的資料,但提供針對特定帳戶、地區、使用者、群組或角色量身打造的更有限的解密金鑰環。

當您在解密金鑰環 AWS KMS key 中指定時,必須使用其金鑰 ARN。否則,將 AWS KMS key 無法辨識。如需尋找金鑰 ARN 的說明,請參閱AWS Key Management Service 開發人員指南中的尋找金鑰 ID 和 ARN

注意

如果您重複使用加密 keyring 進行解密,請確定 keyring 中的 AWS KMS keys 金鑰可依其 ARN 識別。

例如,下列金 AWS KMS 鑰圈只包含加密金鑰圈中使用的其他金鑰。但是,此範例並非依其別名參照其他金鑰alias/exampleAlias,而是根據解密呼叫的要求使用其他金鑰的 ARN。

您可以使用此 keyring 來解密已使用產生器金鑰和額外金鑰加密的訊息,前提是您具有使用額外金鑰來解密資料的許可。

C
const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(additional_key);
C# / .NET

由於此解密金鑰環只包含一個 AWS KMS 金鑰,因此範例會將CreateAwsKmsKeyring()方法與其CreateAwsKmsKeyringInput物件的實體搭配使用。要使用一個 AWS KMS 鑰 AWS KMS 匙創建鑰匙圈,您可以使用單鍵或多鍵鑰匙圈。如需詳細資訊,請參閱 AWS Encryption SDK為 .NET 加密中的資料。下列範例使用版本 4。 AWS Encryption SDK 用於 .NET 的 x 來建立用於解密的 AWS KMS 金鑰環。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); string additionalKey = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; // Instantiate a KMS keyring for one AWS KMS key. var kmsDecryptKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = additionalKey }; var kmsDecryptKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringBrowser({ clientProvider, keyIds: [additionalKey] })
JavaScript Node.js
const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringNode({ keyIds: [additionalKey] })
Java

由於此解密金鑰環只包含一個 AWS KMS 金鑰,因此範例會將CreateAwsKmsKeyring()方法與其CreateAwsKmsKeyringInput物件的實體搭配使用。要使用一個 AWS KMS 鑰 AWS KMS 匙創建鑰匙圈,您可以使用單鍵或多鍵鑰匙圈。

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String additionalKey = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; // Create a AwsKmsKeyring CreateAwsKmsKeyringInput kmsDecryptKeyringInput = CreateAwsKmsKeyringInput.builder() .generator(additionalKey) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);

您還可以使用指定用於解密的生成器密鑰的密鑰 AWS KMS 環,例如以下內容。解密時, AWS Encryption SDK 會忽略產生器金鑰與其他金鑰之間的區別。它可以使用任何指定的 AWS KMS keys 來解密加密的資料金鑰。只有當呼叫者有權使用它 AWS KMS key 來解密資料時,呼叫才 AWS KMS 會成功。

C
struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key, {additional_key, other_key});
C# / .NET

下列範例使用版本 4。 AWS Encryption SDK 用於 .NET 的 x

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); string generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Instantiate a KMS keyring for one AWS KMS key. var kmsDecryptKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = generatorKey }; var kmsDecryptKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey, otherKey] })
JavaScript Node.js
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey, otherKey] })
Java
// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Create a AwsKmsKeyring CreateAwsKmsKeyringInput kmsDecryptKeyringInput = CreateAwsKmsKeyringInput.builder() .generator(generatorKey) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);

與使用所有指定項目的加密金鑰環不同 AWS KMS keys,您可以使用包含 AWS KMS keys 與加密訊息無關且 AWS KMS keys 呼叫者沒有使用權限的解密金鑰圈來解密加密郵件。如果對 AWS KMS 的解密呼叫失敗,例如當發起人沒有必要的許可時, AWS Encryption SDK 會直接跳到下一個加密的資料金鑰。

使用 AWS KMS 探索鑰匙圈

解密時,最佳做法是指定 AWS Encryption SDK 可以使用的包裝金鑰。若要遵循此最佳作法,請使用 AWS KMS 解密金鑰圈,將 AWS KMS 包裝金鑰限制為您指定的金鑰。不過,您也可以建立AWS KMS 探索金鑰圈,也就是不會指定任何 AWS KMS 環繞金鑰的金鑰圈。

AWS Encryption SDK 提供標準 AWS KMS 探索金鑰圈和 AWS KMS 多區域金鑰的探索鑰匙圈。如需將多區域金鑰搭配使用的資訊 AWS Encryption SDK,請參閱使用多地區 AWS KMS keys

因為它不會指定任何包裝金鑰,因此探索金鑰環無法加密資料。如果您單獨使用探索金鑰環加密資料,或在多重金鑰環中加密資料,則加密作業會失敗。例外情況是 適用於 C 的 AWS Encryption SDK,加密作業會忽略標準探索金鑰環,但如果您單獨或在多重金鑰環中指定多區域探索金鑰環,則會失敗。

解密時,探索金鑰圈允許 AWS Encryption SDK 要求使用加密的資料金鑰 AWS KMS 來解密任何加密的 AWS KMS key 資料金鑰,無論誰擁有或具有存取權。 AWS KMS key只有當呼叫kms:Decrypt者具有. AWS KMS key

重要

如果您在解密多重金鑰環中包含 AWS KMS 探索金鑰圈,探索金鑰圈會覆寫多重金鑰圈中其他金鑰環指定的所有 KMS 金鑰限制。多重金鑰環的行為與其限制性最小的鑰匙圈一樣。 AWS KMS 探索金鑰圈在單獨使用或多重金鑰環中使用時,對加密沒有影響。

為了方便起見, AWS Encryption SDK 提供 AWS KMS 探索鑰匙圈。不過,基於下列原因,建議您在可能時使用較具限制的 keyring。

  • 真實性 — AWS KMS 探索金鑰圈可以使用 AWS KMS key 用來加密加密訊息中的資料金鑰的任何金鑰,只要呼叫者有權使用該金鑰 AWS KMS key 來解密。這可能不是發起人想要使用的 AWS KMS key 。例如,其中一個加密的資料金鑰可能以較不安全的方式加密, AWS KMS key 因此任何人都可以使用。

  • 延遲和效能 — AWS KMS 探索金鑰圈的速度可能會比其他金鑰環慢,因為會 AWS Encryption SDK 嘗試解密所有加密的資料金鑰,包括 AWS KMS keys 在其他 AWS 帳戶 和區域中加密的資料金鑰,而且 AWS KMS keys 呼叫者沒有用於解密的權限。

如果您使用探索金鑰圈,建議您使用探索篩選器來限制可用於指定 AWS 帳戶 和磁碟分割中的 KMS 金鑰。1.7 版支援探索篩選器。 x 及更新版本的 AWS Encryption SDK. 如需尋找帳戶 ID 和分割區的協助,請參閱中的您的 AWS 帳戶 識別碼ARN 格式AWS 一般參考

下列程式碼會使用 AWS KMS 探索篩選器來實體化探索金鑰圈,以限制 AWS Encryption SDK 可用於aws磁碟分割中的 KMS 金鑰,以及 111122223333 範例帳戶。

在使用此代碼之前,請將示例 AWS 帳戶 和分區值替換為您的 AWS 帳戶 和分區的有效值。如果您的 KMS 金鑰位於中國區域,請使用aws-cn分割區值。如果您的 KMS 金鑰位於中 AWS GovCloud (US) Regions,請使用aws-us-gov分割區值。對於所有其他項目 AWS 區域,請使用aws分割區值。

C

如需完整範例,請參閱:kms_discovery.cpp

std::shared_ptr<KmsKeyring::> discovery_filter( KmsKeyring::DiscoveryFilter::Builder("aws") .AddAccount("111122223333") .Build()); struct aws_cryptosdk_keyring *kms_discovery_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .BuildDiscovery(discovery_filter));
C# / .NET

下列範例使用版本 4。 AWS Encryption SDK 用於 .NET 的 x

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // In a discovery keyring, you specify an AWS KMS client and a discovery filter, // but not a AWS KMS key var kmsDiscoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), DiscoveryFilter = new DiscoveryFilter() { AccountIds = account, Partition = "aws" } }; var kmsDiscoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(kmsDiscoveryKeyringInput);
JavaScript Browser

在中 JavaScript,您必須明確指定探索屬性。

const clientProvider = getClient(KMS, { credentials }) const discovery = true const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })
JavaScript Node.js

在中 JavaScript,您必須明確指定探索屬性。

const discovery = true const keyring = new KmsKeyringNode({ discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
Java
// Create discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);

使用 AWS KMS 區域探索金鑰圈

AWS KMS 區域探索金鑰圈是不會指定 KMS 金鑰 ARN 的金鑰圈。相反地,它允許僅使用 KMS 金鑰 AWS Encryption SDK 進行解密,尤其是 AWS 區域。

使用 AWS KMS 區域探索金鑰圈進行解密時,會將 AWS KMS key 在指定的中加 AWS Encryption SDK 密的任何加密資料金鑰解密。 AWS 區域若要成功,呼叫者必須kms:Decrypt擁有至少一個加密資料金鑰 AWS 區域 的指定 AWS KMS keys 中的權限。

與其他探索金鑰環一樣,區域探索金鑰圈對加密沒有影響。它僅在解密加密郵件時才起作用。如果您在用於加密和解密的多重金鑰環中使用區域探索金鑰圈,則只有在解密時才有效。如果您單獨或在多重金鑰環中使用多區域探索金鑰圈來加密資料,則加密作業會失敗。

重要

如果您在解密多重金鑰圈中包含 AWS KMS 區域探索金鑰圈,則區域探索金鑰圈會覆寫多重金鑰圈中其他金鑰圈所指定的所有 KMS 金鑰限制。多重金鑰環的行為與其限制性最小的鑰匙圈一樣。 AWS KMS 探索金鑰圈在單獨使用或多重金鑰環中使用時,對加密沒有影響。

適用於 C 的 AWS Encryption SDK 嘗試僅使用指定區域中的 KMS 金鑰進行解密時的區域探索金鑰圈。當您在 適用於 JavaScript 的 AWS Encryption SDK 和 AWS Encryption SDK .NET 中使用探索金鑰圈時,您可以在用 AWS KMS 戶端上設定 [區域]。這些 AWS Encryption SDK 實作不會依區域篩選 KMS 金鑰,但 AWS KMS 會失敗指定區域以外的 KMS 金鑰的解密要求。

如果您使用探索金鑰圈,建議您使用探索篩選器,將用於解密的 KMS 金鑰限制為指定 AWS 帳戶 和分割區中的 KMS 金鑰。1.7 版支援探索篩選器。 x 及更新版本的 AWS Encryption SDK.

例如,下列程式碼會使用探索篩選器建立 AWS KMS 區域探索金鑰圈。此金鑰圈限制在美國西部 (奧勒岡) 區域 (美國西部 -2) 帳戶 111122223333 中的 KMS 金鑰。 AWS Encryption SDK

C

若要檢視此 keyring 和 create_kms_client 方法的工作實例,請參閱 kms_discovery.cpp

std::shared_ptr<KmsKeyring::DiscoveryFilter> discovery_filter( KmsKeyring::DiscoveryFilter::Builder("aws") .AddAccount("111122223333") .Build()); struct aws_cryptosdk_keyring *kms_regional_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .WithKmsClient(create_kms_client(Aws::Region::US_WEST_2)).BuildDiscovery(discovery_filter));
C# / .NET

.NET 沒有專用的 AWS Encryption SDK 區域探索金鑰圈。但是,您可以使用多種技術來限制解密到特定區域時使用的 KMS 金鑰。

限制探索金鑰圈中區域的最有效方法是使用多區域感知探索金鑰圈,即使您只使用單一區域金鑰加密資料也是如此。當它遇到單一區域金鑰時,多區域感知金鑰圈不會使用任何多區域功能。

CreateAwsKmsMrkDiscoveryKeyring()方法傳回的金鑰環會在呼叫 AWS KMS之前,依區域篩選 KMS 金鑰。 AWS KMS 只有當加密的資料金鑰透過CreateAwsKmsMrkDiscoveryKeyringInput物件中的Region參數所指定的區域中的 KMS 金鑰加密時,才會傳送解密要求。

下列範例使用版本 4。 AWS Encryption SDK 用於 .NET 的 x

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // Create the discovery filter var filter = DiscoveryFilter = new DiscoveryFilter { AccountIds = account, Partition = "aws" }; var regionalDiscoveryKeyringInput = new CreateAwsKmsMrkDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(RegionEndpoint.USWest2), Region = RegionEndpoint.USWest2, DiscoveryFilter = filter }; var kmsRegionalDiscoveryKeyring = materialProviders.CreateAwsKmsMrkDiscoveryKeyring(regionalDiscoveryKeyringInput);

您也可以在 AWS KMS 用戶端執行個體 (AmazonKeyManagementServiceClient) 中指定區域,將 KMS 金鑰限制為特 AWS 區域 定金鑰。不過,與使用多區域感知探索金鑰環相比,此組態效率較低且成本可能更高。而不是在呼叫之前按區域篩選 KMS 金鑰 AWS KMS,而是 AWS Encryption SDK 針 AWS KMS 對每個加密的資料金鑰進行 .NET 呼叫 (直到解密一個金鑰為止),並依賴 AWS KMS 將其使用的 KMS 金鑰限制在指定區域。

下列範例使用版本 4。 AWS Encryption SDK 用於 .NET 的 x

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // Create the discovery filter, // but not a AWS KMS key var createRegionalDiscoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(RegionEndpoint.USWest2), DiscoveryFilter = new DiscoveryFilter() { AccountIds = account, Partition = "aws" } }; var kmsRegionalDiscoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(createRegionalDiscoveryKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
JavaScript Node.js

若要在工作實例中檢視此 keyring 以及 limitRegions 和函數,請參閱 kms_regional_discovery.ts

const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .regions("us-west-2") .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);

適用於 JavaScript 的 AWS Encryption SDK 也會匯出 Node.js 和瀏覽器的excludeRegions函式。此功能會建立省略 AWS KMS keys 特定 AWS KMS 區域的區域探索金鑰環。下列範例會建立一個 AWS KMS 區域探索金鑰圈,該金鑰圈可 AWS KMS keys 在帳戶 111122223333 中使用,但美國東部 (us-east-1) AWS 區域 除外。

適用於 C 的 AWS Encryption SDK 沒有類似的方法,但是您可以建立自訂來實作一個方法。ClientSupplier

此範例顯示 Node.js 的程式碼。

const discovery = true const clientProvider = excludeRegions(['us-east-1'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })