AWS KMS ECDH Keyring - AWS Encryption SDK

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

AWS KMS ECDH Keyring

重要

鍵環僅適用於適用於 的 4.x NET版和 AWS Encryption SDK 適用於 AWS KMS ECDH的 3.x 版 適用於 JAVA 的 AWS Encryption SDK。鍵環會在 Material Providers Library AWS KMS ECDH的 1.5.0 版中推出。

AWS KMS ECDH 鍵控使用非對稱金鑰協議AWS KMS keys,在兩方之間衍生共用的對稱包裝金鑰。首先, 鍵環使用橢圓曲線 Diffie-Hellman (ECDH) 金鑰協議演算法,從寄件者金鑰對中的私有KMS金鑰和收件者的公有金鑰衍生共用密碼。然後, 鍵環會使用共用密碼來衍生保護資料加密金鑰的共用包裝金鑰。 AWS Encryption SDK 使用 (KDF_CTR_HMAC_SHA384) 衍生共用包裝金鑰的金鑰衍生函數,符合NIST金鑰衍生的建議

金鑰衍生函數會傳回 64 個位元組的金鑰材料。為了確保雙方都使用正確的金鑰材料, AWS Encryption SDK 會使用前 32 個位元組作為承諾金鑰,最後 32 個位元組作為共用包裝金鑰。在解密時,如果鍵環無法重現儲存在訊息標頭密碼文字上的相同承諾金鑰和共用包裝金鑰,操作會失敗。例如,如果您使用以 Alice 私有金鑰和 Bob 公有金鑰設定的鍵環加密資料,則以 Bob 私有金鑰和 Alice 公有金鑰設定的鍵環將重現相同的承諾金鑰和共用包裝金鑰,並能夠解密資料。如果 Bob 的公有金鑰不是來自KMS金鑰對,則 Bob 可以建立原始ECDH金鑰來解密資料。

AWS KMS ECDH 鍵控使用 AES- 使用對稱金鑰加密資料GCM。然後,資料金鑰會使用 AES- 使用衍生的共用包裝金鑰進行信封加密GCM。每個 AWS KMS ECDH鍵環只能有一個共用包裝金鑰,但您可以在多 AWS KMS ECDH鍵環 中單獨包含多個鍵環或與其他鍵一起包含。

鍵環的必要 AWS KMS ECDH許可

AWS Encryption SDK 不需要 AWS 帳戶,也不依賴任何 AWS 服務。不過,若要使用 AWS KMS ECDH鍵環,您需要 AWS 帳戶和下列鍵環 AWS KMS keys 中 的最低許可。許可會根據您使用的金鑰協議結構描述而有所不同。

建立 AWS KMS ECDH鍵控

若要建立 AWS KMS ECDH加密和解密資料的金鑰環,您必須使用KmsPrivateKeyToStaticPublicKey金鑰協議結構描述。若要使用金鑰協議結構描述初始化 AWS KMS ECDHKmsPrivateKeyToStaticPublicKey鍵環,請提供下列值:

  • 寄件者的 AWS KMS key ID

    必須識別KeyUsage值為 的非對稱 - NIST建議的橢圓曲線 (ECC) KMS金鑰對KEY_AGREEMENT。寄件者的私有金鑰用於衍生共用密碼。

  • (選用) 寄件者的公有金鑰

    必須是 DER編碼的 X.509 公有金鑰,也稱為 SubjectPublicKeyInfo(SPKI),如 RFC5280 所定義。

    AWS KMS GetPublicKey 操作會以所需的 DER編碼格式傳回非對稱金鑰對的公KMS有金鑰。

    若要減少鍵環的 AWS KMS 呼叫次數,您可以直接提供寄件者的公有金鑰。如果未為寄件者的公有金鑰提供值,則 鍵環會呼叫 AWS KMS 來擷取寄件者的公有金鑰。

  • 收件人的公有金鑰

    您必須提供收件人DER編碼的 X.509 公有金鑰,也稱為 SubjectPublicKeyInfo(SPKI),如 RFC5280 所定義。

    AWS KMS GetPublicKey 操作會以所需的 DER編碼格式傳回非對稱金鑰對的公KMS有金鑰。

  • 曲線規格

    識別指定金鑰對中的橢圓曲線規格。寄件者和收件人的金鑰對必須具有相同的曲線規格。

    有效值:ECC_NIST_P256ECC_NIS_P384ECC_NIST_P512

  • (選用) 授予權杖清單

    如果您使用 授予來控制對鍵環中KMS AWS KMS ECDH金鑰的存取,則必須在初始化鍵環時提供所有必要的授予權杖。

C# / .NET

下列範例會使用 AWS KMS ECDH 建立具有寄件者KMS金鑰、寄件者公有金鑰和收件者公有金鑰的 金鑰。此範例使用選用SenderPublicKey參數來提供寄件者的公有金鑰。如果您未提供寄件者的公有金鑰,則 鍵環會呼叫 AWS KMS 來擷取寄件者的公有金鑰。寄件者和收件人的金鑰對都在ECC_NIST_P256曲線上。

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Must be DER-encoded X.509 public keys var BobPublicKey = new MemoryStream(new byte[] { }); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the AWS KMS ECDH static keyring var staticConfiguration = new KmsEcdhStaticConfigurations { KmsPrivateKeyToStaticPublicKey = new KmsPrivateKeyToStaticPublicKeyInput { SenderKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", SenderPublicKey = BobPublicKey, RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = staticConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

下列範例會使用 AWS KMS ECDH 建立具有寄件者KMS金鑰、寄件者公有金鑰和收件者公有金鑰的 金鑰。此範例使用選用senderPublicKey參數來提供寄件者的公有金鑰。如果您未提供寄件者的公有金鑰,則 鍵環會呼叫 AWS KMS 來擷取寄件者的公有金鑰。寄件者和收件人的金鑰對都在ECC_NIST_P256曲線上。

// Retrieve public keys // Must be DER-encoded X.509 public keys ByteBuffer BobPublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"); ByteBuffer AlicePublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"); // Create the AWS KMS ECDH static keyring final CreateAwsKmsEcdhKeyringInput senderKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPrivateKeyToStaticPublicKey( KmsPrivateKeyToStaticPublicKeyInput.builder() .senderKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab") .senderPublicKey(BobPublicKey) .recipientPublicKey(AlicePublicKey) .build()).build()).build();

建立 AWS KMS ECDH探索鍵控

解密時,最佳實務是指定 AWS Encryption SDK 可以使用的金鑰。若要遵循此最佳實務,請使用 AWS KMS ECDH具有KmsPrivateKeyToStaticPublicKey金鑰協議結構描述的 鍵環。不過,您也可以建立 AWS KMS ECDH探索鍵環,也就是可 AWS KMS ECDH解密指定金鑰對之公有金鑰與儲存在訊息密碼文字上的收件人公有金鑰相符的任何訊息的KMS鍵環。

重要

當您使用KmsPublicKeyDiscovery金鑰協議結構描述解密訊息時,您接受所有公有金鑰,無論誰擁有它。

若要使用金鑰協議結構描述初始化 AWS KMS ECDHKmsPublicKeyDiscovery鍵環,請提供下列值:

  • 收件人的 AWS KMS key ID

    必須識別KeyUsage值為 的非對稱 - NIST建議的橢圓曲線 (ECC) KMS金鑰對KEY_AGREEMENT

  • 曲線規格

    識別收件人KMS金鑰對中的橢圓曲線規格。

    有效值:ECC_NIST_P256ECC_NIS_P384ECC_NIST_P512

  • (選用) 授予權杖清單

    如果您使用 授予來控制對鍵環中KMS AWS KMS ECDH金鑰的存取,則必須在初始化鍵環時提供所有必要的授予權杖。

C# / .NET

下列範例會在 AWS KMS ECDHECC_NIST_P256曲線上建立具有KMS金鑰對的探索鍵環。您必須具有指定KMS金鑰對的 km:GetPublicKey 和 km:DeriveSharedSecret 許可。此鍵控可以解密指定KMS金鑰對的公有金鑰與儲存在訊息密碼文字上的收件人公有金鑰相符的任何訊息。

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Create the AWS KMS ECDH discovery keyring var discoveryConfiguration = new KmsEcdhStaticConfigurations { KmsPublicKeyDiscovery = new KmsPublicKeyDiscoveryInput { RecipientKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = discoveryConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

下列範例會在 AWS KMS ECDHECC_NIST_P256曲線上建立具有KMS金鑰對的探索鍵環。您必須具有指定KMS金鑰對的 km:GetPublicKey 和 km:DeriveSharedSecret 許可。此鍵控可以解密指定KMS金鑰對的公有金鑰與儲存在訊息密碼文字上的收件人公有金鑰相符的任何訊息。

// Create the AWS KMS ECDH discovery keyring final CreateAwsKmsEcdhKeyringInput recipientKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPublicKeyDiscovery( KmsPublicKeyDiscoveryInput.builder() .recipientKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321").build() ).build()) .build();