ECDHLlaveros Raw - AWS Cifrado de bases 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.

ECDHLlaveros Raw

Nuestra biblioteca de cifrado del lado del cliente pasó a llamarse Database Encryption. AWS SDK En esta guía para desarrolladores, se sigue proporcionando información sobre el cliente de cifrado de DynamoDB.
importante

El conjunto de ECDH claves Raw solo está disponible en la versión 1.5.0 de la biblioteca de proveedores de materiales.

El ECDH llavero Raw utiliza los pares de claves público-privadas de curva elíptica que usted proporciona para obtener una clave de empaquetado compartida entre dos partes. En primer lugar, el conjunto de claves obtiene un secreto compartido utilizando la clave privada del remitente, la clave pública del destinatario y el algoritmo de acuerdo de claves Elliptic Curve Diffie-Hellman (). ECDH 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 SDK utiliza el cifrado de AWS bases de datos (KDF_CTR_HMAC_SHA384) para derivar la clave de empaquetado compartida se ajusta a NISTlas recomendaciones de derivación de claves.

La función de derivación de claves devuelve 64 bytes de material de codificación. Para garantizar que ambas partes utilicen el material de codificación correcto, el cifrado de la AWS base de datos 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 campo de descripción del material del registro cifrado, la operación no se realizará correctamente. Por ejemplo, si cifra un registro 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 el registro. Si la clave pública de Bob proviene de un AWS KMS key par, Bob puede crear un conjunto de AWS KMS ECDHclaves para descifrar el registro.

El conjunto de ECDH claves Raw cifra los registros 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 ECDH llavero Raw solo puede tener una clave de empaquetado compartida, pero puedes incluir varios ECDH llaveros Raw, solos o con otros, en un llavero múltiple.

Usted es responsable de generar, almacenar y proteger sus claves privadas, preferiblemente en un módulo de seguridad de hardware (HSM) o en un sistema de administración de claves. Los pares de claves del remitente y del destinatario deben estar en la misma curva elíptica. El cifrado AWS de la base de datos SDK admite las siguientes especificaciones de curva elíptica:

  • ECC_NIST_P256

  • ECC_NIST_P384

  • ECC_NIST_P512

Creación de un conjunto de claves sin procesar ECDH

El ECDH llavero Raw admite tres esquemas de acuerdo clave:RawPrivateKeyToStaticPublicKey, yEphemeralPrivateKeyToStaticPublicKey. PublicKeyDiscovery El esquema de acuerdo de claves que seleccione determina qué operaciones criptográficas puede realizar y cómo se ensamblan los materiales de codificación.

RawPrivateKeyToStaticPublicKey

Utilice el esquema de acuerdo de RawPrivateKeyToStaticPublicKey claves para configurar de forma estática la clave privada del remitente y la clave pública del destinatario en el conjunto de claves. Este esquema de acuerdo de claves puede cifrar y descifrar registros.

Para inicializar un conjunto de ECDH claves sin procesar con el esquema de acuerdo de RawPrivateKeyToStaticPublicKey claves, proporcione los siguientes valores:

C# / .NET
// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); var BobPrivateKey = new MemoryStream(new byte[] { }); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the Raw ECDH static keyring var staticConfiguration = new RawEcdhStaticConfigurations() { RawPrivateKeyToStaticPublicKey = new RawPrivateKeyToStaticPublicKeyInput { SenderStaticPrivateKey = BobPrivateKey, RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateRawEcdhKeyringInput() { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KeyAgreementScheme = staticConfiguration }; var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
Java

El siguiente ejemplo de Java utiliza el esquema de acuerdo de RawPrivateKeyToStaticPublicKey claves para configurar estáticamente la clave privada del remitente y la clave pública del destinatario. Ambos pares de claves están en la ECC_NIST_P256 curva.

private static void StaticRawKeyring() { // Instantiate material providers final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); KeyPair senderKeys = GetRawEccKey(); KeyPair recipient = GetRawEccKey(); // Create the Raw ECDH static keyring final CreateRawEcdhKeyringInput rawKeyringInput = CreateRawEcdhKeyringInput.builder() .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( RawEcdhStaticConfigurations.builder() .RawPrivateKeyToStaticPublicKey( RawPrivateKeyToStaticPublicKeyInput.builder() // Must be a PEM-encoded private key .senderStaticPrivateKey(ByteBuffer.wrap(senderKeys.getPrivate().getEncoded())) // Must be a DER-encoded X.509 public key .recipientPublicKey(ByteBuffer.wrap(recipient.getPublic().getEncoded())) .build() ) .build() ).build(); final IKeyring staticKeyring = materialProviders.CreateRawEcdhKeyring(rawKeyringInput); }

EphemeralPrivateKeyToStaticPublicKey

Los conjuntos de EphemeralPrivateKeyToStaticPublicKey claves configurados con el esquema de acuerdo de claves crean un nuevo par de claves localmente y derivan una clave de empaquetado compartida única para cada llamada de cifrado.

Este esquema de acuerdo de claves solo puede cifrar registros. Para descifrar los registros cifrados con el esquema de acuerdo de EphemeralPrivateKeyToStaticPublicKey claves, debe utilizar un esquema de acuerdo de claves de descubrimiento configurado con la clave pública del mismo destinatario. Para descifrar, puede usar un ECDH anillo de claves sin procesar con el algoritmo de acuerdo de PublicKeyDiscoveryclaves o, si la clave pública del destinatario proviene de un par de claves de acuerdo de claves asimétricas, puede usar un AWS KMS ECDH anillo de KMS claves con el KmsPublicKeyDiscoveryesquema de acuerdo de claves.

Para inicializar un conjunto de ECDH claves Raw con el esquema de acuerdo de EphemeralPrivateKeyToStaticPublicKey claves, proporcione los siguientes valores:

C# / .NET

En el siguiente ejemplo, se crea un ECDH anillo de claves sin procesar con el esquema de acuerdo de EphemeralPrivateKeyToStaticPublicKey claves. Al cifrar, el anillo de claves creará un nuevo par de claves localmente en la curva especificadaECC_NIST_P256.

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the Raw ECDH ephemeral keyring var ephemeralConfiguration = new RawEcdhStaticConfigurations() { EphemeralPrivateKeyToStaticPublicKey = new EphemeralPrivateKeyToStaticPublicKeyInput { RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateRawEcdhKeyringInput() { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KeyAgreementScheme = ephemeralConfiguration }; var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
Java

En el siguiente ejemplo, se crea un ECDH anillo de claves sin procesar con el esquema de acuerdo de EphemeralPrivateKeyToStaticPublicKey claves. Al cifrar, el anillo de claves creará un nuevo par de claves localmente en la curva especificadaECC_NIST_P256.

private static void EphemeralRawEcdhKeyring() { // Instantiate material providers final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); ByteBuffer recipientPublicKey = getPublicKeyBytes(); // Create the Raw ECDH ephemeral keyring final CreateRawEcdhKeyringInput ephemeralInput = CreateRawEcdhKeyringInput.builder() .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( RawEcdhStaticConfigurations.builder() .EphemeralPrivateKeyToStaticPublicKey( EphemeralPrivateKeyToStaticPublicKeyInput.builder() .recipientPublicKey(recipientPublicKey) .build() ) .build() ).build(); final IKeyring ephemeralKeyring = materialProviders.CreateRawEcdhKeyring(ephemeralInput); }

PublicKeyDiscovery

Al descifrar, se recomienda especificar las claves de empaquetado que puede utilizar el cifrado SDK de AWS bases de datos. Para seguir esta práctica recomendada, utilice un conjunto de ECDH claves que especifique tanto la clave privada del remitente como la clave pública del destinatario. Sin embargo, también puede crear un conjunto de claves de ECDH detección sin procesar, es decir, un conjunto de ECDH claves sin procesar que pueda descifrar cualquier registro en el que la clave pública de la clave especificada coincida con la clave pública del destinatario almacenada en el campo de descripción del material del registro cifrado. Este esquema de acuerdo de claves solo puede descifrar registros.

importante

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

Para inicializar un conjunto de ECDH claves Raw con el esquema de acuerdo de PublicKeyDiscovery claves, proporcione los siguientes valores:

  • Clave privada estática del destinatario

    Debe proporcionar la clave privada PEM codificada del destinatario ( PrivateKeyInfo estructuras PKCS #8), tal como se define en RFC5958.

  • Especificación de curva

    Identifica la especificación de la curva elíptica en la clave privada especificada. 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

C# / .NET

En el siguiente ejemplo, se crea un ECDH anillo de claves Raw con el esquema de acuerdo de PublicKeyDiscovery claves. Este conjunto de claves puede descifrar cualquier registro en el que la clave pública de la clave privada especificada coincida con la clave pública del destinatario almacenada en el campo de descripción del material del registro cifrado.

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); var AlicePrivateKey = new MemoryStream(new byte[] { }); // Create the Raw ECDH discovery keyring var discoveryConfiguration = new RawEcdhStaticConfigurations() { PublicKeyDiscovery = new PublicKeyDiscoveryInput { RecipientStaticPrivateKey = AlicePrivateKey } }; var createKeyringInput = new CreateRawEcdhKeyringInput() { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KeyAgreementScheme = discoveryConfiguration }; var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
Java

En el siguiente ejemplo, se crea un ECDH anillo de claves sin procesar con el esquema de acuerdo de PublicKeyDiscovery claves. Este conjunto de claves puede descifrar cualquier registro en el que la clave pública de la clave privada especificada coincida con la clave pública del destinatario almacenada en el campo de descripción del material del registro cifrado.

private static void RawEcdhDiscovery() { // Instantiate material providers final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); KeyPair recipient = GetRawEccKey(); // Create the Raw ECDH discovery keyring final CreateRawEcdhKeyringInput rawKeyringInput = CreateRawEcdhKeyringInput.builder() .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( RawEcdhStaticConfigurations.builder() .PublicKeyDiscovery( PublicKeyDiscoveryInput.builder() // Must be a PEM-encoded private key .recipientStaticPrivateKey(ByteBuffer.wrap(sender.getPrivate().getEncoded())) .build() ) .build() ).build(); final IKeyring publicKeyDiscovery = materialProviders.CreateRawEcdhKeyring(rawKeyringInput); }