Los conjuntos de claves múltiples - 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.

Los conjuntos de claves múltiples

Puede combinar conjuntos de claves en un conjunto de claves múltiple. Un conjunto de claves múltiple es un conjunto de claves que consta de uno o varios conjuntos de claves individuales del mismo tipo o de un tipo distinto. El efecto equivale a utilizar varios conjuntos de claves en una serie. Cuando se utiliza un conjunto de claves múltiple para cifrar datos, cualquiera de las claves de encapsulamiento en cualquiera de los conjuntos de claves puede descifrar dichos datos.

Cuando crea un conjunto de claves múltiple para cifrar datos, designa uno de los conjuntos de claves como conjunto de claves generador. Los conjuntos de claves restantes se conocen como conjuntos de claves secundarios. El conjunto de claves generador genera y cifra la clave de datos de texto no cifrado. A continuación, todas las claves de encapsulamiento de todos los conjuntos de claves secundarios cifran la misma clave de datos en texto no cifrado. El conjunto de claves múltiple devuelve la clave de texto no cifrado y una clave de datos cifrada para cada clave de encapsulamiento del conjunto de claves múltiple. Si el anillo de claves del generador es un anillo de KMSclaves, la clave del generador del anillo de claves genera y cifra la AWS KMS clave de texto simple. A continuación, todas las claves adicionales del AWS KMS keys conjunto de AWS KMS claves y todas las claves de empaquetado de todos los anillos secundarios del conjunto de claves múltiples cifran la misma clave de texto simple.

Si crea un conjunto de claves múltiples sin un conjunto de claves generador, puede usarlo solo para descifrar datos, pero no para cifrarlos. O bien, si desea utilizar un conjunto de claves múltiples sin un conjunto de claves generador en las operaciones de cifrado, puede especificarlo como un conjunto de claves secundario en otro conjunto de claves múltiples. Un conjunto de claves múltiples sin un anillo de claves generador no puede designarse como el anillo de claves generador en otro conjunto de claves múltiples.

Al descifrar, AWS Encryption SDK utiliza los anillos de claves para intentar descifrar una de las claves de datos cifradas. Los conjuntos de claves se llaman en el orden en que están especificados en el conjunto de claves múltiple. El procesamiento se detiene tan pronto como cualquier clave de cualquier conjunto de claves pueda descifrar una clave de datos cifrada.

A partir de la versión 1.7. x, cuando una clave de datos cifrada se cifra bajo un anillo de claves AWS Key Management Service (AWS KMS) (o un proveedor de claves maestras), AWS Encryption SDK siempre pasa la clave ARN del AWS KMS key al KeyId parámetro de la operación de AWS KMS descifrado. Se trata de una práctica AWS KMS recomendada que garantiza que se descifra la clave de datos cifrados con la clave de empaquetado que se va a utilizar.

Para ver un ejemplo práctico de un conjunto de claves múltiple, consulte:

Para crear un conjunto de claves múltiple, en primer lugar, instancie los conjunto de claves secundarios. En este ejemplo, utilizamos un AWS KMS llavero y un llavero Raw, pero puedes combinar cualquier AES llavero compatible en un conjunto de varios llaveros.

C
/* Define an AWS KMS keyring. For details, see string.cpp */ struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(example_key); // Define a Raw AES keyring. For details, see raw_aes_keyring.c */ struct aws_cryptosdk_keyring *aes_keyring = aws_cryptosdk_raw_aes_keyring_new( alloc, wrapping_key_namespace, wrapping_key_name, wrapping_key, AWS_CRYPTOSDK_AES256);
C# / .NET
// Define an AWS KMS keyring. For details, see AwsKmsKeyringExample.cs. var kmsKeyring = materialProviders.CreateAwsKmsKeyring(createKmsKeyringInput); // Define a Raw AES keyring. For details, see RawAESKeyringExample.cs. var aesKeyring = materialProviders.CreateRawAesKeyring(createAesKeyringInput);
JavaScript Browser

En el siguiente ejemplo, se utiliza la buildClient función para especificar la política de compromiso predeterminada,. REQUIRE_ENCRYPT_REQUIRE_DECRYPT También puede utilizarla buildClient para limitar el número de claves de datos cifradas en un mensaje cifrado. Para obtener más información, consulte Limitar las claves de datos cifrados.

import { KmsKeyringBrowser, KMS, getClient, RawAesKeyringWebCrypto, RawAesWrappingSuiteIdentifier, MultiKeyringWebCrypto, buildClient, CommitmentPolicy, synchronousRandomValues, } from '@aws-crypto/client-browser' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) const clientProvider = getClient(KMS, { credentials }) // Define an AWS KMS keyring. For details, see kms_simple.ts. const kmsKeyring = new KmsKeyringBrowser({ generatorKeyId: exampleKey }) // Define a Raw AES keyring. For details, see aes_simple.ts. const aesKeyring = new RawAesKeyringWebCrypto({ keyName, keyNamespace, wrappingSuite, masterKey })
JavaScript Node.js

En el siguiente ejemplo, se utiliza la buildClient función para especificar la política de compromiso predeterminada,REQUIRE_ENCRYPT_REQUIRE_DECRYPT. También puede utilizarla buildClient para limitar el número de claves de datos cifradas en un mensaje cifrado. Para obtener más información, consulte Limitar las claves de datos cifrados.

import { MultiKeyringNode, KmsKeyringNode, RawAesKeyringNode, RawAesWrappingSuiteIdentifier, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) // Define an AWS KMS keyring. For details, see kms_simple.ts. const kmsKeyring = new KmsKeyringNode({ generatorKeyId: exampleKey }) // Define a Raw AES keyring. For details, see raw_aes_keyring_node.ts. const aesKeyring = new RawAesKeyringNode({ keyName, keyNamespace, wrappingSuite, unencryptedMasterKey })
Java
// Define the raw AES keyring. final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateRawAesKeyringInput createRawAesKeyringInput = CreateRawAesKeyringInput.builder() .keyName("AES_256_012") .keyNamespace("HSM_01") .wrappingKey(AESWrappingKey) .wrappingAlg(AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16) .build(); IKeyring rawAesKeyring = matProv.CreateRawAesKeyring(createRawAesKeyringInput); // Define the AWS KMS keyring. final CreateAwsKmsMrkMultiKeyringInput createAwsKmsMrkMultiKeyringInput = CreateAwsKmsMrkMultiKeyringInput.builder() .generator(kmsKeyArn) .build(); IKeyring awsKmsMrkMultiKeyring = matProv.CreateAwsKmsMrkMultiKeyring(createAwsKmsMrkMultiKeyringInput);
Python

En el siguiente ejemplo, se crea una instancia del AWS Encryption SDK cliente con la política de compromiso predeterminada,. REQUIRE_ENCRYPT_REQUIRE_DECRYPT

# Create the AWS KMS keyring kms_client = boto3.client('kms', region_name="us-west-2") mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) kms_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=kms_keyring_input ) # Create Raw AES keyring key_name_space = "HSM_01" key_name = "AES_256_012" raw_aes_keyring_input: CreateRawAesKeyringInput = CreateRawAesKeyringInput( key_namespace=key_name_space, key_name=key_name, wrapping_key=AESWrappingKey, wrapping_alg=AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16 ) raw_aes_keyring: IKeyring = mat_prov.create_raw_aes_keyring( input=raw_aes_keyring_input )

A continuación, cree el conjunto de claves múltiple y especifique su conjunto de claves generador, si lo hay. En este ejemplo, creamos un conjunto de claves múltiples en el que el anillo de AWS KMS claves es el generador y el anillo de claves es el AES anillo secundario.

C

En el constructor del conjunto de claves múltiple en C, solo se especifica el conjunto de claves generador.

struct aws_cryptosdk_keyring *multi_keyring = aws_cryptosdk_multi_keyring_new(alloc, kms_keyring);

Para agregar un conjunto de claves secundario a un conjunto de claves múltiple, utilice el método aws_cryptosdk_multi_keyring_add_child. Debe llamar al método una vez por cada conjunto de claves secundario que agregue.

// Add the Raw AES keyring (C only) aws_cryptosdk_multi_keyring_add_child(multi_keyring, aes_keyring);
C# / .NET

El. NETCreateMultiKeyringInputEl constructor le permite definir un llavero generador y un llavero secundario. El objeto resultante CreateMultiKeyringInput es inmutable.

var createMultiKeyringInput = new CreateMultiKeyringInput { Generator = kmsKeyring, ChildKeyrings = new List<IKeyring>() {aesKeyring} }; var multiKeyring = materialProviders.CreateMultiKeyring(createMultiKeyringInput);
JavaScript Browser

JavaScript los llaveros múltiples son inmutables. El constructor de JavaScript llaveros múltiples permite especificar el anillo de claves del generador y varios anillos de claves secundarios.

const clientProvider = getClient(KMS, { credentials }) const multiKeyring = new MultiKeyringWebCrypto(generator: kmsKeyring, children: [aesKeyring]);
JavaScript Node.js

JavaScript los llaveros múltiples son inmutables. El constructor de JavaScript llaveros múltiples permite especificar el anillo de claves del generador y varios anillos de claves secundarios.

const multiKeyring = new MultiKeyringNode(generator: kmsKeyring, children: [aesKeyring]);
Java

El CreateMultiKeyringInput constructor de Java permite definir un conjunto de claves generador y conjuntos de claves secundarios. El objeto resultante createMultiKeyringInput es inmutable.

final CreateMultiKeyringInput createMultiKeyringInput = CreateMultiKeyringInput.builder() .generator(awsKmsMrkMultiKeyring) .childKeyrings(Collections.singletonList(rawAesKeyring)) .build(); IKeyring multiKeyring = matProv.CreateMultiKeyring(createMultiKeyringInput);
Python
multi_keyring_input: CreateMultiKeyringInput = CreateMultiKeyringInput( generator=kms_keyring, child_keyrings=[raw_aes_keyring] ) multi_keyring: IKeyring = mat_prov.create_multi_keyring( input=multi_keyring_input )

Ahora, puede utilizar el conjunto de claves múltiple para cifrar y descifrar datos.