SDK de cifrado de AWS para Java - 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.

SDK de cifrado de AWS para Java

En este tema se explica cómo instalar y utilizar el SDK de cifrado de AWS para Java. Para obtener más información sobre la programación con SDK de cifrado de AWS para Java, consulte el aws-encryption-sdk-javarepositorio en GitHub. Para obtener API documentación, consulte el Javadoc de. SDK de cifrado de AWS para Java

Requisitos previos

Antes de instalar el SDK de cifrado de AWS para Java, asegúrese de cumplir los siguientes requisitos previos.

Un entorno de desarrollo de Java

Necesitará Java 8 o una versión posterior. En el sitio web de Oracle, vaya a Descargas de Java SE y, a continuación, descargue e instale el kit de desarrollo de Java SE (JDK).

Si utiliza OracleJDK, también debe descargar e instalar los archivos de política de jurisdicción de fuerza ilimitada de Java Cryptography Extension (JCE).

Bouncy Castle

Esto SDK de cifrado de AWS para Java requiere Bouncy Castle.

Si no tienes Bouncy Castle, ve a las últimas versiones de Bouncy Castle para descargar el archivo del proveedor que corresponda a ti. JDK También puedes usar Apache Maven para obtener el artefacto para el proveedor estándar de Bouncy Castle (bcprov-ext-jdk15on) o el artefacto para Bouncy Castle (bc-fips). FIPS

AWS SDK for Java

Versión 3. x de los SDK de cifrado de AWS para Java requiere el AWS SDK for Java 2.x, incluso si no usas AWS KMS llaveros.

Versión 2. x o una versión anterior de la SDK de cifrado de AWS para Java no requiere la AWS SDK for Java. Sin embargo, AWS SDK for Java es necesario para usar AWS Key Management Service(AWS KMS) como proveedor de claves maestras. A partir de la SDK de cifrado de AWS para Java versión 2.4.0, SDK de cifrado de AWS para Java es compatible con las versiones 1.x y 2.x de. AWS SDK for Java AWS Encryption SDK el código de la AWS SDK for Java 1.x y la 2.x es interoperable. Por ejemplo, puede cifrar los datos con un AWS Encryption SDK código compatible con la versión AWS SDK for Java 1.x y descifrarlos con un código compatible AWS SDK for Java 2.x (o viceversa). Las versiones anteriores a la 2.4.0 SDK de cifrado de AWS para Java solo admiten la versión 1.x. AWS SDK for Java Para obtener información sobre cómo actualizar su versión de AWS Encryption SDK, consulte. Migración de su AWS Encryption SDK

Al actualizar el SDK de cifrado de AWS para Java código de la versión AWS SDK for Java 1.x a AWS SDK for Java 2.x, sustituya las referencias a la AWSKMSinterfaz de la versión AWS SDK for Java 1.x por las referencias a la KmsClientinterfaz de. AWS SDK for Java 2.xNo SDK de cifrado de AWS para Java es compatible con la KmsAsyncClient interfaz. Además, actualice el código para usar los objetos relacionados al AWS KMS en el espacio de nombres de kmssdkv2, en lugar del espacio de nombres de kms.

Para instalar AWS SDK for Java, utilice Apache Maven.

  • Para importar todo el AWS SDK for Java como una dependencia declárelo en el archivo pom.xml.

  • Para crear una dependencia solo para el AWS KMS módulo de la AWS SDK for Java versión 1.x, siga las instrucciones para especificar determinados módulos y establezca el artifactId valor. aws-java-sdk-kms

  • Para crear una dependencia solo para el AWS KMS módulo de la versión AWS SDK for Java 2.x, siga las instrucciones para especificar módulos concretos. Establece el groupId en software.amazon.awssdk y el artifactId en kms.

Para ver más cambios, consulta las diferencias entre la versión AWS SDK for Java 1.x y la 2.x en la AWS SDK for Java 2.x Guía para desarrolladores.

Los ejemplos de Java de la Guía AWS Encryption SDK para desarrolladores utilizan el. AWS SDK for Java 2.x

Instalación

Instale la versión más reciente de SDK de cifrado de AWS para Java.

nota

Todas las versiones SDK de cifrado de AWS para Java anteriores a la 2.0.0 se encuentran en esta end-of-supportfase.

Puede actualizar de forma segura desde la versión 2.0.x y versiones posteriores a la última versión de SDK de cifrado de AWS para Java sin cambios en el código ni en los datos. Sin embargo, nuevas características de seguridad que se introdujeron en la versión 2.0.x no son compatibles con versiones anteriores. Para actualizar desde versiones anteriores a la 1.7.x a la versión 2.0.x y posteriores, primero debe actualizar a la última versión 1.x de AWS Encryption SDK. Para obtener más información, consulte Migrar su AWS Encryption SDK.

Puede instalarlo de SDK de cifrado de AWS para Java las siguientes maneras.

Manualmente

Para instalarlo SDK de cifrado de AWS para Java, clone o descargue el aws-encryption-sdk-java GitHubrepositorio.

Con Apache Maven

SDK de cifrado de AWS para Java Está disponible a través de Apache Maven con la siguiente definición de dependencia.

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-encryption-sdk-java</artifactId> <version>3.0.0</version> </dependency>

Después de instalar elSDK, comience consultando el ejemplo de código Java de esta guía y el Javadoc en el siguiente. GitHub

AWS KMS llaveros en el SDK de cifrado de AWS para Java

Versión 3. x de los SDK de cifrado de AWS para Java utiliza anillos de claves para realizar el cifrado de sobres. Los AWS KMS llaveros básicos solo admiten SDK de cifrado de AWS para Java una KMS clave. También requieren un AWS KMS cliente, lo que le da la oportunidad de configurar el cliente para Región de AWS la KMS clave.

Para crear un AWS KMS llavero con una o más llaves de embalaje, utilice un llavero múltiple. SDK de cifrado de AWS para Java Tiene un llavero especial con varios llaveros que admite una o más AWS KMS llaves y un llavero estándar con varios llaveros de cualquier tipo compatible. Algunos programadores prefieren usar un método de llaveros múltiples para crear todos sus llaveros, y este método apoya esa estrategia. SDK de cifrado de AWS para Java

SDK de cifrado de AWS para Java Proporciona llaveros básicos de una sola tecla y varios llaveros para todos los casos de uso típicos, incluidas las claves multirregionales. AWS KMS

Por ejemplo, para crear un AWS KMS llavero con una sola AWS KMS tecla, puede utilizar el método]. CreateAwsKmsKeyring()

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); // Create the keyring CreateAwsKmsKeyringInput kmsKeyringInput = CreateAwsKmsKeyringInput.builder() .kmsKeyId(keyArn) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsKeyringInput);

Para crear un llavero con una o más AWS KMS claves, utilice el CreateAwsKmsMultiKeyring() método. En este ejemplo se utilizan dos claves de KMS. Para especificar una KMS clave, utilice únicamente el generator parámetro. El msKeyIds parámetro que especifica KMS claves adicionales es opcional.

La entrada de este conjunto de claves no requiere un AWS KMS cliente. En su lugar, AWS Encryption SDK utiliza el AWS KMS cliente predeterminado para cada región representado por una KMS clave en el anillo de claves. Por ejemplo, si la KMS clave identificada por el valor del Generator parámetro se encuentra en la región EE.UU. Oeste (Oregón) (us-west-2), se AWS Encryption SDK crea un AWS KMS cliente predeterminado para la us-west-2 región. Si necesita personalizar el AWS KMS cliente, utilice el CreateAwsKmsKeyring() método.

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<String> additionalKey = Collections.singletonList("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"); // Create the keyring final CreateAwsKmsMultiKeyringInput keyringInput = CreateAwsKmsMultiKeyringInput.builder() .generator(generatorKey) .kmsKeyIds(additionalKey) .build(); final IKeyring kmsKeyring = materialProviders.CreateAwsKmsMultiKeyring(keyringInput);

SDK de cifrado de AWS para Java admite conjuntos de AWS KMS claves que utilizan cifrado simétrico (SYMMETRIC_DEFAULT) o claves RSA KMS asimétricas. AWS KMS los llaveros creados con RSA KMS claves asimétricas solo pueden contener un par de claves.

Para cifrar con un RSA AWS KMS anillo de claves asimétrico, no necesita kms: GenerateDataKey ni KMS:Encrypt, ya que debe especificar el material de clave pública que desea utilizar para el cifrado al crear el anillo de claves. No se realizan AWS KMS llamadas al cifrar con este anillo de claves. Para descifrar con un RSA AWS KMS anillo de claves asimétrico, necesita el permiso KMS:Decrypt.

Para crear un conjunto de claves asimétrico, debe proporcionar la RSA AWS KMS clave pública y la clave privada de su clave asimétrica. ARN RSA KMS La clave pública debe estar codificada. PEM En el siguiente ejemplo, se crea un AWS KMS llavero con un par de RSA claves asimétricas.

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder() // Specify algorithmSuite without asymmetric signing here // // ALG_AES_128_GCM_IV12_TAG16_NO_KDF("0x0014"), // ALG_AES_192_GCM_IV12_TAG16_NO_KDF("0x0046"), // ALG_AES_256_GCM_IV12_TAG16_NO_KDF("0x0078"), // ALG_AES_128_GCM_IV12_TAG16_HKDF_SHA256("0x0114"), // ALG_AES_192_GCM_IV12_TAG16_HKDF_SHA256("0x0146"), // ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256("0x0178") .withEncryptionAlgorithm(CryptoAlgorithm.ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); // Create a KMS RSA keyring. // This keyring takes in: // - kmsClient // - kmsKeyId: Must be an ARN representing an asymmetric RSA KMS key // - publicKey: A ByteBuffer of a UTF-8 encoded PEM file representing the public // key for the key passed into kmsKeyId // - encryptionAlgorithm: Must be either RSAES_OAEP_SHA_256 or RSAES_OAEP_SHA_1 final CreateAwsKmsRsaKeyringInput createAwsKmsRsaKeyringInput = CreateAwsKmsRsaKeyringInput.builder() .kmsClient(KmsClient.create()) .kmsKeyId(rsaKeyArn) .publicKey(publicKey) .encryptionAlgorithm(EncryptionAlgorithmSpec.RSAES_OAEP_SHA_256) .build(); IKeyring awsKmsRsaKeyring = matProv.CreateAwsKmsRsaKeyring(createAwsKmsRsaKeyringInput);

Contextos de cifrado necesarios en la versión 3.x

Con la versión 3. x de SDK de cifrado de AWS para Java, puede usar el contexto de cifrado requerido CMM para requerir contextos de cifrado en sus operaciones criptográficas. Un contexto de cifrado es un conjunto de pares de clave-valor no secretos. El contexto de cifrado se vincula criptográficamente a los datos cifrados, de tal forma que se requiere el mismo contexto de cifrado para descifrar los datos. Si utiliza el contexto de cifrado requeridoCMM, puede especificar una o más claves de contexto de cifrado necesarias (claves obligatorias) que deben incluirse en todas las llamadas de cifrado y descifrado.

nota

El contexto de cifrado necesario solo CMM es compatible con las siguientes versiones:

  • Versión 3. x del SDK de cifrado de AWS para Java

  • Versión 4. x del AWS Encryption SDK formulario. NET

  • Versión 4. x de SDK de cifrado de AWS para Python, cuando se usa con la dependencia opcional de la biblioteca de proveedores de material criptográfico (MPL).

Si cifra los datos con el contexto de cifrado requeridoCMM, solo podrá descifrarlos con una de estas versiones compatibles.

Al cifrar, AWS Encryption SDK comprueba que todas las claves de contexto de cifrado necesarias estén incluidas en el contexto de cifrado que especificó. Firma AWS Encryption SDK los contextos de cifrado que especificó. Solo los pares clave-valor que no son claves obligatorias se serializan y almacenan en texto no cifrado en el encabezado del mensaje cifrado que devuelve la operación de cifrado.

Al descifrar, debe proporcionar un contexto de cifrado que contenga todos los pares clave-valor que representan las claves necesarias. AWS Encryption SDK Utiliza este contexto de cifrado y los pares clave-valor almacenados en el encabezado del mensaje cifrado para reconstruir el contexto de cifrado original que especificó en la operación de cifrado. Si AWS Encryption SDK no se puede reconstruir el contexto de cifrado original, se produce un error en la operación de descifrado. Si proporciona un par clave-valor que contiene la clave requerida con un valor incorrecto, el mensaje cifrado no se puede descifrar. Debe proporcionar el mismo par clave-valor que se especificó al cifrar.

importante

Considere detenidamente qué valores elige para las claves requeridas en su contexto de cifrado. Debe poder volver a proporcionar las mismas claves y sus valores correspondientes al descifrar. Si no puede reproducir las claves requeridas, el mensaje cifrado no se podrá descifrar.

El siguiente ejemplo inicializa un conjunto de AWS KMS claves con el contexto de cifrado requerido. CMM

// Instantiate the AWS Encryption SDK final AwsCrypto crypto = AwsCrypto.builder() .withCommitmentPolicy(CommitmentPolicy.RequireEncryptRequireDecrypt) .build(); // Create your encryption context final Map<String, String> encryptionContext = new HashMap<>(); encryptionContext.put("encryption", "context"); encryptionContext.put("is not", "secret"); encryptionContext.put("but adds", "useful metadata"); encryptionContext.put("that can help you", "be confident that"); encryptionContext.put("the data you are handling", "is what you think it is"); // Create a list of required encryption contexts final List<String> requiredEncryptionContextKeys = Arrays.asList("encryption", "context"); // Create the keyring final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsKeyringInput keyringInput = CreateAwsKmsKeyringInput.builder() .kmsKeyId(keyArn) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(keyringInput); // Create the required encryption context CMM ICryptographicMaterialsManager cmm = materialProviders.CreateDefaultCryptographicMaterialsManager( CreateDefaultCryptographicMaterialsManagerInput.builder() .keyring(kmsKeyring) .build() ); ICryptographicMaterialsManager requiredCMM = materialProviders.CreateRequiredEncryptionContextCMM( CreateRequiredEncryptionContextCMMInput.builder() .requiredEncryptionContextKeys(requiredEncryptionContextKeys) .underlyingCMM(cmm) .build() );