AWS KMS Porte-clés ECDH - AWS SDK de chiffrement de base de données

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

AWS KMS Porte-clés ECDH

Notre bibliothèque de chiffrement côté client a été renommée SDK de chiffrement de AWS base de données. Ce guide du développeur fournit toujours des informations sur le client de chiffrement DynamoDB.
Important

Le porte-clés AWS KMS ECDH n'est disponible qu'avec la version 1.5.0 de la bibliothèque Material Providers.

Un porte-clés AWS KMS ECDH utilise un accord de clé asymétrique AWS KMS keyspour dériver une clé d'encapsulation symétrique partagée entre deux parties. Tout d'abord, le porte-clés utilise l'algorithme d'accord de clé Elliptic Curve Diffie-Hellman (ECDH) pour dériver un secret partagé à partir de la clé privée contenue dans la paire de clés KMS de l'expéditeur et de la clé publique du destinataire. Le trousseau de clés utilise ensuite le secret partagé pour dériver la clé d'encapsulation partagée qui protège vos clés de chiffrement des données. La fonction de dérivation de clé utilisée par le SDK AWS de chiffrement de base de données (KDF_CTR_HMAC_SHA384) pour dériver la clé d'encapsulation partagée est conforme aux recommandations du NIST en matière de dérivation de clés.

La fonction de dérivation de clés renvoie 64 octets de matériel de saisie. Pour garantir que les deux parties utilisent le bon matériel de saisie, le SDK de chiffrement de AWS base de données utilise les 32 premiers octets comme clé d'engagement et les 32 derniers octets comme clé d'encapsulation partagée. Lors du déchiffrement, si le trousseau de clés ne peut pas reproduire la même clé d'engagement et la même clé d'encapsulation partagée que celles stockées dans le champ de description du matériel de l'enregistrement crypté, l'opération échoue. Par exemple, si vous chiffrez un enregistrement avec un trousseau de clés configuré avec la clé privée d'Alice et la clé publique de Bob, un trousseau de clés configuré avec la clé privée de Bob et la clé publique d'Alice reproduira la même clé d'engagement et la même clé d'encapsulation partagée et pourra déchiffrer l'enregistrement. Si la clé publique de Bob ne provient pas d'une paire de clés KMS, Bob peut créer un jeu de clés ECDH brut pour déchiffrer l'enregistrement.

Le trousseau de clés AWS KMS ECDH chiffre les enregistrements avec une clé symétrique à l'aide de l'AES-GCM. La clé de données est ensuite cryptée par enveloppe avec la clé d'encapsulation partagée dérivée à l'aide d'AES-GCM. Chaque porte-clés AWS KMS ECDH ne peut avoir qu'une seule clé d'encapsulation partagée, mais vous pouvez inclure plusieurs porte-clés AWS KMS ECDH, seuls ou avec d'autres porte-clés, dans un porte-clés multiple.

Autorisations requises pour les AWS KMS porte-clés ECDH

Le SDK AWS Database Encryption ne nécessite pas de AWS compte et ne dépend d'aucun AWS service. Toutefois, pour utiliser un porte-clés AWS KMS ECDH, vous devez disposer d'un AWS compte et des autorisations minimales suivantes sur le porte-clés de votre trousseau AWS KMS keys de clés. Les autorisations varient en fonction du schéma d'accord clé que vous utilisez.

  • Pour chiffrer et déchiffrer des enregistrements à l'aide du schéma d'accord de KmsPrivateKeyToStaticPublicKey clés, vous avez besoin de kms : GetPublicKey et kms : DeriveSharedSecret sur la paire de clés KMS asymétrique de l'expéditeur. Si vous fournissez directement la clé publique codée DER de l'expéditeur lorsque vous instanciez votre jeu de clés, vous n'avez besoin que de l'DeriveSharedSecretautorisation kms : sur la paire de clés KMS asymétrique de l'expéditeur.

  • Pour déchiffrer des enregistrements à l'aide du schéma d'accord de KmsPublicKeyDiscovery clés, vous avez besoin des GetPublicKey autorisations kms : DeriveSharedSecret et kms : sur la paire de clés KMS asymétrique spécifiée.

Création d'un AWS KMS porte-clés ECDH

Pour créer un jeu de clés AWS KMS ECDH qui chiffre et déchiffre les données, vous devez utiliser le schéma d'accord de clés. KmsPrivateKeyToStaticPublicKey Pour initialiser un trousseau de clés AWS KMS ECDH avec le schéma d'accord de KmsPrivateKeyToStaticPublicKey clés, fournissez les valeurs suivantes :

Java

L'exemple suivant crée un jeu de clés AWS KMS ECDH avec la clé KMS de l'expéditeur, la clé publique de l'expéditeur et la clé publique du destinataire. Cet exemple utilise le senderPublicKey paramètre facultatif pour fournir la clé publique de l'expéditeur. Si vous ne fournissez pas la clé publique de l'expéditeur, le keyring appelle AWS KMS pour récupérer la clé publique de l'expéditeur. Les paires de clés de l'expéditeur et du destinataire sont toutes deux en ECC_NIST_P256 évolution.

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

Création d'un AWS KMS porte-clés de découverte ECDH

Lors du déchiffrement, il est recommandé de spécifier les clés que le SDK de chiffrement de AWS base de données peut utiliser. Pour suivre cette bonne pratique, utilisez un trousseau de clés AWS KMS ECDH avec le schéma d'accord de KmsPrivateKeyToStaticPublicKey clés. Toutefois, vous pouvez également créer un jeu de clés de découverte AWS KMS ECDH, c'est-à-dire un jeu de clés AWS KMS ECDH capable de déchiffrer tout enregistrement dont la clé publique de la paire de clés KMS spécifiée correspond à la clé publique du destinataire stockée dans le champ de description du matériel de l'enregistrement crypté.

Important

Lorsque vous déchiffrez des enregistrements à l'aide du schéma d'accord de KmsPublicKeyDiscovery clés, vous acceptez toutes les clés publiques, quel que soit leur propriétaire.

Pour initialiser un trousseau de clés AWS KMS ECDH avec le schéma d'accord de KmsPublicKeyDiscovery clés, fournissez les valeurs suivantes :

  • AWS KMS key Identifiant du destinataire

    Doit identifier une paire de clés KMS à courbe elliptique (ECC) asymétrique recommandée par le NIST avec une valeur de. KeyUsage KEY_AGREEMENT

  • Spécification de la courbe

    Identifie la spécification de courbe elliptique dans la paire de clés KMS du destinataire.

    Valeurs valides: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

  • (Facultatif) Une liste de jetons de subvention

    Si vous contrôlez l'accès à la clé KMS dans votre trousseau de clés AWS KMS ECDH avec des autorisations, vous devez fournir tous les jetons d'autorisation nécessaires lors de l'initialisation du trousseau de clés.

Java

L'exemple suivant crée un trousseau de clés de découverte AWS KMS ECDH avec une paire de clés KMS sur la ECC_NIST_P256 courbe. Vous devez disposer des DeriveSharedSecret autorisations kms : GetPublicKey et kms : sur la paire de clés KMS spécifiée. Ce porte-clés peut déchiffrer n'importe quel enregistrement où la clé publique de la paire de clés KMS spécifiée correspond à la clé publique du destinataire stockée dans le champ de description matérielle de l'enregistrement crypté.

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