AWS KMS 鍵環 - AWS Encryption SDK

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

AWS KMS 鍵環

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

您可以在 2.3.x 版 AWS Encryption SDK 和 3.0.x 版的 AWS Encryption 開始的 AWS KMS 金鑰環或主金鑰提供者中使用 AWS KMS 多區域金鑰。 CLI如需使用新 multi-Region-aware符號的詳細資訊和範例,請參閱 使用多區域 AWS KMS keys。如需多區域金鑰的相關資訊,請參閱 AWS Key Management Service 開發人員指南 中的使用多區域金鑰

注意

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

如果您嘗試在任何其他語言實作的加密金鑰中包含非對稱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 金鑰環加密,您需要 公里:GenerateDataKey 產生器金鑰的許可。您需要 AWS KMS 鍵環中所有其他金鑰的 kms:Encrypt 許可。

  • 若要使用 AWS KMS 鍵環解密,您需要 AWS KMS 鍵環中至少一個金鑰的 kms:Decrypt 許可。

  • 若要使用由 AWS KMS 金鑰環組成的多金鑰環進行加密,您需要 公里:GenerateDataKey 產生器金鑰在產生器金鑰環中的許可。您需要 kms:Encrypt 許可,才能使用所有其他金鑰環中的所有其他 AWS KMS 金鑰。

如需 許可的詳細資訊 AWS KMS keys,請參閱 AWS Key Management Service 開發人員指南 中的身分驗證和存取控制

在鍵環 AWS KMS keys 中 AWS KMS 識別

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來加密資料。

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

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

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

建立加密的 AWS KMS 金鑰環

您可以在相同 AWS KMS key 或不同 AWS 帳戶 和 AWS KMS keys 中,使用單一或多個 來設定每個 AWS KMS 鍵環 AWS 區域。 AWS KMS keys 必須是對稱加密金鑰 (SYMMETRIC_DEFAULT)。您也可以使用對稱加密多區域KMS金鑰 。如同所有鍵環,您可以在多 AWS KMS 鍵環 中使用一或多個鍵環。 多重 keyring

當您建立 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 金鑰環。這些範例使用金鑰ARNs來識別KMS金鑰。這是用於加密的 AWS KMS 金鑰環最佳實務,以及用於解密的 AWS KMS 金鑰環需求。如需詳細資訊,請參閱 在鍵環 AWS KMS keys 中 AWS KMS 識別

C

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

如需完整範例,請參閱 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

若要在 for 中建立具有一或多個 AWS KMS 金鑰 AWS Encryption SDK 的 AWS KMS 鍵環NET,請建立多鍵環。 AWS Encryption SDK 適用於 的 。NET 包含 金鑰專用的多金鑰。 AWS KMS

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

下列範例使用 的 4.x 版 AWS Encryption SDK for 。NET 建立具有產生器金鑰和其他金鑰的 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,您可以使用任何有效的金鑰識別符:金鑰 ID 金鑰 ARN別名名稱 別名 ARN。如需識別 AWS KMS 金鑰環 AWS KMS keys 中的 的說明,請參閱 在鍵環 AWS KMS keys 中 AWS KMS 識別

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數目。如需詳細資訊,請參閱限制加密的資料金鑰

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

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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,您可以使用任何有效的金鑰識別符:金鑰 ID 金鑰 ARN別名名稱 別名 ARN。如需識別 AWS KMS 金鑰環 AWS KMS keys 中的 的說明,請參閱 在鍵環 AWS KMS keys 中 AWS KMS 識別

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數目。如需詳細資訊,請參閱限制加密的資料金鑰

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

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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,您可以使用任何有效的金鑰識別符:金鑰 ID 金鑰 ARN別名名稱 別名 ARN。如需識別 AWS KMS 金鑰環 AWS KMS keys 中的 的說明,請參閱 在鍵環 AWS KMS keys 中 AWS KMS 識別

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

// 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);
Python

若要在 中建立具有一或多個 AWS KMS 金鑰的 AWS KMS 鍵環 適用於 Python 的 AWS Encryption SDK,請建立多重鍵環。 適用於 Python 的 AWS Encryption SDK 包含僅適用於金鑰的多重 AWS KMS 金鑰。如需範例,請參閱 中 適用於 Python 的 AWS Encryption SDK 儲存庫中的 aws_kms_multi_keyring_example.py GitHub。

當您 AWS KMS key 在 中指定加密金鑰環的 時 適用於 Python 的 AWS Encryption SDK,您可以使用任何有效的金鑰識別符:金鑰 ID 金鑰 ARN別名名稱 別名 ARN。如需識別 AWS KMS 金鑰環 AWS KMS keys 中的 的說明,請參閱 在鍵環 AWS KMS keys 中 AWS KMS 識別

下列範例會使用預設承諾政策 、 來實例化 AWS Encryption SDK 用戶端REQUIRE_ENCRYPT_REQUIRE_DECRYPT。如需完整範例,請參閱 中 適用於 Python 的 AWS Encryption SDK 儲存庫中的 aws_kms_keyring_example.py GitHub。

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create a boto3 client for AWS KMS kms_client = boto3.client('kms', region_name="us-west-2") # Optional: Create an encryption context encryption_context: Dict[str, str] = { "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring keyring_input: CreateAwsKmsKeyringInput = CreateAwsKmsKeyringInput( generator=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab, kms_key_ids=additionalKey ) kms_keyring: IKeyring = mat_prov.create_aws_kms_keyring( input=keyring_input )

建立用於解密的 AWS KMS 鍵控

在解密 AWS Encryption SDK 傳回的加密訊息時,您也可以指定 AWS KMS 金鑰。如果解密金鑰設定指定 AWS KMS keys,則 AWS Encryption SDK 只會使用這些包裝金鑰來解密加密訊息中的加密資料金鑰。(您也可以使用AWS KMS 探索鍵環 ,其不會指定任何 AWS KMS keys。)

解密時, AWS Encryption SDK 會搜尋 AWS KMS key 可解密其中一個加密資料金鑰的 AWS KMS 鍵環。具體而言, 會對加密訊息中的每個加密資料金鑰 AWS Encryption SDK 使用下列模式。

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

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

  • 如果其在金鑰環ARN中找到 AWS KMS key 具有相符金鑰的 , AWS KMS 會 AWS Encryption SDK 要求使用KMS金鑰來解密加密的資料金鑰。

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

AWS Encryption SDK 永遠不會嘗試解密加密的資料金鑰,除非 AWS KMS key 加密該資料金鑰ARN的 金鑰包含在解密金鑰集中。如果解密金鑰環不包含任何 AWS KMS keys 加密任何資料金鑰ARNs的 ,則 會 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 KMS keys AWS 區域 和 帳戶中多個 下的資料,但提供針對特定帳戶、區域、使用者、群組或角色量身打造的更有限解密金鑰。

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

注意

如果您重複使用加密金鑰環進行解密,請確定金鑰環 AWS KMS keys 中的 是由其金鑰 所識別ARNs。

例如,下列 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.NETx 版 AWS Encryption SDK 。 建立用於解密的 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

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數目。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數目。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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);
Python

下列範例會使用預設承諾政策 、 來實例化 AWS Encryption SDK 用戶端REQUIRE_ENCRYPT_REQUIRE_DECRYPT。如需完整範例,請參閱 中 適用於 Python 的 AWS Encryption SDK 儲存庫中的 aws_kms_keyring_example.py GitHub。

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create a boto3 client for AWS KMS kms_client = boto3.client('kms', region_name="us-west-2") # Instantiate the material providers mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring keyring_input: CreateAwsKmsKeyringInput = CreateAwsKmsKeyringInput( generator=additionalKey, kms_client=kms_client ) kms_keyring: IKeyring = mat_prov.create_aws_kms_keyring( input=keyring_input )

您也可以使用 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.x AWS Encryption SDK 版NET。

// 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

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數目。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) const clientProvider = getClient(KMS, { credentials }) const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey, otherKey] })
JavaScript Node.js

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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);
Python

下列範例會使用預設承諾政策 、 來實例化 AWS Encryption SDK 用戶端REQUIRE_ENCRYPT_REQUIRE_DECRYPT。如需完整範例,請參閱 中 適用於 Python 的 AWS Encryption SDK 儲存庫中的 aws_kms_keyring_example.py GitHub。

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create a boto3 client for AWS KMS kms_client = boto3.client('kms', region_name="us-west-2") # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring keyring_input: CreateAwsKmsKeyringInput = CreateAwsKmsKeyringInput( generator=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab, kms_client=kms_client ) kms_keyring: IKeyring = mat_prov.create_aws_kms_keyring( input=keyring_input )

與使用所有指定 的加密金鑰集不同 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 KMS 多區域金鑰 AWS Encryption SDK 提供標準 AWS KMS 探索鍵環和探索鍵環。如需搭配 使用多區域金鑰的詳細資訊 AWS Encryption SDK,請參閱 使用多區域 AWS KMS keys

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

解密時,探索金鑰環可讓 使用加密的資料金鑰 AWS KMS 來 AWS Encryption SDK 要求解密 AWS KMS key 任何加密的資料金鑰,無論誰擁有或有權存取該 AWS KMS key。只有在呼叫者擁有 的kms:Decrypt許可時,呼叫才會成功 AWS KMS key。

重要

如果您在解密多鍵控 中包含 AWS KMS 探索鍵控,探索鍵控會覆寫多KMS鍵控中其他鍵控指定的所有金鑰限制。 多重 keyring多鍵控的行為與其限制最少的鍵控一樣。探索 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 可以使用的KMS金鑰限制為aws分割區和 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.x 版 AWS Encryption SDK 。NET

// 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,您必須明確指定探索屬性。

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) const clientProvider = getClient(KMS, { credentials }) const discovery = true const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })
JavaScript Node.js

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

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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);
Python
# Instantiate the AWS Encryption SDK client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create a boto3 client for AWS KMS kms_client = boto3.client('kms', region_name=aws_region) # Optional: Create an encryption context encryption_context: Dict[str, str] = { "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } # Instantiate the material providers mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS discovery keyring discovery_keyring_input: CreateAwsKmsDiscoveryKeyringInput = CreateAwsKmsDiscoveryKeyringInput( kms_client=kms_client, discovery_filter=DiscoveryFilter( account_ids=[aws_account_id], partition="aws" ) ) discovery_keyring: IKeyring = mat_prov.create_aws_kms_discovery_keyring( input=discovery_keyring_input )

使用 AWS KMS 區域探索鍵控

AWS KMS 區域探索鍵環是未指定KMS金鑰ARNs的鍵環。相反地,它允許 僅使用特定 的KMS金鑰 AWS Encryption SDK 進行解密 AWS 區域。

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

與其他探索金鑰環一樣,區域探索金鑰環不會影響加密。只有在解密加密的訊息時才有效。如果您在用於加密和解密的多金鑰集中使用區域探索金鑰,則只有在解密時才有效。如果您使用多區域探索金鑰來加密資料,無論是單獨加密或在多金鑰中加密,加密操作會失敗。

重要

如果您在解密金鑰中包含 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 帳戶 和 分割區中的金鑰。1.7.x 版和更新版本支援探索篩選條件。 AWS Encryption SDK

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

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

AWS Encryption SDK for .NET 沒有專用的區域探索金鑰環。不過,您可以使用數種技術來限制解密至特定區域時使用的KMS金鑰。

限制探索金鑰環中區域最有效的方法是使用 multi-Region-aware探索金鑰環,即使您僅使用單一區域金鑰加密資料。當遇到單一區域金鑰時 multi-Region-aware,金鑰環不會使用任何多區域功能。

CreateAwsKmsMrkDiscoveryKeyring() 方法傳回的鍵環會依區域篩選KMS金鑰,然後再呼叫 AWS KMS。 AWS KMS 只有當加密的資料金鑰由CreateAwsKmsMrkDiscoveryKeyringInput物件中 Region 參數指定的區域中的KMS金鑰加密時,才會傳送解密請求至 。

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

// 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 區域 在 AWS KMS 用戶端執行個體 () 中指定區域,將KMS金鑰限制為特定 AmazonKeyManagementServiceClient。不過,相較於使用探索金鑰環, multi-Region-aware此組態效率較低,而且可能成本更高。 AWS Encryption SDK 的 不會在呼叫 之前依區域篩選KMS金鑰 AWS KMS,而是 AWS KMS 針對每個加密的資料金鑰呼叫 (NET直到其解密一個),並依賴 AWS KMS 將其使用的KMS金鑰限制到指定的區域。

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

// 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

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

若要檢視此鍵環和limitRegions函數,請參閱工作範例中的 kms_regional_discovery.ts。

import { KmsKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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);
Python
# Instantiate the AWS Encryption SDK client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create a boto3 client for AWS KMS kms_client = boto3.client('kms', region_name=aws_region) # Optional: Create an encryption context encryption_context: Dict[str, str] = { "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } # Instantiate the material providers mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS regional discovery keyring regional_discovery_keyring_input: CreateAwsKmsMrkDiscoveryKeyringInput = \ CreateAwsKmsMrkDiscoveryKeyringInput( kms_client=kms_client, region=mrk_replica_decrypt_region, discovery_filter=DiscoveryFilter( account_ids=[111122223333], partition="aws" ) ) regional_discovery_keyring: IKeyring = mat_prov.create_aws_kms_mrk_discovery_keyring( input=regional_discovery_keyring_input )

適用於 JavaScript 的 AWS Encryption SDK 也會匯出 Node.js 和瀏覽器的 excludeRegions函數。此函數會建立在特定 AWS KMS keys 區域中省略的區域 AWS KMS 探索金鑰環。下列範例會建立 AWS KMS 區域探索鍵環,除了美國東部 (維吉尼亞北部) (us-east-1) AWS 區域 以外,可在 AWS KMS keys 帳戶 111122223333 中的每個 中使用。

適用於 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' } })