AWS KMS ECDH Keyring - AWS 資料庫加密 SDK

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

AWS KMS ECDH Keyring

我們的客戶端加密庫被重命名為數 AWS 據庫加密SDK。本開發人員指南仍提供 DynamoDB 加密用戶端的相關資訊。
重要

AWS KMS ECDH金鑰圈僅適用於材料提供者資源庫的 1.5.0 版。

金 AWS KMS ECDH鑰圈使用非對稱金鑰協定AWS KMS keys來衍生雙方之間的共用對稱包裝金鑰。首先,金鑰圈會使用橢圓曲線 Diffie-Hellman (ECDH) 金鑰合約演算法,從寄件者金鑰組中的私密金鑰和收件者的公開 KMS key pair 衍生共用密碼。然後,金鑰圈會使用共用密碼衍生共用包裝金鑰,以保護您的資料加密金鑰。 AWS 資料庫加密SDK使用 (KDF_CTR_HMAC_SHA384) 衍生共用包裝金鑰的金鑰衍生函數,符合金鑰衍生的NIST建議

密鑰派生函數返回 64 個字節的鍵控材料。為了確保雙方使用正確的金鑰資料,資料 AWS 庫加密SDK會使用前 32 個位元組做為承諾金鑰,最後 32 個位元組作為共用包裝金鑰。解密時,如果金鑰圈無法重現儲存在加密記錄之 [資料描述] 欄位中的相同承諾金鑰和共用包裝金鑰,作業就會失敗。例如,如果您使用以 Alice 私密金鑰和 Bob 公開金鑰設定的金鑰圈來加密記錄,則使用 Bob 的私密金鑰和 Alice 公開金鑰設定的金鑰圈將會重現相同的承諾金鑰和共用包裝金鑰,並且能夠解密記錄。如果 Bob 的公開金鑰不是來自 KMS key pair,Bob 可以建立 Raw 金ECDH鑰圈來解密記錄。

金 AWS KMS ECDH鑰環使用-以對稱金鑰加密記錄。AES GCM然後使用-,使用派生的共享包裝密鑰對數據密鑰進AES行包絡加密GCM。每個 AWS KMS ECDH鑰匙圈只能有一個共用包裝金鑰,但您可以在多重鑰匙圈中包含多個 AWS KMS ECDH鑰匙圈,單獨或與其他鑰匙圈一起包含多個鑰匙圈。

AWS KMS ECDH金鑰圈所需的權限

數 AWS 據庫加密SDK不需要 AWS 帳戶,也不依賴於任何 AWS 服務。但是,若要使用 AWS KMS ECDH金鑰圈,您需要一個 AWS 帳戶以及金鑰圈 AWS KMS keys 中的下列最低權限。權限會根據您使用的金鑰合約結構描述而有所不同。

  • 若要使用金KmsPrivateKeyToStaticPublicKey鑰合約結構描述加密GetPublicKey和解密記錄,寄件者的非對稱 KMS key pair DeriveSharedSecret 上需要 kms: 和 kms:。如果您在實體化金鑰環時直接提供寄件者DER編碼的公開金鑰,您只需要 kms: 寄件者非對稱KMS金鑰組的DeriveSharedSecret權限。

  • 若要使用金KmsPublicKeyDiscovery鑰協定結構描述解密記錄,您需要指定非對稱 KMS key pair 的 kms: DeriveSharedSecret 和 kms: GetPublicKey 權限。

建立 AWS KMS ECDH金鑰圈

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

C# / .NET

下列範例會使用寄件者KMS金鑰、寄件者的公開金鑰和收件者的公開金鑰建立金鑰 AWS KMS ECDH圈。此範例使用選用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

下列範例會使用寄件者KMS金鑰、寄件者的公開金鑰和收件者的公開金鑰建立金鑰 AWS KMS ECDH圈。此範例使用選用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 資料庫加密SDK可以使用的金鑰。若要遵循此最佳做法,請使用金 AWS KMS ECDH鑰圈搭配KmsPrivateKeyToStaticPublicKey金鑰合約結構描述。不過,您也可以建立 AWS KMS ECDH探索金鑰圈,也就是說,可以將指定KMS金 AWS KMS ECDH鑰 key pair 的公開金鑰與加密記錄的材料描述欄位中儲存的收件者公開金鑰相符的任何記錄解密。

重要

當您使用金KmsPublicKeyDiscovery鑰合約結構描述解密記錄時,您會接受所有公開金鑰,不論其擁有者為何。

若要使用KmsPublicKeyDiscovery金鑰協定結構描述初始化金鑰 AWS KMS ECDH圈,請提供下列值:

C# / .NET

下列範例會在ECC_NIST_P256曲線上建立含有 KMS key pair 的 AWS KMS ECDH探索金鑰圈。您必須擁有指定 KMS key pair 的 kms: GetPublicKey 和 kms: DeriveSharedSecret 權限。此金鑰圈可以解密指定 KMS key pair 的公開金鑰與儲存在加密記錄之材料描述欄位中的收件者公開金鑰相符的任何記錄。

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

下列範例會在ECC_NIST_P256曲線上建立含有 KMS key pair 的 AWS KMS ECDH探索金鑰圈。您必須擁有指定 KMS key pair 的 kms: GetPublicKey 和 kms: DeriveSharedSecret 權限。此金鑰圈可以解密指定 KMS key pair 的公開金鑰與儲存在加密記錄之材料描述欄位中的收件者公開金鑰相符的任何記錄。

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