Conjuntos de claves de AWS KMS ECDH - AWS Encryption SDK

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Conjuntos de claves de AWS KMS ECDH

importante

El AWS KMS ECDH llavero solo está disponible en la versión 4. x de la forma AWS Encryption SDK . NETy versión 3. x del SDK de cifrado de AWS para Java. El AWS KMS ECDH llavero se introdujo en la versión 1.5.0 de la biblioteca de proveedores de materiales.

Un conjunto de AWS KMS ECDH claves utiliza un acuerdo de claves asimétrico AWS KMS keyspara obtener una clave envolvente simétrica compartida entre dos partes. En primer lugar, el conjunto de claves utiliza el algoritmo de acuerdo de claves Diffie-Hellman (ECDH) de curva elíptica para obtener un secreto compartido a partir de la clave privada del par de claves del remitente y la KMS clave pública del destinatario. A continuación, el conjunto de claves utiliza el secreto compartido para obtener la clave de empaquetado compartida que protege las claves de cifrado de datos. La función de derivación de claves que AWS Encryption SDK utiliza (KDF_CTR_HMAC_SHA384) para derivar la clave de empaquetado compartida cumple con NISTlas recomendaciones de derivación de claves.

La función de derivación de claves devuelve 64 bytes de material de creación de claves. Para garantizar que ambas partes utilicen el material de codificación correcto, AWS Encryption SDK utiliza los primeros 32 bytes como clave de compromiso y los últimos 32 bytes como clave de empaquetado compartida. Al descifrar, si el conjunto de claves no puede reproducir la misma clave de compromiso y la misma clave de empaquetado compartida que están almacenadas en el texto cifrado del encabezado del mensaje, la operación no se realizará correctamente. Por ejemplo, si cifra los datos con un conjunto de claves configurado con la clave privada de Alice y la clave pública de Bob, un conjunto de claves configurado con la clave privada de Bob y la clave pública de Alice reproducirá la misma clave de compromiso y clave de empaquetado compartida y podrá descifrar los datos. Si la clave pública de Bob no proviene de un par de KMS claves, entonces Bob puede crear un conjunto de ECDHclaves Raw para descifrar los datos.

El AWS KMS ECDH anillo de claves cifra los datos con una clave simétrica utilizando -. AES GCM A continuación, la clave de datos se cifra sobre con la clave de empaquetado compartida derivada mediante -. AES GCM Cada AWS KMS ECDH llavero solo puede tener una clave de empaquetado compartida, pero puedes incluir varios AWS KMS ECDH llaveros, solos o con otros, en un conjunto de varios llaveros.

Permisos necesarios para los conjuntos de claves de AWS KMS ECDH

AWS Encryption SDK No requiere una AWS cuenta y no depende de ningún servicio. AWS Sin embargo, para usar un AWS KMS ECDH llavero, necesitas una AWS cuenta y los siguientes permisos mínimos AWS KMS keys en el llavero. Los permisos varían en función del esquema de acuerdo de claves que utilices.

  • Para cifrar y descifrar datos mediante el esquema de acuerdo de KmsPrivateKeyToStaticPublicKey claves, necesita kms: GetPublicKey y kms: DeriveSharedSecret en el par de claves asimétricas KMSdel remitente. Si proporciona directamente la clave pública DER codificada del remitente al crear una instancia de su conjunto de claves, solo necesitará el DeriveSharedSecret permiso kms: en el par de claves asimétricas del remitente. KMS

  • Para descifrar los datos mediante el esquema de acuerdo de KmsPublicKeyDiscovery claves, necesita los GetPublicKey permisos kms: DeriveSharedSecret y kms: en el par de KMS claves asimétricas especificado.

Creación de un conjunto de claves de AWS KMS ECDH

Para crear un conjunto de AWS KMS ECDH claves que cifre y descifre los datos, debe utilizar el esquema de acuerdo de claves. KmsPrivateKeyToStaticPublicKey Para inicializar un conjunto de AWS KMS ECDH claves con el esquema de acuerdo de KmsPrivateKeyToStaticPublicKey claves, proporcione los siguientes valores:

  • ID del remitente AWS KMS key

    Debe identificar un ECC par de KMS claves NIST de curva elíptica () recomendado asimétrico con un KeyUsage valor de. KEY_AGREEMENT La clave privada del remitente se utiliza para obtener el secreto compartido.

  • (Opcional) Clave pública del remitente

    Debe ser una clave pública X.509 DER codificada, también conocida como SubjectPublicKeyInfo (SPKI), tal como se define en RFC 5280.

    La AWS KMS GetPublicKeyoperación devuelve la clave pública de un KMS key pair asimétrico en el formato DER codificado requerido.

    Para reducir el número de AWS KMS llamadas que realiza tu llavero, puedes proporcionar directamente la clave pública del remitente. Si no se proporciona ningún valor para la clave pública del remitente, el llavero llama AWS KMS para recuperar la clave pública del remitente.

  • La clave pública del destinatario

    Debe proporcionar la clave pública X.509 DER codificada del destinatario, también conocida como SubjectPublicKeyInfo (SPKI), tal como se define en RFC 5280.

    La AWS KMS GetPublicKeyoperación devuelve la clave pública de un KMS key pair asimétrico en el formato DER codificado requerido.

  • Especificación de curva

    Identifica la especificación de la curva elíptica en los pares de claves especificados. Los pares de claves del remitente y del destinatario deben tener la misma especificación de curva.

    Valores válidos: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

  • (Opcional) Una lista de tokens de concesión

    Si controlas el acceso a la KMS clave de tu AWS KMS ECDH llavero mediante concesiones, debes proporcionar todas las fichas de concesión necesarias al inicializar el llavero.

C# / .NET

En el siguiente ejemplo, se crea un AWS KMS ECDH anillo de claves con la KMS clave del remitente, la clave pública del remitente y la clave pública del destinatario. En este ejemplo, se utiliza el SenderPublicKey parámetro opcional para proporcionar la clave pública del remitente. Si no proporciona la clave pública del remitente, el conjunto de claves llama AWS KMS para recuperar la clave pública del remitente. Los pares de claves del remitente y del destinatario están en la ECC_NIST_P256 curva.

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

En el siguiente ejemplo, se crea un conjunto de AWS KMS ECDH claves con la KMS clave del remitente, la clave pública del remitente y la clave pública del destinatario. En este ejemplo, se utiliza el senderPublicKey parámetro opcional para proporcionar la clave pública del remitente. Si no proporciona la clave pública del remitente, el conjunto de claves llama AWS KMS para recuperar la clave pública del remitente. Los pares de claves del remitente y del destinatario están en la ECC_NIST_P256 curva.

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

Crear un llavero de AWS KMS ECDH descubrimiento

Al descifrar, se recomienda especificar las claves que AWS Encryption SDK pueden utilizar. Para seguir esta práctica recomendada, utilice un AWS KMS ECDH anillo de claves con el esquema de acuerdo de KmsPrivateKeyToStaticPublicKey claves. Sin embargo, también puede crear un anillo de claves de AWS KMS ECDH detección, es decir, un AWS KMS ECDH anillo de claves que pueda descifrar cualquier mensaje en el que la clave pública del par de claves especificado coincida con la KMS clave pública del destinatario almacenada en el texto cifrado del mensaje.

importante

Al descifrar los mensajes mediante el esquema de acuerdo de KmsPublicKeyDiscovery claves, acepta todas las claves públicas, independientemente de quién sea su propietario.

Para inicializar un conjunto de AWS KMS ECDH claves con el esquema de acuerdo de KmsPublicKeyDiscovery claves, proporcione los siguientes valores:

  • ID del destinatario AWS KMS key

    Debe identificar un ECC par de KMS claves NIST de curva elíptica () recomendado asimétrico con un KeyUsage valor de. KEY_AGREEMENT

  • Especificación de curva

    Identifica la especificación de la curva elíptica en el KMS key pair del destinatario.

    Valores válidos: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

  • (Opcional) Una lista de tokens de concesión

    Si controlas el acceso a la KMS clave de tu AWS KMS ECDH llavero mediante concesiones, debes proporcionar todas las fichas de concesión necesarias al inicializar el llavero.

C# / .NET

En el siguiente ejemplo, se crea un llavero de AWS KMS ECDH detección con un par de KMS claves en la ECC_NIST_P256 curva. Debe tener los DeriveSharedSecret permisos kms: GetPublicKey y kms: en el KMS key pair especificado. Este conjunto de claves puede descifrar cualquier mensaje en el que la clave pública del par de KMS claves especificado coincida con la clave pública del destinatario almacenada en el texto cifrado del mensaje.

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

En el siguiente ejemplo, se crea un llavero de AWS KMS ECDH detección con un par de KMS claves en la ECC_NIST_P256 curva. Debe tener los DeriveSharedSecret permisos kms: GetPublicKey y kms: en el KMS key pair especificado. Este conjunto de claves puede descifrar cualquier mensaje en el que la clave pública del par de KMS claves especificado coincida con la clave pública del destinatario almacenada en el texto cifrado del mensaje.

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