

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 JavaScript
<a name="javascript"></a>

 SDK de cifrado de AWS para JavaScript Está diseñado para proporcionar una biblioteca de cifrado del lado del cliente para los desarrolladores que escriben aplicaciones de navegador web JavaScript o aplicaciones de servidor web en Node.js.

Como todas las implementaciones del AWS Encryption SDK, SDK de cifrado de AWS para JavaScript ofrece funciones avanzadas de protección de datos. Esto incluye el [cifrado de sobre](concepts.md#envelope-encryption), la información autenticada adicional (AAD) y los [conjuntos de algoritmos](concepts.md#crypto-algorithm) de clave simétrica autenticados y seguros, tales como AES-GCM de 256 bits con derivación de clave y firma.

Todas las implementaciones específicas del idioma AWS Encryption SDK están diseñadas para ser interoperables, sujetas a las limitaciones del idioma. Para obtener más información sobre las restricciones lingüísticas, consulte. JavaScript [Compatibilidad del SDK de cifrado de AWS para JavaScript](javascript-compatibility.md)

**Más información**
+ Para obtener más información sobre la programación con SDK de cifrado de AWS para JavaScript, consulte el [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)repositorio en GitHub.
+ Para ver ejemplos de programación, consulte [SDK de cifrado de AWS para JavaScript ejemplos](js-examples.md) los módulos [example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser) y [example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) del repositorio. [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 
+  Para ver un ejemplo práctico del uso del código SDK de cifrado de AWS para JavaScript para cifrar datos en una aplicación web, consulte [Cómo habilitar el cifrado en un navegador con el archivo Node.js en el SDK de cifrado de AWS para JavaScript blog](https://aws.amazon.com/blogs/security/how-to-enable-encryption-browser-aws-encryption-sdk-javascript-node-js/) de seguridad. AWS 

**Topics**
+ [Compatibilidad](javascript-compatibility.md)
+ [Instalación](javascript-installation.md)
+ [Módulos](javascript-modules.md)
+ [Ejemplos](js-examples.md)

# Compatibilidad del SDK de cifrado de AWS para JavaScript
<a name="javascript-compatibility"></a>

 SDK de cifrado de AWS para JavaScript Está diseñado para ser interoperable con las implementaciones de otros idiomas del. AWS Encryption SDK[En la mayoría de los casos, puede cifrar los datos SDK de cifrado de AWS para JavaScript y descifrarlos con cualquier implementación en otro idioma, incluida la AWS Encryption SDK interfaz de línea de comandos.](crypto-cli.md) Y puede utilizarla SDK de cifrado de AWS para JavaScript para descifrar los [mensajes cifrados](concepts.md#message) producidos por las implementaciones del en otros idiomas. AWS Encryption SDK

Sin embargo, cuando utilice el SDK de cifrado de AWS para JavaScript, debe tener en cuenta algunos problemas de compatibilidad en la implementación del JavaScript idioma y en los navegadores web.

Además, cuando utilice implementaciones de lenguaje diferentes, asegúrese de configurar proveedores de claves maestras, claves maestras y conjuntos de claves compatibles. Para obtener más información, consulte [Compatibilidad de conjuntos de claves](choose-keyring.md#keyring-compatibility).

## SDK de cifrado de AWS para JavaScript compatibilidad
<a name="javascript-language-compatibility"></a>

La JavaScript implementación de la AWS Encryption SDK se diferencia de las implementaciones de otros lenguajes en los siguientes aspectos:
+ La operación de cifrado del SDK de cifrado de AWS para JavaScript no devuelve texto cifrado no enmarcado. Sin embargo, SDK de cifrado de AWS para JavaScript descifrará el texto cifrado enmarcado y no enmarcado devuelto por las implementaciones del. AWS Encryption SDK
+ A partir de Node.js versión 12.9.0, Node.js admite las siguientes opciones de encapsulamiento de claves de RSA:
  + OAEP con,, o SHA1 SHA256 SHA384 SHA512
  + OAEP con y con SHA1 MGF1 SHA1
  + PKCS1v15
+ Antes de la versión 12.9.0, Node.js admitía las siguientes opciones de encapsulamiento de claves de RSA:
  + OAEP con y con SHA1 MGF1 SHA1
  + PKCS1v15

## Compatibilidad del navegador
<a name="javascript-browser-compatibility"></a>

Algunos navegadores web no admiten operaciones criptográficas básicas que el SDK de cifrado de AWS para JavaScript requiere. Puede compensar algunas de las operaciones faltantes configurando una alternativa para la WebCrypto API que implementa el navegador.

**Limitaciones del explorador web**

Las siguientes limitaciones son comunes a todos los navegadores web:
+ La WebCrypto API no admite el empaquetado de PKCS1v15 claves.
+ Los navegadores no admiten claves de 192 bits.

**Operaciones criptográficas requeridas**

 SDK de cifrado de AWS para JavaScript Requiere las siguientes operaciones en los navegadores web. Si un navegador no las admite, es incompatible con el SDK de cifrado de AWS para JavaScript.
+ El navegador debe incluir `crypto.getRandomValues()`, que es un método para generar valores criptográficamente aleatorios. Para obtener información sobre las versiones de navegadores web compatibles`crypto.getRandomValues()`, consulte [¿Puedo usar criptomonedas? getRandomValues()?](https://caniuse.com/#feat=getrandomvalues) .

**Reserva obligatoria**

 SDK de cifrado de AWS para JavaScript Requiere las siguientes bibliotecas y operaciones en los navegadores web. Si admite un navegador web que no cumple estos requisitos, debe configurar una reserva. De lo contrario, los intentos de SDK de cifrado de AWS para JavaScript utilizarla con el navegador fallarán.
+ La WebCrypto API, que realiza operaciones criptográficas básicas en aplicaciones web, no está disponible para todos los navegadores. Para obtener información acerca de las versiones del explorador web que admiten la criptografía web, vea [¿Puedo utilizar criptografía web?](https://caniuse.com/#feat=cryptography).
+ Las versiones modernas del navegador web Safari no admiten el cifrado AES-GCM de cero bytes, que sí es obligatorio. AWS Encryption SDK Si el navegador implementa la WebCrypto API, pero no puede usar AES-GCM para cifrar cero bytes, SDK de cifrado de AWS para JavaScript utiliza la biblioteca alternativa solo para el cifrado de cero bytes. Utiliza la API para todas las demás operaciones. WebCrypto 

Para configurar una reserva para cualquiera de las limitaciones, agregue las instrucciones siguientes al código. En la función [configureFallback](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/web-crypto-backend/src/backend-factory.ts#L78), especifique una biblioteca que admita las características que faltan. En el siguiente ejemplo, se utiliza la biblioteca de JavaScript criptografía de Microsoft Research (`msrcrypto`), pero puede sustituirla por una biblioteca compatible. Para ver un ejemplo completo, consulte [fallback.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-browser/src/fallback.ts).

```
import { configureFallback } from '@aws-crypto/client-browser'
configureFallback(msrCrypto)
```

# Instalación del SDK de cifrado de AWS para JavaScript
<a name="javascript-installation"></a>

 SDK de cifrado de AWS para JavaScript Consiste en una colección de módulos interdependientes. Varios de los módulos son solo colecciones de módulos diseñados para trabajar juntos. Algunos módulos están diseñados para funcionar de forma independiente. Unos cuantos módulos son de uso obligatorio en todas las implementaciones; mientras que otros solo se usan en casos especiales. Para obtener información sobre los módulos del AWS Encryption SDK formulario JavaScript, consulte [Módulos del SDK de cifrado de AWS para JavaScript](javascript-modules.md) y el `README.md` archivo de cada uno de los módulos del [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules)repositorio en GitHub.

**nota**  
Todas las versiones SDK de cifrado de AWS para JavaScript anteriores a la 2.0.0 están en [end-of-supportfase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle).  
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 JavaScript sin cambios en el código ni en los datos. Sin embargo, [nuevas características de seguridad](about-versions.md#version-2) 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 SDK de cifrado de AWS para JavaScript. Para obtener más información, consulte [Migrando su AWS Encryption SDK](migration.md).

Para instalar los módulos, utilice el [administrador de paquetes npm](https://www.npmjs.com/get-npm). 

Por ejemplo, para instalar el `client-node` módulo, que incluye todos los módulos que necesita programar con el SDK de cifrado de AWS para JavaScript archivo Node.js, utilice el siguiente comando. 

```
npm install @aws-crypto/client-node
```

Para instalar el `client-browser` módulo, que incluye todos los módulos que necesite programar SDK de cifrado de AWS para JavaScript en el navegador, utilice el siguiente comando. 

```
npm install @aws-crypto/client-browser
```

Para ver ejemplos prácticos de cómo utilizar el SDK de cifrado de AWS para JavaScript, consulte los ejemplos de los `example-browser` módulos `example-node` y del [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)repositorio correspondiente GitHub.

# Módulos del SDK de cifrado de AWS para JavaScript
<a name="javascript-modules"></a>

Los módulos del SDK de cifrado de AWS para JavaScript facilitan la instalación del código que necesita para sus proyectos.

## Módulos para JavaScript Node.js
<a name="jsn-modules-node"></a>

[client-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/client-node)  
Incluye todos los módulos que necesita para programar con Node.js. SDK de cifrado de AWS para JavaScript 

[caching-materials-manager-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/caching-materials-manager-node)  
Exporta las funciones que admiten la función de almacenamiento en [caché de claves de datos](data-key-caching.md) de SDK de cifrado de AWS para JavaScript Node.js. 

[decrypt-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/decrypt-node)  
Exporta funciones que descifran y verifican mensajes cifrados que representan datos y flujo de datos. Incluido en el módulo `client-node`.

[encrypt-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/encrypt-node)  
Exporta funciones que cifran y firman diferentes tipos de datos. Incluido en el módulo `client-node`.

[example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node)  
Exporta ejemplos prácticos de programación con Node.js. SDK de cifrado de AWS para JavaScript Incluye ejemplos de diferentes tipos de conjuntos de claves y diferentes tipos de datos.

[hkdf-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/hkdf-node)  
Exporta una [función de derivación de claves (HKDF) basada en HMAC](https://en.wikipedia.org/wiki/HKDF) que se utiliza SDK de cifrado de AWS para JavaScript en Node.js en determinados conjuntos de algoritmos. SDK de cifrado de AWS para JavaScript En el navegador, utiliza la función HKDF nativa de la API. WebCrypto 

[integration-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/integration-node)  
Define las pruebas que comprueban que SDK de cifrado de AWS para JavaScript el archivo Node.js es compatible con las implementaciones en otros idiomas del. AWS Encryption SDK

[kms-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring-node)  
Exporta las funciones que admiten los AWS KMS llaveros en Node.js.

[raw-aes-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-aes-keyring-node)  
Exporta funciones que admiten [conjuntos de claves de AES sin formato](use-raw-aes-keyring.md) en Node.js.

[raw-rsa-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-rsa-keyring-node)  
Exporta funciones que admiten [conjuntos de claves de RSA sin formato](use-raw-rsa-keyring.md) en Node.js.

## Módulos para navegador JavaScript
<a name="jsn-modules-browser"></a>

[client-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/client-browser)  
Incluye todos los módulos que necesitas para programar con ellos SDK de cifrado de AWS para JavaScript en el navegador.

[caching-materials-manager-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/caching-materials-manager-browser)  
Exporta las funciones que admiten la función de almacenamiento JavaScript en [caché de claves de datos](data-key-caching.md) del navegador.

[decrypt-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/decrypt-browser)  
Exporta funciones que descifran y verifican mensajes cifrados que representan datos y flujo de datos.

[encrypt-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/encrypt-browser)  
Exporta funciones que cifran y firman diferentes tipos de datos. 

[example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser)  
Ejemplos prácticos de programación con SDK de cifrado de AWS para JavaScript el navegador. Incluye ejemplos de diferentes tipos de conjuntos de claves y diferentes tipos de datos.

[integration-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/integration-browser)  
Define las pruebas que verifican que el SDK de cifrado de AWS para Java script del navegador es compatible con las implementaciones en otros lenguajes del AWS Encryption SDK.

[kms-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring-browser)  
Exporta funciones que admiten [conjuntos de claves de AWS KMS](use-kms-keyring.md) en el navegador.

[raw-aes-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-aes-keyring-browser)  
Exporta funciones que admiten [conjuntos de claves de AES sin formato](use-raw-aes-keyring.md) en el navegador.

[raw-rsa-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-rsa-keyring-browser)  
Exporta funciones que admiten [conjuntos de claves de RSA sin formato](use-raw-rsa-keyring.md) en el navegador.

## Módulos para todas las implementaciones
<a name="jsn-modules-all"></a>

[cache-material](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/cache-material)  
Admite la característica de [almacenamiento en caché de claves de datos](data-key-caching.md). Proporciona código para ensamblar los materiales criptográficos que se almacenan en caché con cada clave de datos.

[kms-keyring](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring)  
Exporta funciones que admiten [conjuntos de claves KMS](use-kms-keyring.md).

[material-management](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/material-management)  
Implementa el [administrador de materiales criptográficos](concepts.md#crypt-materials-manager) (CMM).

[raw-keyring](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-keyring)  
Exporta funciones necesarias para los conjuntos de claves de AES y RSA sin formato.

[serialize](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/serialize)  
Exporta funciones que el SDK utiliza para serializar su salida.

[web-crypto-backend](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/web-crypto-backend)  
Exporta las funciones que utilizan la WebCrypto API SDK de cifrado de AWS para JavaScript del navegador.

# SDK de cifrado de AWS para JavaScript ejemplos
<a name="js-examples"></a>

En los siguientes ejemplos se muestra cómo utilizar el SDK de cifrado de AWS para JavaScript para cifrar y descifrar datos. 

Puedes encontrar más ejemplos de su uso SDK de cifrado de AWS para JavaScript en los módulos [example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) y [example-browser del repositorio](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser) de. [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) GitHub Estos módulos de ejemplo no se instalan al instalar los módulos `client-browser` o `client-node`.

**Consulte los ejemplos de código completos**: Nodo: [kms\$1simple.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-node/src/kms_simple.ts), Navegador: [kms\$1simple.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-browser/src/kms_simple.ts)

**Topics**
+ [

## Cifrar datos con un anillo de claves AWS KMS
](#javascript-example-encrypt)
+ [

## Descifrar datos con un anillo de claves AWS KMS
](#javascript-example-decrypt)

## Cifrar datos con un anillo de claves AWS KMS
<a name="javascript-example-encrypt"></a>

En el siguiente ejemplo, se muestra cómo utilizar el SDK de cifrado de AWS para JavaScript para cifrar y descifrar una cadena corta o una matriz de bytes. 

Este ejemplo incluye un [AWS KMS anillo de claves](use-kms-keyring.md), un tipo de anillo de claves que utiliza un AWS KMS key para generar y cifrar claves de datos. *Si necesitas ayuda para crear una AWS KMS key, consulta la sección [Creación de claves](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) en la AWS Key Management Service Guía para desarrolladores.* Para obtener ayuda para identificarlas AWS KMS keys en un AWS KMS llavero, consulte [Identificarse AWS KMS keys en un AWS KMS llavero](use-kms-keyring.md#kms-keyring-id)

Paso 1: Establece la política de compromiso.  
A partir de la versión 1.7. *x* del SDK de cifrado de AWS para JavaScript, puede establecer la política de compromiso al llamar a la nueva `buildClient` función que crea una instancia de un AWS Encryption SDK cliente. La función `buildClient` toma un valor enumerado que representa su política de compromiso. Devuelve funciones actualizadas `encrypt` y `decrypt` que hacen cumplir su política de compromiso al cifrar y descifrar.  
En los siguientes ejemplos, se utiliza la `buildClient` función para especificar la [política de compromiso predeterminada](migrate-commitment-policy.md),. `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](configure.md#config-limit-keys).  

```
import {
  KmsKeyringBrowser,
  KMS,
  getClient,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-browser'

const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

```
import {
  KmsKeyringNode,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-node'
                                
const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

Paso 2: crear el conjunto de claves.  
Cree un conjunto de AWS KMS claves para el cifrado.   
Al cifrar con un AWS KMS anillo de claves, debe especificar una *clave generadora*, es decir, una AWS KMS key que se utilice para generar la clave de datos en texto plano y cifrarla. También puede especificar cero o más *claves adicionales* que cifren la misma clave de datos en texto no cifrado. El anillo de claves devuelve la clave de datos en texto plano y una copia cifrada de esa clave de datos para cada AWS KMS key uno de los componentes del conjunto de claves, incluida la clave generadora. Para descifrar los datos, debe descifrar cualquiera de las claves de datos cifradas.  
Para especificar el AWS KMS keys anillo de claves de cifrado en SDK de cifrado de AWS para JavaScript, puede utilizar [cualquier](use-kms-keyring.md#kms-keyring-id) identificador de clave compatible. AWS KMS En este ejemplo se utiliza una clave generadora, que se identifica mediante su [ARN de alias](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-alias-ARN) y una clave adicional, que se identifica mediante un [ARN de clave](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN).  
Si piensa reutilizar el AWS KMS anillo de claves para descifrar, debe utilizar la clave para ARNs identificarlo AWS KMS keys en el anillo de claves.
Antes de ejecutar este código, sustituya los identificadores de ejemplo por AWS KMS key identificadores válidos. Debe tener los [permisos necesarios para usar el AWS KMS keys](use-kms-keyring.md#kms-keyring-permissions) en el conjunto de claves.  
Comience por proporcionar sus credenciales al navegador. [Los SDK de cifrado de AWS para JavaScript ejemplos utilizan el paquete web. DefinePlugin](https://webpack.js.org/plugins/define-plugin/), que reemplaza las constantes de las credenciales por las credenciales reales. También puede usar cualquier otro método para proporcionar sus credenciales. A continuación, utilice las credenciales para crear un AWS KMS cliente.  

```
declare const credentials: {accessKeyId: string, secretAccessKey:string, sessionToken:string }

const clientProvider = getClient(KMS, {
  credentials: {
    accessKeyId,
    secretAccessKey,
    sessionToken
  }
})
```
A continuación, especifique AWS KMS keys la clave del generador y la clave adicional. A continuación, cree un AWS KMS conjunto de claves con el AWS KMS cliente y el AWS KMS keys.  

```
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/EncryptDecrypt'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds })
```

```
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/EncryptDecrypt'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringNode({ generatorKeyId, keyIds })
```

Paso 3: Defina el contexto de cifrado.  
Un [contexto de cifrado](concepts.md#encryption-context) son datos autenticados adicionales que son arbitrarios y no son secretos. Al proporcionar un contexto de cifrado al cifrar, este vincula AWS Encryption SDK criptográficamente el contexto de cifrado al texto cifrado, de modo que se requiere el mismo contexto de cifrado para descifrar los datos. El uso de un contexto de cifrado es opcional, pero es una práctica recomendada que le aconsejamos.  
Cree un objeto simple que incluya los pares de contexto de cifrado. La clave y el valor de cada par deben ser una cadena.  

```
const context = {
  stage: 'demo',
  purpose: 'simple demonstration app',
  origin: 'us-west-2'
}
```

```
const context = {
  stage: 'demo',
  purpose: 'simple demonstration app',
  origin: 'us-west-2'
}
```

Paso 4: Cifra los datos.  
Para cifrar los datos en texto no cifrado, llame a la función `encrypt`. Introduzca el conjunto de AWS KMS claves, los datos en texto plano y el contexto de cifrado.  
La función `encrypt` devuelve un [mensaje cifrado](concepts.md#message) (`result`) que contiene los datos cifrados, las claves de datos cifradas y los metadatos importantes, como el contexto de cifrado y la firma.  
Puede [descifrar este mensaje cifrado](#javascript-example-decrypt) utilizando cualquier lenguaje AWS Encryption SDK de programación compatible.  

```
const plaintext = new Uint8Array([1, 2, 3, 4, 5])

const { result } = await encrypt(keyring, plaintext, { encryptionContext: context })
```

```
const plaintext = 'asdf'

const { result } = await encrypt(keyring, plaintext, { encryptionContext: context })
```

## Descifrar datos con un anillo de claves AWS KMS
<a name="javascript-example-decrypt"></a>

Puede usarlo SDK de cifrado de AWS para JavaScript para descifrar el mensaje cifrado y recuperar los datos originales.

En este ejemplo, desciframos los datos que hemos cifrado en el ejemplo [Cifrar datos con un anillo de claves AWS KMS](#javascript-example-encrypt).

Paso 1: Establece la política de compromiso.  
A partir de la versión 1.7. *x* del SDK de cifrado de AWS para JavaScript, puede establecer la política de compromiso al llamar a la nueva `buildClient` función que crea una instancia de un AWS Encryption SDK cliente. La función `buildClient` toma un valor enumerado que representa su política de compromiso. Devuelve funciones actualizadas `encrypt` y `decrypt` que hacen cumplir su política de compromiso al cifrar y descifrar.  
En los siguientes ejemplos, se utiliza la `buildClient` función para especificar la [política de compromiso predeterminada](migrate-commitment-policy.md),. `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](configure.md#config-limit-keys).  

```
import {
  KmsKeyringBrowser,
  KMS,
  getClient,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-browser'

const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

```
import {
  KmsKeyringNode,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-node'
                                
const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

Paso 2: crear el conjunto de claves.  
Para descifrar los datos, pase el [mensaje cifrado](concepts.md#message) (`result`) que la función `encrypt` ha devuelto. El mensaje cifrado contiene los datos cifrados, las claves de datos cifradas y metadatos importantes, como el contexto de cifrado y la firma.  
También debe especificar un [conjunto de claves de AWS KMS](use-kms-keyring.md) al descifrar. Puede utilizar el mismo conjunto de claves que se utilizó para cifrar los datos u otro conjunto de claves. Para tener éxito, al menos una AWS KMS key de las claves de descifrado debe poder descifrar una de las claves de datos cifradas del mensaje cifrado. Dado que no se generan claves de datos, no es necesario especificar una clave generadora en un conjunto de claves de descifrado. Si lo hace, la clave generadora y las claves adicionales se tratarán de la misma manera.  
Para especificar un AWS KMS key anillo de claves de descifrado en SDK de cifrado de AWS para JavaScript, debe utilizar la clave [ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN). De lo contrario, no AWS KMS key se reconoce. Si necesita ayuda para identificarlo AWS KMS keys en un AWS KMS llavero, consulte [Identificarse AWS KMS keys en un AWS KMS llavero](use-kms-keyring.md#kms-keyring-id)  
Si utiliza el mismo anillo de claves para cifrar y descifrar, utilice la clave ARNs para identificar el AWS KMS keys conjunto de claves.
En este ejemplo, creamos un anillo de claves que incluye solo uno de los del anillo de claves de AWS KMS keys cifrado. Antes de ejecutar este código, reemplace el ARN de clave de ejemplo por uno válido. Debe tener permiso de `kms:Decrypt` sobre la AWS KMS key.  
Comience por proporcionar sus credenciales al navegador. [Los SDK de cifrado de AWS para JavaScript ejemplos utilizan el paquete web. DefinePlugin](https://webpack.js.org/plugins/define-plugin/), que reemplaza las constantes de las credenciales por las credenciales reales. También puede usar cualquier otro método para proporcionar sus credenciales. A continuación, utilice las credenciales para crear un AWS KMS cliente.  

```
declare const credentials: {accessKeyId: string, secretAccessKey:string, sessionToken:string }

const clientProvider = getClient(KMS, {
  credentials: {
    accessKeyId,
    secretAccessKey,
    sessionToken
  }
})
```
A continuación, cree un conjunto de AWS KMS claves con el AWS KMS cliente. En este ejemplo, se utiliza solo una de las del AWS KMS keys anillo de claves de cifrado.  

```
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringBrowser({ clientProvider, keyIds })
```

```
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringNode({ keyIds })
```

Paso 3: Descifrar los datos.  
A continuación, llame a la función `decrypt`. Pase el conjunto de claves de descifrado que acaba de crear (`keyring`) y el [mensaje cifrado](concepts.md#message) que la función `encrypt` ha devuelto (`result`). AWS Encryption SDK Utiliza el anillo de claves para descifrar una de las claves de datos cifradas. Luego, usa la clave de datos en texto no cifrado para descifrar los datos.  
Si la llamada se realiza correctamente, el campo `plaintext` contiene los datos en texto no cifrado (descifrado). El campo `messageHeader` contiene metadatos sobre el proceso de descifrado, como el contexto de cifrado que se ha utilizado para descifrar los datos.  

```
const { plaintext, messageHeader } = await decrypt(keyring, result)
```

```
const { plaintext, messageHeader } = await decrypt(keyring, result)
```

Paso 4: Verificar el contexto de cifrado.  
El [contexto de cifrado](concepts.md#encryption-context) utilizado para descifrar los datos se incluye en el encabezado del mensaje (`messageHeader`) que la función `decrypt` devuelve. Antes de que la aplicación devuelva los datos en texto no cifrado, compruebe que el contexto de cifrado que proporcionó durante el cifrado esté incluido en el contexto de cifrado que se utilizó al descifrar. Una discrepancia podría indicar que se han manipulado los datos o que no ha descifrado el texto cifrado correcto.  
Al verificar el contexto de cifrado, no requiere una coincidencia exacta. Cuando se utiliza un algoritmo de cifrado con la firma, el [administrador de materiales criptográficos](concepts.md#crypt-materials-manager) (CMM) agrega la clave de firma pública al contexto de cifrado antes de cifrar el mensaje. Pero todos los pares de contexto de cifrado que ha enviado tienen que estar incluidos en el contexto de cifrado devuelto.  
Primero, obtenga el contexto de cifrado del encabezado del mensaje. Luego compruebe que cada par clave-valor del contexto de cifrado original (`context`) coincida con un par clave-valor en el contexto de cifrado devuelto (`encryptionContext`).  

```
const { encryptionContext } = messageHeader

Object
  .entries(context)
  .forEach(([key, value]) => {
    if (encryptionContext[key] !== value) throw new Error('Encryption Context does not match expected values')
})
```

```
const { encryptionContext } = messageHeader

Object
  .entries(context)
  .forEach(([key, value]) => {
    if (encryptionContext[key] !== value) throw new Error('Encryption Context does not match expected values')
})
```
Si la comprobación del contexto de cifrado se realiza correctamente, puede devolver los datos en texto no cifrado.