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 conSDK de cifrado de AWS para Java, consulte el aws-encryption-sdk-java
Requisitos previos
Antes de instalar el SDK de cifrado de AWS para Java, asegúrese de que cumpla 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 la página de descargas de Java SE
y, a continuación, descargue e instale el Java SE Development Kit (JDK). Si utiliza el JDK de Oracle, también debe descargar e instalar los archivos de políticas de jurisdicción de seguridad ilimitada de la extensión de criptografía de Java (JCE)
. - Bouncy Castle
-
SDK de cifrado de AWS para Java requiere Bouncy Castle
. -
Las versiones 1.6.1 y posteriores del SDK de cifrado de AWS para Java usan Bouncy Castle para serializar y deserializar objetos criptográficos. Puede utilizar Bouncy Castle o Bouncy Castle FIPS
para cumplir este requisito. Para obtener ayuda para instalar y configurar Bouncy Castle FIPS, consulte la documentación de BC FIPS , especialmente las guías de usuario y los archivos PDF de política de seguridad. -
Las versiones anteriores de SDK de cifrado de AWS para Java usan la API de criptografía de Bouncy Castle para Java. Este requisito solo se cumple con el Bouncy Castle que no es de FIPS.
Si no dispone de Bouncy Castle, vaya a las últimas versiones de Bouncy Castle
para descargar el archivo de proveedor que corresponda a su 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 FIPS (bc-fips). -
- AWS SDK for Java
-
Versión 3. x de los SDK de cifrado de AWS para Java requiere elAWS 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 laAWS SDK for Java. Sin embargo, el 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 SDKel código AWS SDK for Java 1.x y 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 más información sobre cómo actualizar su versión de AWS Encryption SDK, consulte Migración de su AWS Encryption SDK. Al actualizar el código del SDK de cifrado de AWS para Java del AWS SDK for Java 1.x a AWS SDK for Java 2.x, sustituya las referencias a la interfaz de
AWSKMS
en el AWS SDK for Java 1.x por las referencias a la interfaz deKmsClient
en el AWS SDK for Java 2.x. El SDK de cifrado de AWS para Java no es compatible con la interfaz de KmsAsyncClient
.Además, actualice el código para usar los objetos relacionados al AWS KMS en el espacio de nombres kmssdkv2
, en lugar del espacio de nombreskms
.Para instalar AWS SDK for Java, use Apache Maven.
-
Para importar todo AWS SDK for Java como una dependencia declárelo en el archivo
pom.xml
. -
Para crear una dependencia solo para el módulo AWS KMS en AWS SDK for Java 1.x, siga las instrucciones para especificar módulos concretos y establezca el
artifactId
enaws-java-sdk-kms
. -
Para crear una dependencia solo para el módulo AWS KMS en AWS SDK for Java 2.x, siga las instrucciones para especificar módulos concretos. Establezca el
groupId
asoftware.amazon.awssdk
y elartifactId
akms
.
Para ver más cambios, consulte las diferencias entre la versión AWS SDK for Java 1.x y la 2.x en la Guía para AWS SDK for Java 2.x 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 están en 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, se introdujeron nuevas funciones de seguridad en la versión 2.0x, que 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 más información, consulte Migrar su AWS Encryption SDK.
Puede instalar el SDK de cifrado de AWS para Java de una de las siguientes maneras:
- Manualmente
-
Para instalar el repositorioSDK de cifrado de AWS para Java, clone o descargue el aws-encryption-sdk-java
GitHubrepositorio. - Con Apache Maven
-
El SDK de cifrado de AWS para Java está disponible a través de Apache Maven
con la siguiente definición de dependencias. <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-encryption-sdk-java</artifactId> <version>3.0.0</version> </dependency>
Después de instalar el SDK, comience consultando el ejemplo de código Java de esta guía y el Javadoc
AWS KMSllaveros 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 anillos de claves básicos solo SDK de cifrado de AWS para Java requieren una clave KMS. También requieren un cliente de AWS KMS, lo que le da la oportunidad de configurar el cliente para Región de AWS de la clave KMS.
Para crear un llavero de AWS KMS con una o más claves de empaquetado, utilice un llavero múltiple. SDK de cifrado de AWS para JavaTiene un llavero especial con varios llaveros que admite una o más AWS KMS teclas 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 JavaProporciona 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 claves de AWS KMS, utilice el método CreateAwsKmsMultiKeyring()
. En este ejemplo, se utilizan dos claves KMS. Para especificar una clave KMS, utilice solo el parámetro generator
. El parámetro msKeyIds
que especifica claves KMS adicionales es opcional.
La entrada de este llavero no requiere un cliente de AWS KMS. En su lugar, AWS Encryption SDK utiliza el cliente de AWS KMS predeterminado para cada región representado por una clave KMS en el llavero. Por ejemplo, si la clave KMS identificada por el valor del parámetro Generator
se encuentra en la región Oeste de EE. UU. (Oregón) (us-west-2
), la AWS Encryption SDK crea un cliente de AWS KMS predeterminado para la región us-west-2
. Si necesita personalizar el cliente de AWS KMS, utilice 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(); 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 = matProv.CreateAwsKmsMultiKeyring(keyringInput);
SDK de cifrado de AWS para Javaadmite conjuntos de AWS KMS claves que utilizan cifrado simétrico (SYMMETRIC_DEFAULT
) o claves RSA KMS asimétricas. AWS KMSlos llaveros creados con claves asimétricas de RSA KMS solo pueden contener un par de claves.
Para cifrar con un AWS KMS anillo de claves RSA asimétrico, no necesita kms: GenerateDataKey ni KMS:Encrypt porque debe especificar el material de clave pública que quiere usar para el cifrado al crear el anillo de claves. No se realizan llamadas a AWS KMS al cifrar con este llavero. Para descifrar con un llavero RSA asimétrico de AWS KMS, necesita el permiso kms:Decrypt.
Para crear un llavero RSA asimétrico de AWS KMS, debe proporcionar la clave pública y el ARN de clave privada de su clave RSA KMS asimétrica. La clave pública debe estar codificada con PEM. En el ejemplo siguiente se crea un llavero de AWS KMS con un par de claves RSA 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 deSDK de cifrado de AWS para Java, puede utilizar el contexto de cifrado CMM requerido para requerir los 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. Cuando utiliza el contexto de cifrado CMM requerido, puede especificar una o más claves de contexto de cifrado obligatorias (claves obligatorias) que deben incluirse en todas las llamadas de cifrado y descifrado.
nota
El contexto de cifrado requerido, CMM, solo es interoperable con la versión 4. x del AWS Encryption SDK para .NET. No es interoperable con ninguna otra implementación de lenguaje de programación. Si cifra los datos mediante el contexto de cifrado CMM requerido, solo podrá descifrarlos con la versión 3. x de la SDK de cifrado de AWS para Java o la versión 4. x de AWS Encryption SDK para .NET.
Al cifrar, la AWS Encryption SDK comprueba que todas las claves de contexto de cifrado necesarias estén incluidas en el contexto de cifrado que especificó. La AWS Encryption SDK firma 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. La 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 la AWS Encryption SDK no 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 llavero de AWS KMS con el contexto de cifrado CMM obligatorio.
// 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() );