

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.

# Cliente de cifrado de DynamoDB antiguo
<a name="legacy-dynamodb-encryption-client"></a>

El 9 de junio de 2023, nuestra biblioteca de cifrado del lado del cliente pasó a AWS llamarse Database Encryption SDK. El SDK AWS de cifrado de bases de datos sigue siendo compatible con las versiones antiguas de DynamoDB Encryption Client. Para obtener más información sobre las distintas partes de la biblioteca de cifrado del cliente que cambiaron con el cambio de nombre, consulte [Cambio de nombre del Cliente de encriptación de Amazon DynamoDB](DDBEC-rename.md).

Para migrar a la versión más reciente de la biblioteca de cifrado del cliente de Java para DynamoDB, consulte [Migrar a la versión 3.x](ddb-java-migrate.md).

**Topics**
+ [AWS Compatibilidad con la versión SDK de cifrado de bases de datos para DynamoDB](#legacy-support)
+ [Cómo funciona el cliente de cifrado de DynamoDB](DDBEC-legacy-how-it-works.md)
+ [Conceptos del Cliente de encriptación de Amazon DynamoDB](DDBEC-legacy-concepts.md)
+ [Proveedor de materiales criptográficos](crypto-materials-providers.md)
+ [Lenguajes de programación disponibles para el Cliente de encriptación de Amazon DynamoDB](programming-languages.md)
+ [Cambiar el modelo de datos](data-model.md)
+ [Solución de problemas en la aplicación DynamoDB Encryption Client](troubleshooting.md)

## AWS Compatibilidad con la versión SDK de cifrado de bases de datos para DynamoDB
<a name="legacy-support"></a>

En los temas del capítulo Legacy, se proporciona información sobre las versiones 1. *x* —2. *x* del cliente de cifrado de DynamoDB para Java y versiones 1. *x —3*. *x* del cliente de cifrado de DynamoDB para Python.

En la siguiente tabla se enumeran los idiomas y las versiones que admiten el cifrado del cliente en Amazon DynamoDB.


| Lenguaje de programación | Versión | Fase del ciclo de vida de la versión principal del SDK | 
| --- | --- | --- | 
|  Java  |  Versiones 1. *x*  |  [End-of-Support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), efectiva en julio de 2022  | 
|  Java  |  Versiones 2. *x*  |  [Disponibilidad general](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 
|  Java  |  Versión 3.*x*  |  [Disponibilidad general](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 
|  Python  |  Versiones 1.*x*  |  [End-of-Support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), efectiva en julio de 2022  | 
|  Python  |  Versiones 2.*x*  |  [End-of-Support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), efectiva en julio de 2022  | 
|  Python  |  Versiones 3. *x*  |  [Disponibilidad general](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 

# Cómo funciona el cliente de cifrado de DynamoDB
<a name="DDBEC-legacy-how-it-works"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

El cliente de cifrado de DynamoDB está diseñado específicamente para proteger los datos que almacena en DynamoDB. Las bibliotecas incluyen implementaciones seguras que puede ampliar o utilizar sin hacer ningún cambio. La mayoría de los elementos se representan mediante elementos abstractos para que pueda crear y utilizar componentes personalizados compatibles.

**Cifrado y firma de elementos de tabla**

La esencia del cliente de cifrado de DynamoDB es un *encriptador de elementos* que cifra, firma, verifica y descifra los elementos de la tabla. Recibe información acerca de los elementos de tabla e instrucciones acerca de qué elementos hay que cifrar y firmar. Obtiene los materiales de cifrado, y las instrucciones sobre su uso, de un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) que usted selecciona y configura. 

En el siguiente diagrama, se muestra una vista general de este proceso.

![\[Cifrado y firma de elementos en el cliente de cifrado de DynamoDB\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/arch-encrypt.png)


Para cifrar y firmar un elemento de la tabla, el cliente de cifrado de DynamoDB necesita:
+ **Información acerca de la tabla. ** Obtiene información acerca de la tabla de un [contexto de cifrado de DynamoDB](concepts.md#encryption-context) que usted suministra. Algunos elementos auxiliares obtienen la información necesaria de DynamoDB y crean automáticamente el contexto de cifrado de DynamoDB para usted. 
**nota**  
El contexto de cifrado de *DynamoDB en el cliente de cifrado* de DynamoDB no está relacionado con el contexto de cifrado de () y *el*. AWS Key Management Service AWS KMS AWS Encryption SDK
+ **Los atributos que hay que cifrar y firmar.** Obtiene esta información de las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) que usted suministra.
+ **Materiales de cifrado, incluidas las claves de cifrado y firma.** Los obtiene de un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) que usted selecciona y configura. 
+ **Instrucciones para cifrar y firmar el elemento**. El CMP añade instrucciones de uso de los materiales de cifrado, incluidos los algoritmos de cifrado y firma, a la [descripción de material real](DDBEC-legacy-concepts.md#legacy-material-description).

El [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor) utiliza todos estos elementos para cifrar y firmar el elemento. El encriptador de elementos también añade dos atributos al elemento: un [atributo de descripción de material](DDBEC-legacy-concepts.md#legacy-material-description) que contiene las instrucciones de cifrado y firma (la descripción de material real) y un atributo que contiene la firma. Puede interactuar directamente con el encriptador de elementos, o puede utilizar características auxiliares que interactúan con el encriptador de elementos para implementar un comportamiento predeterminado seguro.

El resultado es un elemento de DynamoDB que contiene datos cifrados y firmados.

**Verificación y descifrado de elementos de tabla**

Estos componentes también funcionan juntos para verificar y descifrar el elemento, como se muestra en el siguiente diagrama.

![\[Verificación y descifrado de elementos en el cliente de cifrado de DynamoDB\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/arch-decrypt.png)


Para verificar y descifrar un elemento, el cliente de cifrado de DynamoDB necesita los mismos componentes, componentes con la misma configuración o componentes diseñados especialmente para descifrar los elementos, de la siguiente manera:
+ **Información acerca de la tabla** del [contexto de cifrado de DynamoDB](concepts.md#encryption-context).
+ **Qué atributos verificar y descifrar.** Los obtiene de las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions).
+ **Materiales de descifrado, incluidas las claves de verificación y descifrado**, del [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) que usted selecciona y configura.

  El elemento cifrado no incluye ningún registro del CMP que se utilizó para cifrarlo. Debe proporcionar el mismo CMP, un CMP con la misma configuración o un CMP que esté diseñado para descifrar elementos.
+ **Información acerca de cómo el elemento se cifró y firmó**, incluidos los algoritmos de cifrado y firma. El cliente los obtiene del [atributo de descripción de material](DDBEC-legacy-concepts.md#legacy-material-description) del elemento.

El [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor) utiliza todos estos elementos para verificar y descifrar el elemento. También elimina los atributos de descripción de material y firma. El resultado es un elemento de DynamoDB como texto no cifrado.

# Conceptos del Cliente de encriptación de Amazon DynamoDB
<a name="DDBEC-legacy-concepts"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En este tema se explican la terminología y los conceptos empleados en el Cliente de encriptación de Amazon DynamoDB. 

Para obtener información acerca de cómo interactúan los componentes del cliente de cifrado de DynamoDB, consulte [Cómo funciona el cliente de cifrado de DynamoDB](DDBEC-legacy-how-it-works.md).

**Topics**
+ [Proveedor de materiales criptográficos (CMP)](#concept-material-provider)
+ [Encriptadores de elementos](#item-encryptor)
+ [Acciones de atributo](#legacy-attribute-actions)
+ [Descripción de material](#legacy-material-description)
+ [Contexto de cifrado de DynamoDB](#legacy-encryption-context)
+ [Almacén de proveedores](#provider-store)

## Proveedor de materiales criptográficos (CMP)
<a name="concept-material-provider"></a>

Al implementar el cliente de cifrado de DynamoDB, una de sus primeras tareas consiste en [seleccionar un proveedor de materiales criptográficos ](crypto-materials-providers.md)(CMP) (también conocido como *proveedor de materiales de cifrado*). Esta elección determina gran parte del resto de la implementación. 

Un *proveedor de materiales criptográficos* (CMP) recopila, reúne y devuelve los materiales criptográficos que el [encriptador de elementos](#item-encryptor) utiliza para cifrar y firmar los elementos de tabla. El CMP determina los algoritmos de cifrado que se utilizarán y cómo generar y proteger las claves de cifrado y firma.

El CMP interactúa con el encriptador de elementos. El encriptador de elementos solicita materiales de cifrado o descifrado al CMP, y el CMP los devuelve al encriptador de elementos. A continuación, el encriptador de elementos utiliza los materiales criptográficos para cifrar y firmar, o para verificar y descifrar, el elemento.

Debe especificar el CMP al configurar el cliente. Puede crear un CMP personalizado compatible o utilizar uno de los muchos de CMPs la biblioteca. La mayoría CMPs están disponibles para varios lenguajes de programación. 

## Encriptadores de elementos
<a name="item-encryptor"></a>

El *encriptador de elementos* es un componente de nivel inferior que realiza operaciones criptográficas para el cliente de cifrado de DynamoDB. Solicita materiales criptográficos a un [proveedor de materiales criptográficos](#concept-material-provider) (CMP) y después utiliza los materiales que el CMP devuelve para cifrar y firmar, o para verificar y descifrar, el elemento de tabla.

Puede interactuar directamente con el encriptador de elementos o puede utilizar los elementos auxiliares proporcionados en la biblioteca. Por ejemplo, el cliente de cifrado de DynamoDB para Java incluye una clase auxiliar `AttributeEncryptor``DynamoDBMapper` que puede utilizar con , en lugar de interactuar directamente con el encriptador de elementos `DynamoDBEncryptor`. La biblioteca Python incluye las clases auxiliares `EncryptedTable`, `EncryptedClient` y `EncryptedResource` que interactúan con el encriptador de elementos por usted.

## Acciones de atributo
<a name="legacy-attribute-actions"></a>

Las *acciones de atributo* indican al encriptador de elementos qué acciones hay que realizar en cada atributo del elemento. 

Los valores de las acciones de atributo pueden ser uno de los siguientes:
+ **Encrypt and sign**: cifra el valor del atributo. Incluir el atributo (nombre y valor) en la firma del elemento.
+ **Sign only**: incluye el atributo en la firma del artículo.
+ **Do nothing**: no cifre ni firme el atributo.

Para cualquier atributo que pueda almacenar datos confidenciales, use **Encrypt and sign**. Para los atributos de clave principal (clave de partición y clave de clasificación), utilice **Sign only**. El [atributo de descripción de material](#legacy-material-description) y el atributo de firma no se firman ni se cifran. No es necesario especificar acciones para estos atributos.

Elija cuidadosamente sus acciones de atributo. En caso de duda, use **Encrypt and sign**. Una vez que haya utilizado la para proteger los elementos de la tabla, no puede cambiar la acción de un atributo sin arriesgarse a que se produzca un error de validación de firma. Para obtener más información, consulte [Cambiar el modelo de datos](data-model.md).

**aviso**  
No cifre los atributos de clave principal. Deben permanecer en texto no cifrado para que DynamoDB pueda encontrar el elemento sin realizar un examen completo de la tabla.

Si el [contexto de cifrado de DynamoDB](concepts.md#encryption-context) identifica sus atributos de clave principal, el cliente generará un error si intenta cifrarlos.

La técnica empleada para especificar las acciones de atributo es diferente para cada lenguaje de programación. También puede ser específica de las clases auxiliares que utilice.

Para obtener más información, consulte la documentación de su lenguaje de programación.
+ [Python](python-using.md#python-attribute-actions)
+ [Java](java-using.md#attribute-actions-java)

## Descripción de material
<a name="legacy-material-description"></a>

La *descripción de material* de un elemento de tabla cifrado consta de información, como los algoritmos de cifrado, acerca del cifrado y la firma del elemento de tabla. El [proveedor de materiales criptográficos](#concept-material-provider) (CMP) registra la descripción de material mientras reúne los materiales criptográficos para el cifrado y la firma. Posteriormente, cuando necesita reunir los materiales criptográficos para verificar y descifrar el elemento, utiliza la descripción de material como guía. 

En el DynamoDB Encryption Client, la descripción de material se refiere a tres elementos relacionados:

**Descripción de material solicitado**  
Algunos [proveedores de materiales criptográficos](#concept-material-provider) (CMPs) permiten especificar opciones avanzadas, como un algoritmo de cifrado. Para indicar sus opciones, añada pares de nombre y valor a la propiedad de descripción de material del [contexto de cifrado de DynamoDB](concepts.md#encryption-context) en la solicitud para cifrar un elemento de tabla. Este elemento se conoce como la *descripción de material solicitado*. Los valores válidos de la descripción de material solicitado los define el CMP elegido.   
Puesto que la descripción de material puede anular valores predeterminados seguros, le recomendamos que omita la descripción de material solicitado a menos que tenga una razón de peso para utilizarla.

**Descripción de material real**  
La descripción del material que devuelven los [proveedores de materiales criptográficos](#concept-material-provider) (CMPs) se conoce como descripción del *material real*. Describe los valores reales que el CMP utilizó cuando reunió los materiales criptográficos. Por lo general, consiste en la descripción de material solicitado, si se utiliza, con algunos cambios y adiciones.

**Atributo de descripción de material**  
El cliente guarda la descripción de material real en el *atributo de descripción de material* del elemento cifrado. El nombre del atributo de descripción de material es `amzn-ddb-map-desc` y su valor es la descripción de material real. El cliente utiliza los valores del atributo de descripción de material para verificar y descifrar el elemento.

## Contexto de cifrado de DynamoDB
<a name="legacy-encryption-context"></a>

El *contexto de cifrado de DynamoDB* proporciona información acerca de la tabla y el elemento al [proveedor de materiales criptográficos](#concept-material-provider) (CMP). En las implementaciones avanzadas, el contexto de cifrado de DynamoDB puede incluir una [descripción del material solicitado](#legacy-material-description).

Al cifrar elementos de tabla, el contexto de cifrado de DynamoDB está enlazado criptográficamente a los valores de atributo cifrados. Al descifrar, si el contexto de cifrado de no es una coincidencia exacta que distingue mayúsculas de minúsculas para el contexto de cifrado de DynamoDB utilizado para cifrar, se produce un error en la operación de descifrado. Si interactúa directamente con el [cifrado de elementos](#item-encryptor) debe proporcionar un contexto de cifrado de DynamoDB cuando llame a un método de cifrado o descifrado. La mayoría de los elementos auxiliares crean automáticamente el contexto de cifrado de DynamoDB.

**nota**  
El contexto de cifrado de *DynamoDB en el cliente de cifrado* de DynamoDB no está relacionado con el contexto de cifrado de () y *el*. AWS Key Management Service AWS KMS AWS Encryption SDK

El contexto de cifrado de DynamoDB puede incluir los siguientes campos. Todos los campos y valores son opcionales.
+ Nombre de la tabla
+ Nombre de la clave de partición
+ Nombre de la clave de clasificación
+ Pares de nombre y valor de los atributos
+ [Descripción de material solicitado](#legacy-material-description)

## Almacén de proveedores
<a name="provider-store"></a>

Un *almacén de proveedores* es un componente que devuelve los proveedores de materiales [criptográficos](#concept-material-provider) (). CMPs El almacén del proveedor puede crearlos CMPs u obtenerlos de otra fuente, como otro almacén del proveedor. El almacén del proveedor guarda las versiones CMPs que crea en un almacenamiento persistente en el que cada CMP almacenado se identifica mediante el nombre del material del solicitante y el número de versión. 

El [proveedor más reciente](most-recent-provider.md) del cliente de cifrado de DynamoDB lo obtiene CMPs de un almacén de proveedores, pero puede utilizarlo para CMPs suministrar a cualquier componente. Cada proveedor más reciente está asociado a un almacén de proveedores, pero un almacén de proveedores puede abastecer CMPs a muchos solicitantes en varios hosts.

La tienda del proveedor crea nuevas versiones de CMPs On Demand y devuelve las versiones nuevas y las existentes. También devuelve el número de versión más reciente de un nombre de material determinado. De esta forma, el solicitante puede saber cuándo el almacén de proveedores tiene una nueva versión de su CMP que puede solicitar.

El cliente de cifrado de DynamoDB incluye [ MetaStore](most-recent-provider.md#about-metastore)un, que es un almacén de proveedores que crea CMPs Wrapped con claves que se almacenan en DynamoDB y se cifran mediante un cliente de cifrado de DynamoDB interno. 

**Más información:**
+ Almacén de proveedores: [Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/ProviderStore.html), [Python](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/src/dynamodb_encryption_sdk/material_providers/store/__init__.py)
+ MetaStore: [Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/MetaStore.html), [Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/materials_providers/metastore.html#module-dynamodb_encryption_sdk.material_providers.store.meta)

# Proveedor de materiales criptográficos
<a name="crypto-materials-providers"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Una de las decisiones más importantes que debe tomar al utilizar el cliente de cifrado de DynamoDB es seleccionar un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP). El CMP combina y devuelve materiales criptográficos al encriptador de elementos. También determina cómo se generan las claves de cifrado y de firma, si se generan nuevos materiales de clave para cada elemento o si se reutilizan, así como los algoritmos de cifrado y de firma que se utilizan. 

Puede elegir un CMP para las implementaciones proporcionadas en las bibliotecas del cliente de cifrado de DynamoDB o crear un CMP personalizado compatible. Su opción de CMP también podría depender del [lenguaje de programación](programming-languages.md) que utilice.

En este tema se describen las más comunes CMPs y se ofrecen algunos consejos para ayudarle a elegir la mejor opción para su aplicación.

**Proveedor de materiales de KMS directo**  
El proveedor de materiales de KMS directo protege los elementos de la tabla con un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)que nunca se deja[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS) sin cifrar. Su aplicación no tiene que generar ni gestionar ningún material criptográfico. Como las utiliza AWS KMS key para generar claves de cifrado y firma únicas para cada elemento, este proveedor llama AWS KMS cada vez que cifra o descifra un elemento.   
Si para su aplicación le resulta práctico utilizar AWS KMS una AWS KMS llamada por transacción, este proveedor es una buena opción.  
Para obtener más información, consulte [Proveedor de materiales de KMS directo](direct-kms-provider.md).

**Proveedor de materiales encapsulado (CMP encapsulado)**  
El proveedor de materiales encapsulado (CMP encapsulado) permite generar y administrar las claves de encapsulación y de firma desde fuera del cliente de cifrado de DynamoDB.   
El CMP encapsulado genera una clave de cifrado única para cada elemento. A continuación utiliza las claves de encapsulación (o desencapsulación) y de firma que suministre. Por tanto, determina cómo se generan las claves de firma y encapsulación y si son únicas para cada elemento o si se reutilizan. El Wrapped CMP es una alternativa segura al [proveedor de Direct KMS](direct-kms-provider.md) para aplicaciones que no utilizan materiales criptográficos AWS KMS y pueden gestionarlos de forma segura.  
Para obtener más información, consulte [Proveedor de materiales encapsulado](wrapped-provider.md).

**Proveedor más reciente**  
El *proveedor más reciente* es un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) que está diseñado para funcionar con un [almacén de proveedores](DDBEC-legacy-concepts.md#provider-store). Lo obtiene CMPs de la tienda del proveedor y obtiene los materiales criptográficos que devuelve del. CMPs El proveedor más reciente normalmente utiliza cada CMP para satisfacer varias solicitudes para materiales criptográficos, pero puede usar las características del almacén de proveedores para controlar hasta qué punto se reutilizan los materiales, determinar la frecuencia con la que se rota su CMP e incluso cambiar el tipo de CMP que se utiliza sin cambiar el proveedor más reciente.  
Puede usar el proveedor más reciente con cualquier almacén de proveedores compatible. El cliente de cifrado de DynamoDB incluye MetaStore una, que es una tienda de proveedores que devuelve Wrapped. CMPs  
El proveedor más reciente es una buena opción para aplicaciones que necesitan minimizar las llamadas a su origen criptográfico y para aplicaciones que pueden reutilizar algunos materiales criptográficos sin infringir sus requisitos de seguridad. Por ejemplo, le permite proteger sus materiales criptográficos con un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) sin tener que llamar AWS KMS cada vez que cifra o descifra un elemento.  
Para obtener más información, consulte [Proveedor más reciente](most-recent-provider.md).

**Proveedor de materiales estático**  
El proveedor de materiales estáticos está diseñado para realizar pruebas, proof-of-concept demostraciones y ofrecer compatibilidad con versiones anteriores. No genera materiales criptográficos únicos para cada elemento. Devuelve las mismas claves de cifrado y firma que suministra y dichas claves se utilizan directamente para cifrar, descifrar y firmar los elementos de tabla.   
El [Proveedor estático asimétrico](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html) de la biblioteca de Java no es un proveedor estático. Solo suministra constructores alternativos para el [CMP encapsulado](wrapped-provider.md). Es seguro para uso de producción, pero se debe utilizar directamente el CMP encapsulado siempre que sea posible.

**Topics**
+ [Proveedor de materiales de KMS directo](direct-kms-provider.md)
+ [Proveedor de materiales encapsulado](wrapped-provider.md)
+ [Proveedor más reciente](most-recent-provider.md)
+ [Proveedor de materiales estático](static-provider.md)

# Proveedor de materiales de KMS directo
<a name="direct-kms-provider"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

El *proveedor de materiales de Direct KMS* (proveedor de Direct KMS) protege los elementos de la tabla con un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)que nunca deja [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS) sin cifrar. Este [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) devuelve una clave de cifrado y una clave de firma únicas para cada elemento de la tabla. Para ello, llama AWS KMS cada vez que se cifra o descifra un elemento.

Si procesa elementos de DynamoDB con una frecuencia alta y a gran escala, es posible que supere los límites y provoque demoras en AWS KMS [requests-per-secondel](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second) procesamiento. Si necesita superar estos límites, cree un caso en el [AWS Support Centro](https://console.aws.amazon.com/support/home). También podría considerar la posibilidad de utilizar un proveedor de materiales criptográficos con una reutilización de claves limitada, como el [proveedor más reciente](most-recent-provider.md).

[Para utilizar el proveedor de KMS directo, la persona que llama debe tener, al menos Cuenta de AWS, uno AWS KMS key, y permiso para llamar a las operaciones de [descifrado [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)y desencriptar](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) del.](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) AWS KMS key La AWS KMS key debe ser una clave de cifrado simétrica; el cliente de cifrado de DynamoDB no admite el cifrado asimétrico. Si utiliza una [tabla global de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), posiblemente desee especificar una [AWS KMS clave de múltiples regiones](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html). Para obtener más información, consulte [Modo de uso](#provider-kms-how-to-use).

**nota**  
Al utilizar el proveedor de KMS directo, los nombres y valores de los atributos de la clave principal aparecen en texto plano en el [contexto de AWS KMS cifrado](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) y en los AWS CloudTrail registros de las operaciones relacionadas. AWS KMS Sin embargo, el cliente de cifrado de DynamoDB nunca expone el texto no cifrado de ningún valor de atributo cifrado.

El proveedor de Direct KMS es uno de los varios [proveedores de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) compatibles con el cliente de cifrado de DynamoDB. Para obtener información sobre el otro CMPs, consulte. [Proveedor de materiales criptográficos](crypto-materials-providers.md)

**Para ver código de ejemplo, consulte:**
+ Java: [AwsKmsEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)
+ Python: [aws-kms-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py), [aws-kms-encrypted-item](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

**Topics**
+ [Modo de uso](#provider-kms-how-to-use)
+ [Cómo funciona](#provider-kms-how-it-works)

## Modo de uso
<a name="provider-kms-how-to-use"></a>

Para crear un proveedor de KMS directo, utilice el parámetro de ID de clave para especificar una [clave KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) de cifrado simétrico en su cuenta. El valor del parámetro ID de clave puede ser el ID de clave, el ARN de clave, el nombre de alias o el ARN de alias de AWS KMS key. Para obtener más información sobre los [identificadores clave](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) en la *Guía para desarrolladores de AWS Key Management Service *.

El proveedor de KMS directo necesita una clave KMS de cifrado simétrica. No puede utilizar una clave KMS asimétrica. Sin embargo, puede utilizar una clave KMS de múltiples regiones, una clave KMS con material de claves importado o una clave KMS en un almacén de claves personalizado. Debe tener los permisos [kms: GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) y [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) en la clave KMS. Por lo tanto, debe usar una clave administrada por el cliente, no una clave de KMS AWS administrada o AWS propia.

El cliente de cifrado de DynamoDB para Python determina la región a la que se debe AWS KMS llamar desde la región en el valor del parámetro de ID de clave, si incluye alguna. De lo contrario, utiliza la región del AWS KMS cliente, si se especifica una, o la región que se configura en el. AWS SDK para Python (Boto3) Para obtener información sobre la selección de regiones en Python, consulta [Configuración](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) en la referencia de la API del AWS SDK for Python (Boto3).

El cliente de cifrado de DynamoDB para Java determina la región a la que se debe AWS KMS llamar desde la región del cliente, si AWS KMS el cliente que especifique incluye una región. De lo contrario, utiliza la región que usted configure en la AWS SDK para Java. Para obtener información sobre la selección de regiones en AWS SDK para Java, consulte la [Región de AWS selección](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html) en la Guía AWS SDK para Java para desarrolladores.

------
#### [ Java ]

```
// Replace the example key ARN and Region with valid values for your application
final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
final String region = 'us-west-2'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

------
#### [ Python ]

En el siguiente ejemplo, se utiliza la clave ARN para especificar el AWS KMS key. Si su identificador de clave no incluye una Región de AWS, el cliente de cifrado de DynamoDB obtiene la región de la sesión de Botocore configurada, si la hay, o de los valores predeterminados de Boto.

```
# Replace the example key ID with a valid value
kms_key = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key)
```

------

Si utiliza tablas [globales de Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), le recomendamos que cifre los datos con una clave multirregional. AWS KMS Las claves multirregionales son AWS KMS keys diferentes Regiones de AWS y se pueden usar indistintamente porque tienen el mismo identificador de clave y el mismo material de clave. Para obtener más detalles, consulte [Uso de claves de múltiples regiones](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) en la *Guía para desarrolladores de AWS Key Management Service *.

**nota**  
Si utiliza las tablas globales de la [versión 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html), debe configurar las acciones de los atributos para que los campos de replicación reservados no estén cifrados ni firmados. Para obtener más información, consulte [Problemas con las tablas globales de versiones anteriores](troubleshooting.md#fix-global-tables).

Para usar una clave de múltiples regiones con el cliente de cifrado de DynamoDB, cree una clave de múltiples regiones y replíquela en las regiones en las que se ejecuta la aplicación. A continuación, configure el proveedor de KMS directo para que utilice la clave de múltiples regiones en la región a la que llama el cliente de cifrado de DynamoDB AWS KMS.

En el siguiente ejemplo, se configura el cliente de cifrado de DynamoDB para que cifre datos en la región Este de EE. UU. (Norte de Virginia) (us-east-1) y los descifra en la región Oeste de EE. UU. (Oregón) (us-west-2) mediante una clave de múltiples regiones.

------
#### [ Java ]

En este ejemplo, el cliente de cifrado de DynamoDB obtiene la región para realizar AWS KMS llamadas desde la región del cliente. AWS KMS El valor `keyArn` identifica una clave de múltiples regiones en la misma región.

```
// Encrypt in us-east-1

// Replace the example key ARN and Region with valid values for your application
final String usEastKey = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
final String region = 'us-east-1'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usEastKey);
```

```
// Decrypt in us-west-2

// Replace the example key ARN and Region with valid values for your application
final String usWestKey = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
final String region = 'us-west-2'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usWestKey);
```

------
#### [ Python ]

En este ejemplo, el cliente de cifrado de DynamoDB obtiene la región para realizar AWS KMS llamadas desde la región en la clave ARN.

```
# Encrypt in us-east-1

# Replace the example key ID with a valid value
us_east_key = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_east_key)
```

```
# Decrypt in us-west-2

# Replace the example key ID with a valid value
us_west_key = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_west_key)
```

------

## Cómo funciona
<a name="provider-kms-how-it-works"></a>

El proveedor de KMS directo devuelve las claves de cifrado y firma protegidas por una AWS KMS key que especifique, tal como se muestra en el diagrama siguiente.

![\[La entrada, el procesamiento y la salida del proveedor de KMS directo en el cliente de cifrado de DynamoDB.\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/directKMS.png)

+ Para generar materiales de cifrado, el proveedor de Direct KMS solicita AWS KMS [generar una clave de datos única para cada elemento utilizando una clave](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) AWS KMS key que usted especifique. Deriva las claves de cifrado y de firma para el elemento desde la copia de texto no cifrado de la [clave de datos](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) y, a continuación, devuelve las claves de cifrado y de firma, junto con la clave de datos cifrada, que está almacenada en el [atributo de descripción de material](DDBEC-legacy-concepts.md#legacy-material-description) del elemento. 

  El encriptador de elementos utiliza las claves de cifrado y de firma y las elimina de la memoria lo antes posible. En el sistema cifrado solo se guarda la copia cifrada de la clave de datos desde la que se derivaron.
+ Para generar materiales de descifrado, el proveedor de Direct KMS solicita descifrar AWS KMS la clave de datos cifrada. A continuación, deriva las claves de verificación y firma desde la clave de datos de texto no cifrado y los devuelve al encriptador de elementos.

  El encriptador de elementos verifica el elemento y, si la verificación se realiza correctamente, descifra los valores cifrados. A continuación, elimina las claves de la memoria lo antes posible.

### Obtener los materiales de cifrado
<a name="direct-kms-get-encryption-materials"></a>

En esta sección se describen en detalle las entradas, las salidas y el procesamiento del proveedor de KMS directo cuando recibe una solicitud para materiales de cifrado desde el [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor).

**Entrada** (desde la aplicación)
+ El ID de clave de un. AWS KMS key

**Entrada** (desde el encriptador de elementos)
+ [Contexto de cifrado de DynamoDB](concepts.md#encryption-context)

**Salida** (al encriptador de elementos)
+ Clave de cifrado (texto no cifrado)
+ Clave de firma
+ En la [descripción de material real](DDBEC-legacy-concepts.md#legacy-material-description): estos valores se guardan en el atributo de descripción de material que el cliente agrega al elemento.
  + amzn-ddb-env-key: clave de datos codificada en Base64 cifrada por AWS KMS key
  + amzn-ddb-env-alg[: Algoritmo de cifrado, por defecto AES/256](https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/archived-crypto-projects/aes-development)
  + amzn-ddb-sig-alg[: algoritmo de firma, por defecto, Hmac /256 SHA256](https://en.wikipedia.org/wiki/HMAC)
  + amzn-ddb-wrap-alg: kms

**Procesando**

1. El proveedor de KMS directo envía AWS KMS una solicitud para utilizar lo especificado AWS KMS key a fin de [generar una clave de datos única](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) para el elemento. La operación devuelve una clave de texto no cifrado y una copia que está cifrada con la AWS KMS key. Esto se conoce como el *material de claves inicial*.

   La solicitud incluye los siguientes valores en texto no cifrado en [contexto de cifrado de AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context). Estos valores no secretos están vinculados criptográficamente al objeto cifrado, de modo que se requiere el mismo contexto de cifrado para el descifrado. Puede usar estos valores para identificar la llamada AWS KMS en los [AWS CloudTrail registros](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-overview.html).
   + amzn-ddb-env-alg — Algoritmo de cifrado, por defecto AES/256
   + amzn-ddb-sig-alg — Algoritmo de firma, por defecto Hmac /256 SHA256
   + (Opcional) — aws-kms-table *table name*
   + (Opcional) *partition key name* — *partition key value* (los valores binarios están codificados en Base64)
   + (Opcional) *sort key name* — *sort key value* (los valores binarios están codificados en Base64)

   El proveedor de Direct KMS obtiene los valores del contexto de AWS KMS cifrado del contexto de cifrado de [DynamoDB del elemento](concepts.md#encryption-context). Si el contexto de cifrado de DynamoDB no incluye un valor, como el nombre de la tabla, ese par nombre-valor se omite del contexto de cifrado. AWS KMS 

1. El proveedor de KMS directo deriva una clave de cifrado simétrica y una clave de firma de la clave de datos. De forma predeterminada, utiliza el [algoritmo hash seguro (SHA) 256](https://en.wikipedia.org/wiki/SHA-2) y la [función de derivación de claves RFC5869 basada en HMAC para obtener una clave de cifrado simétrica AES de 256 bits y una clave de firma HMAC-SHA-256](https://tools.ietf.org/html/rfc5869) de 256 bits. 

1. El proveedor de KMS directo devuelve la salida al encriptador de elementos.

1. El encriptador de elementos utiliza la clave de cifrado para cifrar los atributos especificados y la clave de firma para firmarlos, utilizando los algoritmos especificados en la descripción de material real. Elimina las claves de texto no cifrado de la memoria lo antes posible.

### Obtener los materiales de descifrado
<a name="direct-kms-get-decryption-materials"></a>

En esta sección se describen en detalle las entradas, las salidas y el procesamiento del proveedor de KMS directo cuando recibe una solicitud para materiales de descifrado desde el [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor).

**Entrada** (desde la aplicación)
+  AWS KMS key El ID de clave de un. 

  El valor del ID de clave puede ser el ID de clave, el ARN de clave, el nombre de alias o el ARN de alias del AWS KMS key. Los valores que no se especifiquen en el ID de clave, como la región, deben estar disponibles en el perfil nombrado [AWS](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles). El ARN de clave proporciona todos los valores que necesita AWS KMS .

**Entrada** (desde el encriptador de elementos)
+ Una copia del [contexto de cifrado de DynamoDB](concepts.md#encryption-context) que contiene el contenido del atributo de descripción de material.

**Salida** (al encriptador de elementos)
+ Clave de cifrado (texto no cifrado)
+ Clave de firma

**Procesando**

1. El proveedor de KMS directo obtiene la clave de datos cifrados desde el atributo de descripción del material en el elemento cifrado. 

1. Solicita AWS KMS utilizar la especificada AWS KMS key para [descifrar](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) la clave de datos cifrados. La operación devuelve una clave de texto no cifrado.

   Esta solicitud debe usar el mismo [contexto de cifrado de AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) que se utilizó para generar y cifrar la clave de datos.
   + aws-kms-table – *table name*
   + *partition key name*— *partition key value* (los valores binarios están codificados en Base64)
   + (Opcional) *sort key name* — *sort key value* (los valores binarios están codificados en Base64)
   + amzn-ddb-env-alg — Algoritmo de cifrado, por defecto AES/256
   + amzn-ddb-sig-alg — Algoritmo de firma, por defecto Hmac /256 SHA256

1. El proveedor de Direct KMS utiliza el [algoritmo de hash seguro (SHA) 256](https://en.wikipedia.org/wiki/SHA-2) y la [función de derivación de claves RFC5869 basada en el HMAC para obtener una clave](https://tools.ietf.org/html/rfc5869) de cifrado simétrica AES de 256 bits y una clave de firma HMAC-SHA-256 de 256 bits a partir de la clave de datos. 

1. El proveedor de KMS directo devuelve la salida al encriptador de elementos.

1. El encriptador de elementos utiliza la clave de firma para verificar el elemento. Si se realiza correctamente, utiliza la clave de cifrado simétrica para descifrar los valores de atributo cifrados. Estas operaciones utilizan los algoritmos de cifrado y firma especificados en la descripción de material real. El encriptador de elementos elimina las claves de texto no cifrado de la memoria lo antes posible.

# Proveedor de materiales encapsulado
<a name="wrapped-provider"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

El *proveedor de materiales encapsulado* (CMP encapsulado) le permite utilizar las claves de encapsulación y de firma desde cualquier fuente con el cliente de cifrado de DynamoDB. El Wrapped CMP no depende de ningún AWS servicio. Sin embargo, debe generar y administrar las claves de encapsulación y de firma fuera del cliente, incluida la entrega de las claves correctas para verificar y descifrar el elemento. 

El CMP encapsulado genera una clave de cifrado de elemento única para cada elemento. Encapsula la clave de cifrado del elemento con la clave de encapsulación que proporcione y guarda la clave de cifrado de elemento encapsulado en el [atributo de descripción de materiales](DDBEC-legacy-concepts.md#legacy-material-description) del elemento. Dado que suministra las claves de encapsulación y de firma, determina cómo se generan las claves de firma y encapsulación y si son únicas para cada elemento o si se reutilizan. 

El CMP encapsulado es una implementación segura y supone una buena opción para aplicaciones que puedan administrar materiales criptográficos.

Wrapped CMP es uno de los varios [proveedores de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) compatibles con el cliente de cifrado de DynamoDB. Para obtener información sobre el otro, consulte. CMPs [Proveedor de materiales criptográficos](crypto-materials-providers.md)

**Para ver código de ejemplo, consulte:**
+ Java: [AsymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java)
+ Python: [wrapped-rsa-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_rsa_encrypted_table.py), [wrapped-symmetric-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_symmetric_encrypted_table.py)

**Topics**
+ [Modo de uso](#wrapped-cmp-how-to-use)
+ [Funcionamiento](#wrapped-cmp-how-it-works)

## Modo de uso
<a name="wrapped-cmp-how-to-use"></a>

Para crear un CMP encapsulado, especifique una clave de encapsulación (requerida durante el cifrado), una clave de desencapsulación (requerida durante el descifrado) y una clave de firma. Debe proporcionar las claves al cifrar y descifrar elementos.

Las claves de encapsulación, desencapsulación y firma pueden ser claves simétricas o pares de claves asimétricas. 

------
#### [ Java ]

```
// This example uses asymmetric wrapping and signing key pairs
final KeyPair wrappingKeys = ...
final KeyPair signingKeys = ...

final WrappedMaterialsProvider cmp = 
    new WrappedMaterialsProvider(wrappingKeys.getPublic(),
                                 wrappingKeys.getPrivate(),
                                 signingKeys);
```

------
#### [ Python ]

```
# This example uses symmetric wrapping and signing keys
wrapping_key = ...
signing_key  = ...

wrapped_cmp = WrappedCryptographicMaterialsProvider(
    wrapping_key=wrapping_key,
    unwrapping_key=wrapping_key,
    signing_key=signing_key
)
```

------

## Funcionamiento
<a name="wrapped-cmp-how-it-works"></a>

El CMP encapsulado genera una clave de cifrado de elemento nueva para cada elemento. Utiliza las claves de encapsulación, desencapsulación y firma que proporcione, tal y como se muestra en el siguiente diagrama.

![\[La entrada, el procesamiento y la salida del proveedor de materiales encapsulado en el cliente de cifrado de DynamoDB\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/wrappedCMP.png)


### Obtener los materiales de cifrado
<a name="wrapped-cmp-get-encryption-materials"></a>

En esta sección se describen en detalle las entradas, las salidas y el procesamiento del proveedor de materiales encapsulado (CMP encapsulado) cuando recibe una solicitud para materiales de cifrado. 

**Entrada** (desde la aplicación)
+ Clave de encapsulación: una clave simétrica [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) o una clave pública [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)). Obligatorio si los valores de atributos están cifrados. De lo contrario, es opcional y se pasa por alto.
+ Clave de desencapsulación: opcional y se pasa por alto. 
+ Clave de firma

**Entrada** (desde el encriptador de elementos)
+ [Contexto de cifrado de DynamoDB](concepts.md#encryption-context)

**Salida** (al encriptador de elementos):
+ Clave de cifrado de elemento de texto no cifrado
+ Clave de firma (sin cambios)
+ [Descripción de material real](DDBEC-legacy-concepts.md#legacy-material-description): estos valores se guardan en el [atributo de descripción de material](DDBEC-legacy-concepts.md#legacy-material-description) que el cliente añade al elemento. 
  + `amzn-ddb-env-key`: clave de cifrado de elemento encapsulado cifrado en Base64
  + `amzn-ddb-env-alg`: algoritmo de cifrado utilizado para cifrar el elemento. El valor predeterminado es AES-256-CBC.
  + `amzn-ddb-wrap-alg`: el algoritmo de encapsulación que utilizó el CMP encapsulado para encapsular la clave de cifrado del elemento. Si la clave de encapsulación es una clave AES, la clave se encapsula utilizando `AES-Keywrap` no rellenado, tal como se define en [RFC 3394](https://tools.ietf.org/html/rfc3394.html). Si la clave de empaquetado es una clave RSA, la clave se cifra mediante RSA OAEP con relleno. MGF1 

**Procesando**

Cuando se cifra un elemento, transfiere una clave de encapsulación y una clave de firma. Una clave de desencapsulación es opcional y se pasa por alto.

1. El CMP encapsulado genera una clave de cifrado de elemento simétrica única para el elemento de tabla.

1. Utiliza la clave de cifrado que especifica para encapsular la clave de cifrado del elemento. A continuación, lo elimina de la memoria lo antes posible.

1. Devuelve la clave de cifrado del elemento con texto no cifrado, la clave de firma que suministró y una [descripción de material real](DDBEC-legacy-concepts.md#legacy-material-description) que incluye la clave de cifrado del elemento encapsulado y los algoritmos de cifrado y encapsulación.

1. El encriptador de elementos utiliza la clave de cifrado de texto no cifrado para cifrar el elemento. Utiliza la clave de firma que suministró para firmar el elemento. A continuación, elimina las claves de texto no cifrado de la memoria lo antes posible. Copia los campos en la descripción de material real, incluida la clave de cifrado encapsulada (`amzn-ddb-env-key`), en el atributo de descripción de material del elemento.

### Obtener los materiales de descifrado
<a name="wrapped-cmp-get-decryption-materials"></a>

En esta sección se describen en detalle las entradas, las salidas y el procesamiento del proveedor de materiales encapsulado (CMP encapsulado) cuando recibe una solicitud para materiales de descifrado. 

**Entrada** (desde la aplicación)
+ Clave de encapsulación: opcional y se pasa por alto.
+ Clave de encapsulación: la misma clave simétrica [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) o clave privada [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) que corresponde a la clave pública RSA utilizada para cifrar. Obligatorio si los valores de atributos están cifrados. De lo contrario, es opcional y se pasa por alto.
+ Clave de firma

**Entrada** (desde el encriptador de elementos)
+ Una copia del [contexto de cifrado de DynamoDB](concepts.md#encryption-context) que contiene el contenido del atributo de descripción de material.

**Salida** (al encriptador de elementos)
+ Clave de cifrado de elemento de texto no cifrado
+ Clave de firma (sin cambios)

**Procesando**

Cuando se descifra un elemento, transfiere una clave de desencapsulación y una clave de firma. Una clave de encapsulación es opcional y se pasa por alto.

1. El CMP encapsulado obtiene la clave de cifrado del elemento encapsulado desde el atributo de descripción de material del elemento.

1. Utiliza la clave de desencapsulación y el algoritmo para desencapsular la clave de cifrado del elemento. 

1. Devuelve la clave de cifrado del elemento con texto no cifrado, la clave de firma y los algoritmos de cifrado y de firma al encriptador de elementos.

1. El encriptador de elementos utiliza la clave de firma para verificar el elemento. Si se realiza correctamente, utiliza la clave de cifrado de elementos para descifrar el elemento. A continuación, elimina las claves de texto no cifrado de la memoria lo antes posible.

# Proveedor más reciente
<a name="most-recent-provider"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

El *proveedor más reciente* es un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) que está diseñado para funcionar con un [almacén de proveedores](DDBEC-legacy-concepts.md#provider-store). Lo obtiene CMPs de la tienda del proveedor y obtiene los materiales criptográficos que devuelve de CMPs. Normalmente utiliza cada CMP para satisfacer varias solicitudes para materiales criptográficos. Pero puede utilizar las características de su almacén de proveedores para controlar hasta qué punto se reutilizan los materiales, determinar la frecuencia con la que se rota su CMP e, incluso, cambiar el tipo de CMP que utiliza sin cambiar el proveedor más reciente.

**nota**  
El código asociado al símbolo `MostRecentProvider` del proveedor más reciente puede almacenar materiales criptográficos en la memoria durante todo el proceso. Podría permitir a la persona que llama usar claves que ya no está autorizada a usar.   
El símbolo `MostRecentProvider` está obsoleto en las versiones anteriores compatibles del cliente de cifrado de DynamoDB y se eliminó de la versión 2.0.0. Se sustituye por el símbolo `CachingMostRecentProvider`. Para obtener más información, consulte [Actualizaciones del proveedor más reciente](#mrp-versions).

El proveedor más reciente es una buena opción para aplicaciones que necesitan minimizar las llamadas al almacén de proveedores y su origen criptográfico y para aplicaciones que pueden reutilizar algunos materiales criptográficos sin infringir sus requisitos de seguridad. Por ejemplo, le permite proteger sus materiales criptográficos con un signo [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) sin tener que llamar AWS KMS cada vez que cifra o descifra un elemento.

El almacén de proveedores que elija determinará el tipo CMPs que utilizará el proveedor más reciente y la frecuencia con la que recibirá un nuevo CMP. Puede utilizar cualquier almacén de proveedores compatible con el proveedor más reciente, incluidos los almacenes de proveedor personalizados que diseñe. 

El cliente de cifrado de DynamoDB incluye *MetaStore*un que crea y [devuelve proveedores de materiales empaquetados (Wrapped](wrapped-provider.md)). CMPs MetaStore Guarda varias versiones del Wrapped CMPs que genera en una tabla interna de DynamoDB y las protege con un cifrado del lado del cliente mediante una instancia interna del DynamoDB Encryption Client. 

Puede configurarlo MetaStore para que utilice cualquier tipo de CMP interno para proteger los materiales de la tabla, incluido un [proveedor de KMS directo](direct-kms-provider.md) que genere materiales criptográficos protegidos por usted AWS KMS key, un CMP empaquetado que utilice las claves de empaquetado y firma que usted suministre o un CMP personalizado compatible que diseñe.

**Para ver código de ejemplo, consulte:**
+ Java: [MostRecentEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java)
+ Python: [most\$1recent\$1provider\$1encrypted\$1table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/most_recent_provider_encrypted_table.py)

**Topics**
+ [Modo de uso](#mrp-how-to-use-it)
+ [Funcionamiento](#mrp-how-it-works)
+ [Actualizaciones del proveedor más reciente](#mrp-versions)

## Modo de uso
<a name="mrp-how-to-use-it"></a>

Para crear un proveedor más reciente, tiene que crear y configurar un almacén de proveedores y, a continuación, crear un proveedor más reciente que utiliza el almacén de proveedores. 

[Los siguientes ejemplos muestran cómo crear un proveedor más reciente que utilice MetaStore y proteja las versiones de su tabla interna de DynamoDB con materiales criptográficos de un proveedor de Direct KMS.](direct-kms-provider.md) Estos ejemplos utilizan el símbolo [`CachingMostRecentProvider`](#mrp-versions). 

Cada proveedor más reciente tiene un nombre que lo identifica CMPs en la MetaStore tabla, un ajuste [time-to-live](#most-recent-provider-ttl)(TTL) y un ajuste de tamaño de caché que determina el número de entradas que puede contener la caché. En estos ejemplos, se establece el tamaño de la caché en 1000 entradas y un TTL de 60 segundos.

------
#### [ Java ]

```
// Set the name for MetaStore's internal table
final String keyTableName = 'metaStoreTable'

// Set the Region and AWS KMS key
final String region = 'us-west-2'
final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

// Set the TTL and cache size
final long ttlInMillis = 60000;
final long cacheSize = 1000;

// Name that identifies the MetaStore's CMPs in the provider store
final String materialName = 'testMRP'

// Create an internal DynamoDB client for the MetaStore
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build();

// Create an internal Direct KMS Provider for the MetaStore
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kms, keyArn);

// Create an item encryptor for the MetaStore,
// including the Direct KMS Provider
final DynamoDBEncryptor keyEncryptor = DynamoDBEncryptor.getInstance(kmsProv);

// Create the MetaStore
final MetaStore metaStore = new MetaStore(ddb, keyTableName, keyEncryptor);

//Create the Most Recent Provider
final CachingMostRecentProvider cmp = new CachingMostRecentProvider(metaStore, materialName, ttlInMillis, cacheSize);
```

------
#### [ Python ]

```
# Designate an AWS KMS key
kms_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

# Set the name for MetaStore's internal table
meta_table_name = 'metaStoreTable'

# Name that identifies the MetaStore's CMPs in the provider store
material_name = 'testMRP'

# Create an internal DynamoDB table resource for the MetaStore
meta_table = boto3.resource('dynamodb').Table(meta_table_name)

# Create an internal Direct KMS Provider for the MetaStore
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
    
# Create the MetaStore with the Direct KMS Provider
meta_store = MetaStore(
    table=meta_table,
    materials_provider=kms_cmp
)

# Create a Most Recent Provider using the MetaStore
#    Sets the TTL (in seconds) and cache size (# entries)
most_recent_cmp = MostRecentProvider(
    provider_store=meta_store,
    material_name=material_name,
    version_ttl=60.0,
    cache_size=1000
)
```

------

## Funcionamiento
<a name="mrp-how-it-works"></a>

El proveedor más reciente se obtiene CMPs de una tienda de proveedores. A continuación, utiliza el CMP para generar los materiales criptográficos que devuelve al encriptador de elementos.

### Acerca del proveedor más reciente
<a name="about-mrp"></a>

El proveedor más reciente obtiene un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) desde un [almacén de proveedores](DDBEC-legacy-concepts.md#provider-store). A continuación, utiliza el CMP para generar los materiales criptográficos que devuelve. Cada proveedor más reciente está asociado a una tienda de proveedores, pero una tienda de proveedores puede suministrar CMPs a varios proveedores en varios hosts.

El proveedor más reciente puede funcionar con cualquier CMP compatible desde cualquier almacén de proveedores. El encriptador de elementos solicita materiales de cifrado o descifrado al CMP y los devuelve al encriptador de elementos. No realiza ninguna operación criptográfica.

Para solicitar un CMP desde su almacén de proveedores, el proveedor más reciente proporciona su nombre de material y la versión de un CMP existente que desea utilizar. Para los materiales de cifrado, el proveedor más reciente solicita siempre la versión máxima ("más reciente"). Para los materiales de descifrado, solicita la versión del CMP que se utilizó para crear los materiales de cifrado, tal como se muestra en el diagrama siguiente.

![\[Un proveedor más reciente\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/most-recent-provider-1.png)


El proveedor más reciente guarda las versiones de las CMPs que devuelve la tienda del proveedor en una caché local de uso menos reciente (LRU) en la memoria. La memoria caché permite al proveedor más reciente obtener lo que necesita sin tener CMPs que llamar a la tienda del proveedor para comprar cada artículo. Puede borrar la caché bajo demanda.

El proveedor más reciente utiliza un [time-to-livevalor](#most-recent-provider-ttl) configurable que se puede ajustar en función de las características de la aplicación.

### Acerca del MetaStore
<a name="about-metastore"></a>

Puede utilizar un proveedor más reciente con cualquier almacén de proveedores, incluido un almacén de proveedores personalizado compatible. El cliente de cifrado de DynamoDB incluye MetaStore una implementación segura que se puede configurar y personalizar.

A *MetaStore*es un [almacén proveedor](DDBEC-legacy-concepts.md#provider-store) que crea y devuelve [Wrapped](wrapped-provider.md), CMPs que se configura con la clave de empaquetado, la clave de desempaquetado y la clave de firma que Wrapped requiere. CMPs A MetaStore es una opción segura para los proveedores más recientes, ya que Wrapped CMPs siempre genera claves de cifrado únicas para cada artículo. Solo se reutilizan la clave de encapsulación que protege la clave de cifrado del elemento y las claves de firma.

El siguiente diagrama muestra los componentes del proveedor más reciente MetaStore y cómo interactúa con él.

![\[A MetaStore\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/most-recent-provider-2.png)


 MetaStore Genera el Wrapped y CMPs, a continuación, lo almacena (en forma cifrada) en una tabla interna de DynamoDB. La clave de partición es el nombre del material del proveedor más reciente; la clave de clasificación es el número de versión. Los materiales de la tabla están protegidos mediante un cliente de cifrado interno de DynamoDB, incluido un encriptador de elementos y un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) interno.

Puede utilizar cualquier tipo de CMP interno MetaStore, incluido un [proveedor de KMS directo](wrapped-provider.md), un CMP empaquetado con materiales criptográficos que usted proporcione o un CMP personalizado compatible. Si el CMP interno de su empresa MetaStore es un proveedor de Direct KMS, sus claves reutilizables de empaquetado y firma están protegidas con un símbolo in (). [AWS KMS key[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)AWS KMS Las MetaStore llamadas AWS KMS cada vez que agrega una nueva versión de CMP a su tabla interna o obtiene una versión de CMP de su tabla interna.

### Establecer un valor time-to-live
<a name="most-recent-provider-ttl"></a>

Puede establecer un valor time-to-live (TTL) para cada proveedor más reciente que cree. En general, utilice el valor TTL más bajo que resulte práctico para su aplicación.

El uso del valor de TTL se cambia en el símbolo `CachingMostRecentProvider` del proveedor más reciente. 

**nota**  
El `MostRecentProvider` símbolo del proveedor más reciente quedó obsoleto en las versiones anteriores compatibles del cliente de cifrado de DynamoDB y se eliminó de la versión 2.0.0. Se sustituye por el símbolo `CachingMostRecentProvider`. Se recomienda que actualice el código lo antes posible. Para obtener más información, consulte [Actualizaciones del proveedor más reciente](#mrp-versions).

**`CachingMostRecentProvider`**  
El `CachingMostRecentProvider` utiliza el valor de TTL de dos maneras diferentes.   
+ El TTL determina la frecuencia con la que el proveedor más reciente busca en la tienda del proveedor una nueva versión del CMP. Si hay una nueva versión disponible, el proveedor más reciente reemplaza su CMP y actualiza sus materiales criptográficos. De lo contrario, seguirá utilizando su CMP y sus materiales criptográficos actuales.
+ El TTL determina cuánto tiempo se puede usar CMPs en la memoria caché. Antes de utilizar un CMP almacenado en caché para el cifrado, el proveedor más reciente evalúa el tiempo que permanece en la memoria caché. Si el tiempo de caché de un CMP supera el TTL, el CMP se expulsa de la memoria caché y el proveedor más reciente obtiene una nueva versión del CMP de la última versión de la tienda de su proveedor.

**`MostRecentProvider`**  
En el `MostRecentProvider`, el TTL determina la frecuencia con la que el proveedor más reciente busca en la tienda del proveedor una nueva versión del CMP. Si hay una nueva versión disponible, el proveedor más reciente reemplaza su CMP y actualiza sus materiales criptográficos. De lo contrario, seguirá utilizando su CMP y sus materiales criptográficos actuales.

El TTL no determina la frecuencia con la que se crea una nueva versión del CMP. Las nuevas versiones de CMP se crean [rotando los materiales criptográficos](#most-recent-provider-rotate).

Un valor de TTL ideal varía según la aplicación y sus objetivos de latencia y disponibilidad. Un TTL menor mejora el perfil de seguridad al reducir el tiempo que los materiales criptográficos se almacenan en la memoria. Además, un TTL menor actualiza la información crítica con más frecuencia. Por ejemplo, si su CMP interno es un [proveedor de KMS directo](direct-kms-provider.md), verificará con más frecuencia que la persona que llama siga estando autorizada a utilizar un AWS KMS key.

Sin embargo, si el TTL es demasiado breve, las llamadas frecuentes a la tienda del proveedor pueden aumentar los costos y hacer que la tienda del proveedor limite las solicitudes de su aplicación y de otras aplicaciones que comparten su cuenta de servicio. También podría resultarle útil coordinar el TTL con la velocidad de rotación de los materiales criptográficos. 

Durante las pruebas, varíe el TTL y el tamaño de la caché según las distintas cargas de trabajo hasta que encuentre una configuración que se adapte a su aplicación y a sus estándares de seguridad y rendimiento.

### Rotación de materiales criptográficos
<a name="most-recent-provider-rotate"></a>

Cuando un proveedor más reciente necesita materiales de cifrado, siempre utiliza la versión más reciente que conozca de su CMP. La frecuencia con la que comprueba si hay una versión más reciente viene determinada por el valor [time-to-live](#most-recent-provider-ttl)(TTL) que se establece al configurar el proveedor más reciente. 

Cuando el TTL caduca, el proveedor más reciente busca en la tienda del proveedor una versión más reciente del CMP. Si hay alguna disponible, el proveedor más reciente la obtiene y reemplaza el CMP en su caché. Utiliza este CMP y sus materiales criptográficos hasta que descubre que la tienda del proveedor tiene una versión más reciente.

Para indicarle al almacén de proveedores que cree una nueva versión de un CMP para un proveedor más reciente, llame a la operación Crear nuevo proveedor del almacén de proveedores con el nombre del material del proveedor más reciente. El almacén de proveedores crea un nuevo CMP y guarda una copia cifrada en su almacén interno con un número de versión mayor. (También devuelve un CMP, pero puede descartarlo). Como resultado, la próxima vez que el proveedor más reciente consulte el número máximo de versión de su almacén de proveedores CMPs, obtendrá el nuevo número de versión superior y lo utilizará en las siguientes solicitudes al almacén para comprobar si se ha creado una nueva versión del CMP.

Puede programar sus llamadas a Crear nuevo proveedor en función de la hora, del número de elementos o de los atributos procesados o de cualquier otra métrica que tenga sentido para su aplicación.

### Obtener los materiales de cifrado
<a name="most-recent-provider-encrypt"></a>

El proveedor más reciente utiliza el siguiente proceso, mostrado en este diagrama, para obtener los materiales de cifrado que devuelve al encriptador de elementos. La salida depende del tipo de CMP que el almacén de proveedores devuelve. El proveedor más reciente puede usar cualquier almacén de proveedores compatible, incluido el MetaStore que se incluye en el cliente de cifrado de DynamoDB.

![\[Entrada, procesamiento y salida del proveedor más reciente en el cliente de cifrado de DynamoDB\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/most-recent-provider-provider-store.png)


Al crear un proveedor más reciente con el [`CachingMostRecentProvider`símbolo](#mrp-versions), se especifica un almacén de proveedores, un nombre para el proveedor más reciente y un valor [time-to-live](#most-recent-provider-ttl)(TTL). Si lo desea, también puede especificar un tamaño de caché, que determina la cantidad máxima de materiales criptográficos que pueden existir en la caché.

Cuando el encriptador de elementos solicita al proveedor más reciente materiales de cifrado, el proveedor más reciente empieza buscando en su caché la versión más reciente de su CMP.
+ Si encuentra el CMP con la versión más reciente en su caché y el CMP no ha excedido el valor de TTL, el proveedor más reciente utiliza el CMP para generar materiales de cifrado. A continuación, devuelve los materiales de cifrado al encriptador de elementos. Esta operación no requiere una llamada al almacén de proveedores.
+ Si la última versión del CMP no está en su caché, o si está en la caché, pero excedió su valor de TTL, el proveedor más reciente solicita un CMP desde su almacén de proveedores. La solicitud incluye el nombre del material del proveedor más reciente y el número de versión máximo que conoce.

  1. El almacén de proveedores devuelve un CMP desde su almacenamiento persistente. Si el almacén del proveedor es un MetaStore, obtiene un CMP empaquetado cifrado de su tabla interna de DynamoDB utilizando el nombre del material del proveedor más reciente como clave de partición y el número de versión como clave de clasificación. MetaStore Utiliza su cifrador de elementos interno y su CMP interno para descifrar el CMP empaquetado. A continuación, devuelve el CMP de texto no cifrado al proveedor más reciente. Si el CMP interno es un [proveedor de KMS directo](direct-kms-provider.md), este paso incluye una llamada al [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

  1. El CMP agrega el campo `amzn-ddb-meta-id` a la [descripción de material real](DDBEC-legacy-concepts.md#legacy-material-description). Su valor es el nombre de material y la versión del CMP en su tabla interna. El almacén del proveedor devuelve el CMP al proveedor más reciente.

  1. El proveedor más reciente almacena en la memoria caché el CMP.

  1. El proveedor más reciente utiliza el CMP para generar materiales de cifrado. A continuación, devuelve los materiales de cifrado al encriptador de elementos.

### Obtener los materiales de descifrado
<a name="most-recent-provider-decrypt"></a>

Cuando el encriptador de elementos solicita al proveedor más reciente los materiales de descifrado, el proveedor más reciente utiliza el proceso siguiente para obtenerlos y devolverlos.

1. El proveedor más reciente solicita al almacén de proveedores el número de la versión de los materiales criptográficos que se utilizaron para cifrar el elemento. Transfiere la descripción de material real desde el [atributo de descripción de material](DDBEC-legacy-concepts.md#legacy-material-description) del elemento.

1. El almacén de proveedores obtiene el número de versión de CMP de cifrado desde el campo `amzn-ddb-meta-id` en la descripción de material real y lo devuelve al proveedor más reciente.

1. El proveedor más reciente busca en la caché la versión del CMP que se utilizó para cifrar y firmar el elemento.
+ Si encuentra que la versión coincidente del CMP está en su caché y que el CMP no ha superado el [valor time-to-live (TTL)](#most-recent-provider-ttl), el proveedor más reciente utiliza el CMP para generar materiales de descifrado. A continuación, devuelve los materiales de descifrado al encriptador de elementos. Esta operación no requiere una llamada al almacén de proveedores o cualquier otro CMP.
+ Si la versión coincidente del CMP no está en su caché, o si la caché AWS KMS key excedió su valor de TTL, el proveedor más reciente solicita un CMP desde su almacén de proveedores. Envía el nombre del material y el número de versión de CMP de cifrado en la solicitud.

  1. El almacén de proveedores busca su almacenamiento persistente para el CMP utilizando el nombre del proveedor más reciente como clave de partición y el número de la versión como la clave de clasificación.
     + Si el nombre y el número de versión no están en su almacenamiento persistente, el almacén de proveedores genera una excepción. Si el almacén de proveedores se utilizó para generar el CMP, el CMP se debería almacenar en su almacenamiento persistente, a menos que se haya eliminado de forma intencionada.
     + Si el CMP con el nombre y número de versión coincidentes están en el almacenamiento persistente del almacén de proveedores, este devuelve el CMP especificado al proveedor más reciente. 

       Si el almacén del proveedor es un MetaStore, obtiene el CMP cifrado de su tabla de DynamoDB. A continuación, utiliza materiales criptográficos desde su CMP interno para descifrar el CMP cifrado antes de devolver el CMP al proveedor más reciente. Si el CMP interno es un [proveedor de KMS directo](direct-kms-provider.md), este paso incluye una llamada al [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

  1. El proveedor más reciente almacena en la memoria caché el CMP.

  1. El proveedor más reciente utiliza el CMP para generar materiales de descifrado. A continuación, devuelve los materiales de descifrado al encriptador de elementos.

## Actualizaciones del proveedor más reciente
<a name="mrp-versions"></a>

El símbolo del proveedor más reciente cambia de `MostRecentProvider` a `CachingMostRecentProvider`. 

**nota**  
El símbolo `MostRecentProvider`, que representa al proveedor más reciente, está obsoleto en la versión 1.15 del cliente de cifrado de DynamoDB para Java y en la versión 1.3 del cliente de cifrado de DynamoDB para Python, y se eliminó de las versiones 2.0.0 del cliente de cifrado de DynamoDB en las implementaciones de ambos lenguajes. En su lugar, utilice el `CachingMostRecentProvider`.

El `CachingMostRecentProvider` implementa los siguientes cambios:
+ Elimina `CachingMostRecentProvider` periódicamente los materiales criptográficos de la memoria cuando su tiempo en la memoria supera el valor configurado [time-to-live (](#most-recent-provider-ttl)TTL). 

  Es posible que `MostRecentProvider` almacene materiales criptográficos en la memoria durante el tiempo de vida del proceso. Como resultado, es posible que el proveedor más reciente no esté al tanto de los cambios de autorización. Es posible que utilice claves de cifrado una vez revocados los permisos de uso de la persona que llama. 

  Si no puede actualizar a esta nueva versión, puede obtener un efecto similar si llama periódicamente al `clear()` método de la memoria caché. Este método vacía manualmente el contenido de la caché y requiere que el proveedor más reciente solicite un nuevo CMP y nuevos materiales criptográficos. 
+ El `CachingMostRecentProvider` también incluye una configuración de tamaño de la caché que le da más control sobre la caché.

Para actualizar el `CachingMostRecentProvider`, debe cambiar el nombre del símbolo en el código. En todos los demás aspectos, el `CachingMostRecentProvider` es totalmente compatible con versiones anteriores del `MostRecentProvider`. No es necesario volver a cifrar ningún elemento de la mesa.

Sin embargo, el `CachingMostRecentProvider` genera más llamadas a la infraestructura clave subyacente. Llama a la tienda del proveedor al menos una vez en cada intervalo time-to-live (TTL). Las aplicaciones con numerosas flotas activas CMPs (debido a la rotación frecuente) o las aplicaciones con grandes flotas son las más propensas a ser sensibles a este cambio. 

Antes de publicar el código actualizado, pruébelo minuciosamente para asegurarse de que las llamadas más frecuentes no perjudiquen a la aplicación ni provoquen una limitación por parte de los servicios de los que depende su proveedor, como AWS Key Management Service (AWS KMS) o Amazon DynamoDB. Para mitigar cualquier problema de rendimiento, ajuste el tamaño de la caché y el tamaño time-to-live de la memoria caché en `CachingMostRecentProvider` función de las características de rendimiento que observe. Para obtener instrucciones, consulte [Establecer un valor time-to-live](#most-recent-provider-ttl).

# Proveedor de materiales estático
<a name="static-provider"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

El *proveedor de materiales estáticos* (Static CMP) es un [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) muy simple que está diseñado para pruebas, proof-of-concept demostraciones y compatibilidad con sistemas anteriores.

Para utilizar el CMP estático para cifrar un elemento de tabla, proporcione una clave de cifrado simétrica con [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) y una clave o un par de claves de firma. Debe proporcionar las mismas claves para descifrar el elemento cifrado. El CMP estático no realiza ninguna operación criptográfica. En lugar de ello, transfiere las claves de cifrado que suministra al encriptador de elementos sin cambios. El encriptador de elementos cifra los elementos directamente bajo la clave de cifrado. A continuación, utiliza la clave de cifrado directamente para firmarlos. 

Dado que el CMP estático no genera ningún material criptográfico único, todos los elementos de tabla que procesa están cifrados con la misma clave de cifrado y están firmados por la misma clave de firma. Cuando se utiliza la misma clave para cifrar los valores de atributos en muchos elementos o se utiliza la misma clave o par de claves para firmar todos los elementos, se arriesga a exceder los límites criptográficos de las claves. 

**nota**  
El [Proveedor estático asimétrico](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html) de la biblioteca de Java no es un proveedor estático. Solo suministra constructores alternativos para el [CMP encapsulado](wrapped-provider.md). Es seguro para uso de producción, pero se debe utilizar directamente el CMP encapsulado siempre que sea posible.

El CMP estático es uno de los varios [proveedores de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) compatibles con el cliente de cifrado de DynamoDB. Para obtener información sobre el otro, consulte. CMPs [Proveedor de materiales criptográficos](crypto-materials-providers.md)

**Para ver código de ejemplo, consulte:**
+ Java: [SymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java)

**Topics**
+ [Modo de uso](#static-cmp-how-to-use)
+ [Funcionamiento](#static-cmp-how-it-works)

## Modo de uso
<a name="static-cmp-how-to-use"></a>

Para crear un proveedor estático, suministre una clave un par de claves de cifrado o y una clave o par de claves de firma. Tiene que proporcionar material de claves para cifrar y descifrar elementos de tabla.

------
#### [ Java ]

```
// To encrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Signing key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);

// To decrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Verification key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);
```

------
#### [ Python ]

```
# You can provide encryption materials, decryption materials, or both
encrypt_keys = EncryptionMaterials(
    encryption_key = ...,
    signing_key = ...
)

decrypt_keys = DecryptionMaterials(
    decryption_key = ...,
    verification_key = ...
)

static_cmp = StaticCryptographicMaterialsProvider(
    encryption_materials=encrypt_keys
    decryption_materials=decrypt_keys
)
```

------

## Funcionamiento
<a name="static-cmp-how-it-works"></a>

El proveedor estático transfiere las claves de cifrado y de firma que suministre al encriptador de elementos, donde se utilizan directamente para cifrar y firmar los elementos de tabla. A menos que suministre distintas claves para cada elemento, se utilizan las mismas claves para todos ellos.

![\[La entrada, el procesamiento y la salida del proveedor de materiales estático en el cliente de cifrado de DynamoDB\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/staticCMP.png)


### Obtener los materiales de cifrado
<a name="static-cmp-get-encryption-materials"></a>

En esta sección se describen en detalle las entradas, las salidas y el procesamiento del proveedor de materiales estático (CMP estático) cuando recibe una solicitud para materiales de cifrado.

**Entrada** (desde la aplicación)
+ Una clave de cifrado: esta debe ser una clave simétrica, como una clave del [estándar de cifrado avanzado](https://tools.ietf.org/html/rfc3394.html) (AES). 
+ Una clave de firma: esta puede ser una clave simétrica o un par de claves asimétricas. 

**Entrada** (desde el encriptador de elementos)
+ [Contexto de cifrado de DynamoDB](concepts.md#encryption-context)

**Salida** (al encriptador de elementos)
+ La clave de cifrado transferida como entrada.
+ La clave de firma transferida como entrada.
+ Descripción de material real: la [descripción de material solicitada](DDBEC-legacy-concepts.md#legacy-material-description), si la hay, sin cambios.

### Obtener los materiales de descifrado
<a name="static-cmp-get-decryption-materials"></a>

En esta sección se describen en detalle las entradas, las salidas y el procesamiento del proveedor de materiales estático (CMP estático) cuando recibe una solicitud para materiales de descifrado.

Aunque incluye métodos independientes para obtener materiales de cifrado y obtener materiales de descifrado, el comportamiento es el mismo. 

**Entrada** (desde la aplicación)
+ Una clave de cifrado: esta debe ser una clave simétrica, como una clave del [estándar de cifrado avanzado](https://tools.ietf.org/html/rfc3394.html) (AES). 
+ Una clave de firma: esta puede ser una clave simétrica o un par de claves asimétricas. 

**Entrada** (desde el encriptador de elementos)
+ [Contexto de cifrado de DynamoDB](concepts.md#encryption-context) (no utilizado)

**Salida** (al encriptador de elementos)
+ La clave de cifrado transferida como entrada.
+ La clave de firma transferida como entrada.

# Lenguajes de programación disponibles para el Cliente de encriptación de Amazon DynamoDB
<a name="programming-languages"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

El Cliente de encriptación de Amazon DynamoDB está disponible para los siguientes lenguajes de programación. Las bibliotecas específicas de lenguaje varían, pero las implementaciones resultantes son interoperables. Por ejemplo, puede cifrar (y firmar) un elemento con el cliente Java y descifrar el elemento con el cliente Python.

Para obtener más información, consulte el tema correspondiente.

**Topics**
+ [Java](java.md)
+ [Python](python.md)

# Cliente de encriptación de Amazon DynamoDB para Java
<a name="java"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En este tema, se explica cómo instalar y utilizar el Cliente de encriptación de Amazon DynamoDB para Java. Para obtener más información sobre la programación con el cliente de cifrado de DynamoDB, consulte [los ejemplos de Java](java-examples.md), [los ejemplos del](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) repositorio GitHub y aws-dynamodb-encryption-java el Javadoc [del](https://aws.github.io/aws-dynamodb-encryption-java/) cliente de cifrado de DynamoDB.

**nota**  
Versiones 1. *x*. *x* del cliente de cifrado de DynamoDB para Java entrarán [end-of-support en](what-is-database-encryption-sdk.md#support) fase a partir de julio de 2022. Actualice a una versión más reciente tan pronto como sea posible.

**Topics**
+ [Requisitos previos](#java-prerequisites)
+ [Instalación](#java-installation)
+ [Uso del cliente de cifrado de DynamoDB para Java](java-using.md)
+ [Ejemplos de Java](java-examples.md)

## Requisitos previos
<a name="java-prerequisites"></a>

Antes de instalar el Cliente de encriptación de Amazon DynamoDB para Java, asegúrese de que cumple 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](https://www.oracle.com/java/technologies/downloads/) 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)](http://www.oracle.com/java/technologies/javase-jce8-downloads.html).

**AWS SDK para Java**  
El cliente de cifrado de DynamoDB requiere el módulo DynamoDB incluso si la aplicación no interactúa con DynamoDB. AWS SDK para Java Puede instalar todo el SDK o solo este módulo. Si utiliza Maven, añada `aws-java-sdk-dynamodb` al archivo `pom.xml`.   
Para obtener más información sobre la instalación y configuración del, consulte. AWS SDK para Java[AWS SDK para Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/getting-started.html)

## Instalación
<a name="java-installation"></a>

Puede instalar el Cliente de encriptación de Amazon DynamoDB para Java de las siguientes maneras.

**Manualmente**  
Para instalar el cliente de cifrado Amazon DynamoDB para Java, clone o descargue el repositorio. [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/) GitHub 

**Con Apache Maven**  
El Cliente de encriptación de Amazon DynamoDB para Java está disponible en [Apache Maven](https://maven.apache.org/) con la siguiente definición de dependencias.  

```
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-dynamodb-encryption-java</artifactId>
  <version>version-number</version>
</dependency>
```

Tras instalar el SDK, comience consultando el código de ejemplo de esta guía y el Javadoc del cliente de [cifrado de DynamoDB](https://aws.github.io/aws-dynamodb-encryption-java/). GitHub

# Uso del cliente de cifrado de DynamoDB para Java
<a name="java-using"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En este tema, se explican algunas de las características del cliente de cifrado de DynamoDB en Java que podrían no encontrarse en otras implementaciones de lenguaje de programación. 

[Para obtener más información sobre la programación con el cliente de cifrado de DynamoDB, consulte [los ejemplos de Java, los](java-examples.md) ejemplos de GitHub on y [el](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) Javadoc `aws-dynamodb-encryption-java repository` del cliente de cifrado de DynamoDB.](https://aws.github.io/aws-dynamodb-encryption-java/)



**Topics**
+ [Encriptadores de elementos](#attribute-encryptor)
+ [Configuración del comportamiento de almacenamiento](#save-behavior)
+ [Acciones de atributo en Java](#attribute-actions-java)
+ [Reemplazar nombres de tabla](#override-table-name)

## Encriptadores de elementos: y Dynamo AttributeEncryptor DBEncryptor
<a name="attribute-encryptor"></a>

[El cliente de cifrado de DynamoDB en Java tiene [dos cifradores de elementos](DDBEC-legacy-concepts.md#item-encryptor): el Dynamo de nivel inferior y el. DBEncryptor [AttributeEncryptor](#attribute-encryptor)](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) 

`AttributeEncryptor`Es una clase auxiliar que le ayuda a usar [Dynamo](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html) AWS SDK para Java con DBMapper el cliente de cifrado `DynamoDB Encryptor` de DynamoDB. Cuando utiliza el `AttributeEncryptor` con el `DynamoDBMapper`, cifra y firma de forma transparente los elementos cuando los guarda. También verifica y descifra de forma transparente los elementos al cargarlos.

## Configuración del comportamiento de almacenamiento
<a name="save-behavior"></a>

Puede usar el `AttributeEncryptor` y `DynamoDBMapper` para agregar o editar elementos de la tabla con atributos que solo están firmados o que están cifrados y firmados. Para estas tareas, recomendamos que lo configure para que use el comportamiento de guardado `PUT`, tal como se muestra en el siguiente ejemplo. De lo contrario, es posible que no pueda descifrar los datos. 

```
DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build();
DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
```

Si utiliza el comportamiento de almacenamiento predeterminado, que actualiza los atributos en el elemento de la tabla, solo se incluyen en la firma atributos que se hayan cambiado. Como resultado, en las lecturas posteriores de todos los atributos, la firma no se validará, porque no incluye los atributos no modelados.

También puede utilizar el comportamiento de guardado `CLOBBER`. Este comportamiento es idéntico al comportamiento de guardado `PUT`, pero deshabilita el bloqueo positivo y sobrescribe el elemento en la tabla.

Para evitar errores de firma, el cliente de cifrado de DynamoDB lanza una excepción de tiempo de ejecución si se utiliza un `AttributeEncryptor` con un `DynamoDBMapper` que no está configurado con un comportamiento seguro de `CLOBBER` o `PUT`.

Para ver este código utilizado en un ejemplo, consulte [Uso del Dynamo DBMapper](java-examples.md#java-example-dynamodb-mapper) y el ejemplo de [AwsKmsEncryptedObject.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java) en el repositorio de. `aws-dynamodb-encryption-java` GitHub

## Acciones de atributo en Java
<a name="attribute-actions-java"></a>

Las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) determinan qué valores de atributo se cifran y se firman, cuáles solo se firman y cuáles se omiten. [El método que utilice para especificar las acciones de los atributos depende de si utiliza el Dynamo de nivel inferior o el `DynamoDBMapper` Dynamo de nivel inferior. `AttributeEncryptor` DBEncryptor](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html)

**importante**  
Después de utilizar las acciones de atributo para cifrar los elementos de la tabla, agregar o quitar atributos del modelo de datos puede provocar un error de validación de firma que le impide descifrar los datos. Para ver una explicación detallada, consulte [Cambiar el modelo de datos](data-model.md).

### Acciones de atributos para el Dynamo DBMapper
<a name="attribute-action-java-mapper"></a>

Cuando utilice `DynamoDBMapper` y `AttributeEncryptor`, utilice anotaciones para especificar las acciones de atributos. El cliente de cifrado de DynamoDB utiliza las [anotaciones de atributo estándar](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Annotations.html) que definen el tipo de atributo para determinar cómo proteger un atributo. De forma predeterminada, todos los atributos están cifrados y firmados, excepto las claves principales, que están firmadas, pero no cifradas.

**nota**  
No cifre el valor de los atributos con la [anotación @Dynamo DBVersion Attribute](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html), aunque puede (y debe) firmarlos. De lo contrario, las condiciones que utilizan su valor tendrán efectos no previstos.

```
// Attributes are encrypted and signed
@DynamoDBAttribute(attributeName="Description")

// Partition keys are signed but not encrypted
@DynamoDBHashKey(attributeName="Title")

// Sort keys are signed but not encrypted
@DynamoDBRangeKey(attributeName="Author")
```

Para especificar las excepciones, utilice las anotaciones de cifrado que se definen en el cliente de cifrado de DynamoDB para Java. Si las especifica en el nivel de clase, se convierten en el valor predeterminado para la clase.

```
// Sign only
@DoNotEncrypt

// Do nothing; not encrypted or signed
@DoNotTouch
```

Por ejemplo, estas anotaciones firman pero no cifran el atributo `PublicationYear` y no cifran o firman el valor del atributo `ISBN`.

```
// Sign only (override the default)
@DoNotEncrypt
@DynamoDBAttribute(attributeName="PublicationYear")

// Do nothing (override the default)
@DoNotTouch
@DynamoDBAttribute(attributeName="ISBN")
```

### Acciones de atributos para el Dynamo DBEncryptor
<a name="attribute-action-default"></a>

Para especificar las acciones de los atributos cuando utilice la [Dinamo DBEncryptor](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) directamente, cree un `HashMap` objeto en el que los pares nombre-valor representen los nombres de los atributos y las acciones especificadas. 

Los valores válidos para las acciones de atributo que se definen en el tipo enumerado `EncryptionFlags`. Puede utilizar `ENCRYPT` y `SIGN` juntos, usar `SIGN` solo u omitir ambos. Sin embargo, si usa `ENCRYPT` solo, el cliente de cifrado de DynamoDB generará un error. No puede cifrar un atributo que no firme.

```
ENCRYPT
SIGN
```

**aviso**  
No cifre los atributos de clave principal. Deben permanecer en texto no cifrado para que DynamoDB pueda encontrar el elemento sin realizar un examen completo de la tabla.

Si especifica una clave principal en el contexto de cifrado y, a continuación, especifica `ENCRYPT` en la acción de atributo para alguno de los atributos de clave principal, el cliente de cifrado de DynamoDB genera una excepción.

Por ejemplo, el siguiente código Java crea un código `actions` HashMap que cifra y firma todos los atributos del elemento. `record` Las excepciones son la clave de partición y los atributos de clave de clasificación, que se firman pero no se cifran, y el atributo `test`, que ni se signa ni se cifra.

```
final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN);
final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN);
final Map<String, Set<EncryptionFlags>> actions = new HashMap<>();

for (final String attributeName : record.keySet()) {
  switch (attributeName) {
    case partitionKeyName: // no break; falls through to next case
    case sortKeyName:
      // Partition and sort keys must not be encrypted, but should be signed
      actions.put(attributeName, signOnly);
      break;
    case "test":
      // Don't encrypt or sign
      break;
    default:
      // Encrypt and sign everything else
      actions.put(attributeName, encryptAndSign);
      break;
  }
}
```

A continuación, cuando llama al método [encryptRecord](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html#encryptRecord-java.util.Map-java.util.Map-com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext-) del `DynamoDBEncryptor`, especifique el mapa como el valor del parámetro `attributeFlags`. Por ejemplo, esta llamada a `encryptRecord` utiliza el mapa `actions`.

```
// Encrypt the plaintext record
final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
```

## Reemplazar nombres de tabla
<a name="override-table-name"></a>

En el cliente de cifrado de DynamoDB, el nombre de la tabla de DynamoDB es un elemento del [contexto de cifrado de DynamoDB](concepts.md#encryption-context) que se pasa a los métodos de cifrado y descifrado. Al cifrar o firmar elementos de la tabla, el contexto de cifrado de DynamoDB, incluido el nombre de la tabla, está enlazado criptográficamente al texto cifrado. Si el contexto de cifrado de DynamoDB que se pasa al método de descifrado no coincide con el contexto de cifrado de DynamoDB que se pasó al método de cifrado, se produce un error en la operación de descifrado.

En ocasiones, el nombre de una tabla cambia, por ejemplo, cuando se hace una copia de seguridad de una tabla o se realiza una [point-in-time recuperación](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery.html). Al descifrar o verificar la firma de estos elementos, debe pasar el mismo contexto de cifrado de DynamoDB que se utilizó para cifrar y firmar los elementos, incluido el nombre de la tabla original. El nombre de la tabla actual no es necesario. 

Cuando se utiliza `DynamoDBEncryptor`, se ensambla el contexto de cifrado de DynamoDB manualmente. Sin embargo, si está utilizando `DynamoDBMapper`, el `AttributeEncryptor` crea el contexto de cifrado de DynamoDB para usted, incluido el nombre de la tabla actual. Para indicar a `AttributeEncryptor` que cree un contexto de cifrado con un nombre de tabla diferente, utilice el `EncryptionContextOverrideOperator`. 

Por ejemplo, el código siguiente crea instancias del proveedor de materiales criptográficos (CMP) y el `DynamoDBEncryptor`. Luego llama al método `setEncryptionContextOverrideOperator` de `DynamoDBEncryptor`. Utiliza el operador `overrideEncryptionContextTableName`, que anula un nombre de tabla. Cuando se configura de esta manera, el `AttributeEncryptor` crea un contexto de cifrado de DynamoDB que incluye `newTableName` en lugar de `oldTableName`. Para ver un ejemplo completo, consulte [EncryptionContextOverridesWithDynamoDBMapper.java.](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java)

```
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);

encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName(
                oldTableName, newTableName));
```

Cuando se llama al método de carga de `DynamoDBMapper`, que descifra y verifica el elemento, se especifica el nombre de la tabla original.

```
mapper.load(itemClass, DynamoDBMapperConfig.builder()
                .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName))
                .build());
```

También puede utilizar el operador `overrideEncryptionContextTableNameUsingMap`, que anula varios nombres de tabla. 

Normalmente los operadores de reemplazo de nombres de tabla se utilizan al descifrar datos y verificar firmas. Sin embargo, puede usarlos para establecer el nombre de la tabla en el contexto de cifrado de DynamoDB en un valor diferente al cifrar y firmar.

No utilice los operadores de anulación de nombre de tabla si está utilizando `DynamoDBEncryptor`. En su lugar, cree un contexto de cifrado con el nombre de la tabla original y envíelo al método de descifrado.

# Ejemplo de código para el cliente de cifrado de DynamoDB para Java
<a name="java-examples"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Los siguientes ejemplos muestran cómo utilizar el cliente de cifrado de DynamoDB para Java para proteger los elementos de tabla de DynamoDB en su aplicación. Puedes encontrar más ejemplos (y aportar los tuyos) en el directorio de [ejemplos](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) del [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/)repositorio en GitHub.

**Topics**
+ [¿Usando el Dynamo DBEncryptor](#java-example-ddb-encryptor)
+ [Uso del Dynamo DBMapper](#java-example-dynamodb-mapper)

## ¿Usando el Dynamo DBEncryptor
<a name="java-example-ddb-encryptor"></a>

En este ejemplo, se muestra cómo utilizar el [Dynamo](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) de nivel inferior DBEncryptor con el proveedor de [Direct](direct-kms-provider.md) KMS. El proveedor de KMS directo genera y protege sus materiales criptográficos con un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in AWS Key Management Service (AWS KMS) que usted especifique.

Puede usar cualquier [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) compatible con`DynamoDBEncryptor`, y puede usar el proveedor de Direct KMS con y. `DynamoDBMapper` [AttributeEncryptor](java-using.md#attribute-encryptor)

**[Consulte el ejemplo de código completo: .java AwsKmsEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)**

Paso 1: crear el proveedor de KMS directo  
Cree una instancia del AWS KMS cliente con la región especificada. A continuación, utilice la instancia de cliente para crear una instancia del proveedor de KMS directo con su AWS KMS key preferido.   
En este ejemplo, se utiliza el nombre de recurso de Amazon (ARN) para identificar el AWS KMS key, pero se puede utilizar [cualquier identificador clave válido](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn).   

```
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
final String region = "us-west-2";
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

Paso 2: crear un elemento  
En este ejemplo se define un elemento `record` HashMap que representa un ejemplo de una tabla.  

```
final String partitionKeyName = "partition_attribute";
final String sortKeyName = "sort_attribute";

final Map<String, AttributeValue> record = new HashMap<>();
record.put(partitionKeyName, new AttributeValue().withS("value1"));
record.put(sortKeyName, new AttributeValue().withN("55"));
record.put("example", new AttributeValue().withS("data"));
record.put("numbers", new AttributeValue().withN("99"));
record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02})));
record.put("test", new AttributeValue().withS("test-value"));
```

Paso 3: Crear una dinamo DBEncryptor  
Cree una instancia del `DynamoDBEncryptor` con el proveedor de KMS directo.  

```
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
```

Paso 4: crear un contexto de cifrado de DynamoDB  
El [contexto de cifrado de DynamoDB](concepts.md#encryption-context) contiene información acerca de la estructura de la tabla y cómo se cifra y se firma. Si utiliza el `DynamoDBMapper`, el `AttributeEncryptor` crea el contexto de cifrado automáticamente.  

```
final String tableName = "testTable";

final EncryptionContext encryptionContext = new EncryptionContext.Builder()
    .withTableName(tableName)
    .withHashKeyName(partitionKeyName)
    .withRangeKeyName(sortKeyName)
    .build();
```

Paso 5: crear el objeto de acciones de atributo  
Las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) determinan qué atributos del elemento se cifran y se firman, cuáles solo se firman y cuáles no se cifran o firman.  
En Java, para especificar las acciones de los atributos, se crea un par HashMap de pares de nombre y `EncryptionFlags` valor del atributo.   
Por ejemplo, el siguiente código de Java crea un código `actions` HashMap que cifra y firma todos los atributos `record` del elemento, excepto los atributos de la clave de partición y la clave de clasificación, que están firmados, pero no cifrados, y el `test` atributo, que no está firmado ni cifrado.  

```
final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN);
final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN);
final Map<String, Set<EncryptionFlags>> actions = new HashMap<>();

for (final String attributeName : record.keySet()) {
  switch (attributeName) {
    case partitionKeyName: // fall through to the next case
    case sortKeyName:
      // Partition and sort keys must not be encrypted, but should be signed
      actions.put(attributeName, signOnly);
      break;
    case "test":
      // Neither encrypted nor signed
      break;
    default:
      // Encrypt and sign all other attributes
      actions.put(attributeName, encryptAndSign);
      break;
  }
}
```

Paso 6: cifrar y firmar el elemento  
Para cifrar y firmar el elemento de tabla, llame al método `encryptRecord` en la instancia del `DynamoDBEncryptor`. Especifique el elemento de tabla (`record`), las acciones de atributo (`actions`) y el contexto de cifrado (`encryptionContext`).  

```
final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
```

Paso 7: colocar el elemento en la tabla de DynamoDB  
Finalmente, coloque el elemento cifrado y firmado en la tabla de DynamoDB.  

```
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();
ddb.putItem(tableName, encrypted_record);
```

## Uso del Dynamo DBMapper
<a name="java-example-dynamodb-mapper"></a>

El ejemplo siguiente le muestra cómo utilizar la clase auxiliar del DynamoDB Mapper con el [Proveedor de KMS directo](direct-kms-provider.md). El proveedor de KMS directo genera y protege sus materiales criptográficos con un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) en AWS Key Management Service (AWS KMS) que usted especifique.

Puede utilizar cualquier [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) compatible con el `DynamoDBMapper` y puede utilizar el proveedor de KMS directo con el `DynamoDBEncryptor` de nivel inferior.

**[Consulte el ejemplo de código completo: .java AwsKmsEncryptedObject](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java)**

Paso 1: crear el proveedor de KMS directo  
Cree una instancia del AWS KMS cliente con la región especificada. A continuación, utilice la instancia de cliente para crear una instancia del proveedor de KMS directo con su AWS KMS key preferido.   
En este ejemplo, se utiliza el nombre de recurso de Amazon (ARN) para identificar el AWS KMS key, pero se puede utilizar [cualquier identificador clave válido](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id).   

```
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
final String region = "us-west-2";
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

Paso 2: Crear DynamoDB Encryptor y Dynamo DBMapper  
Utilice el Proveedor de KMS directo que creó en el paso anterior para crear una instancia del [Encriptador de DynamoDB](java-using.md#attribute-encryptor). Debe crear instancias en el Encriptador de DynamoDB de nivel inferior para utilizar DynamoDB Mapper.  
A continuación, cree una instancia de base de datos de DynamoDB y una configuración de mapeador, y úselas para crear una instancia de DynamoDB Mapper.   
Al utilizar el `DynamoDBMapper` para añadir o editar elementos firmados (o cifrados y firmados), configúrelo para [usar un comportamiento de almacenamiento](java-using.md#save-behavior), como `PUT`, que incluye todos los atributos, como se muestra en el ejemplo siguiente. De lo contrario, es posible que no pueda descifrar los datos. 

```
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp)
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build();

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build();
DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
```

Paso 3: Definir la tabla de DynamoDB  
A continuación, defina la tabla de DynamoDB. Utilice anotaciones para especificar las [acciones del atributo](java-using.md#attribute-actions-java). En este ejemplo, se crea una tabla de DynamoDB, `ExampleTable`, y una clase `DataPoJo` que representa elementos de la tabla.   
En este ejemplo de tabla, los atributos de clave principal se firmarán, pero no se cifrarán. Esto se aplica al `partition_attribute`, que se ha anotado con `@DynamoDBHashKey`, y el `sort_attribute`, que se ha anotado con `@DynamoDBRangeKey`.   
Los atributos que son anotados con `@DynamoDBAttribute`, como `some numbers`, se cifrarán y firmarán. Las excepciones son atributos que utilizan las anotaciones de cifrado `@DoNotEncrypt` (solo firmar) o `@DoNotTouch` (no cifrar ni firmar) definidas por el cliente de cifrado de DynamoDB. Por ejemplo, ya que el atributo `leave me` tiene una anotación `@DoNotTouch`, no se cifrará ni se firmará.  

```
@DynamoDBTable(tableName = "ExampleTable")
public static final class DataPoJo {
  private String partitionAttribute;
  private int sortAttribute;
  private String example;
  private long someNumbers;
  private byte[] someBinary;
  private String leaveMe;

  @DynamoDBHashKey(attributeName = "partition_attribute")
  public String getPartitionAttribute() {
    return partitionAttribute;
  }

  public void setPartitionAttribute(String partitionAttribute) {
    this.partitionAttribute = partitionAttribute;
  }

  @DynamoDBRangeKey(attributeName = "sort_attribute")
  public int getSortAttribute() {
    return sortAttribute;
  }

  public void setSortAttribute(int sortAttribute) {
    this.sortAttribute = sortAttribute;
  }

  @DynamoDBAttribute(attributeName = "example")
  public String getExample() {
    return example;
  }

  public void setExample(String example) {
    this.example = example;
  }

  @DynamoDBAttribute(attributeName = "some numbers")
  public long getSomeNumbers() {
    return someNumbers;
  }

  public void setSomeNumbers(long someNumbers) {
    this.someNumbers = someNumbers;
  }

  @DynamoDBAttribute(attributeName = "and some binary")
  public byte[] getSomeBinary() {
    return someBinary;
  }

  public void setSomeBinary(byte[] someBinary) {
    this.someBinary = someBinary;
  }

  @DynamoDBAttribute(attributeName = "leave me")
  @DoNotTouch
  public String getLeaveMe() {
    return leaveMe;
  }

  public void setLeaveMe(String leaveMe) {
    this.leaveMe = leaveMe;
  }

  @Override
  public String toString() {
    return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute="
        + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers
        + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]";
  }
}
```

Paso 4: Cifrar y guardar un elemento de la tabla  
Ahora, al crear un elemento de tabla y utilizar DynamoDB Mapper para guardarlo, el elemento se cifra automáticamente y firma antes de que se agregue a la tabla.  
Este ejemplo define un elemento de tabla llamado `record`. Antes de que se guarde en la tabla, sus atributos se cifran y firman en función de las anotaciones de la clase `DataPoJo`. En este caso, todos los atributos salvo `PartitionAttribute`, `SortAttribute` y `LeaveMe` se cifran y se firman. `PartitionAttribute` y `SortAttributes` solo se firman. El atributo `LeaveMe` no está cifrado o firmado.  
Para cifrar y firmar el elemento `record`y, a continuación, añadirlo a `ExampleTable`, llame al método `save` de la clase `DynamoDBMapper`. Dado que el DynamoDB mapper está configurado para utilizar el `PUT` comportamiento de almacenamiento, el elemento sustituye a cualquier elemento con las mismas claves principales, en lugar de actualizarla. De este modo, se garantiza que las firmas coincidan y puede descifrar el elemento cuando se obtiene de la tabla.  

```
DataPoJo record = new DataPoJo();
record.setPartitionAttribute("is this");
record.setSortAttribute(55);
record.setExample("data");
record.setSomeNumbers(99);
record.setSomeBinary(new byte[]{0x00, 0x01, 0x02});
record.setLeaveMe("alone");

mapper.save(record);
```

# Cliente de cifrado de DynamoDB para Python
<a name="python"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente [pasó a llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En este tema, se explica cómo instalar y utilizar el cliente de cifrado de DynamoDB para en Python. Puede encontrar el código en el [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)repositorio de GitHub, incluido un [código de muestra](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) completo y probado que le ayudará a empezar.

**nota**  
Versiones 1. *x*. *x* y 2. *x*. *x* del cliente de cifrado de DynamoDB para Python entrarán en vigor [end-of-support en](what-is-database-encryption-sdk.md#support) julio de 2022. Actualice a una versión más reciente tan pronto como sea posible.

**Topics**
+ [Requisitos previos](#python-prerequisites)
+ [Instalación](#python-installation)
+ [Uso del cliente de cifrado de DynamoDB para Python](python-using.md)
+ [Ejemplos de Python](python-examples.md)

## Requisitos previos
<a name="python-prerequisites"></a>

Antes de instalar el Cliente de encriptación de Amazon DynamoDB para Python, asegúrese de que cumple los siguientes requisitos previos.

**Una versión compatible de Python**  
El cliente de cifrado de Amazon DynamoDB para las versiones 3.3.0 y posteriores de Python requiere Python 3.8 o posterior. Para descargar Python, visite el sitio de [descargas de Python](https://www.python.org/downloads/).  
Las versiones anteriores del Cliente de encriptación de Amazon DynamoDB para Python admiten Python 2.7 y Python 3.4 y versiones posteriores, pero le recomendamos que utilice la versión más reciente del cliente de cifrado de DynamoDB.

**La herramienta de instalación pip para Python**  
Python 3.6 y versiones posteriores incluyen **pip**, aunque es posible que desee actualizarlo. Para obtener más información acerca de la actualización o la instalación de pip, consulte la sección sobre la [instalación](https://pip.pypa.io/en/latest/installation/) en la documentación de **pip**.

## Instalación
<a name="python-installation"></a>

Utilice **pip** para instalar el Cliente de encriptación de Amazon DynamoDB para Python, como se muestra en los siguientes ejemplos.

**Para instalar la versión más reciente**  

```
pip install dynamodb-encryption-sdk
```

Para obtener más información acerca de cómo utilizar **pip** para instalar y actualizar paquetes, consulte la página sobre la [instalación de paquetes](https://packaging.python.org/tutorials/installing-packages/).

El cliente de cifrado de DynamoDB requiere la [biblioteca de criptografía](https://cryptography.io/en/latest/) en todas las plataformas. Todas las versiones de **pip** instalan y compilan la biblioteca **cryptography** en Windows. **pip** 8.1 y las versiones posteriores instalan y compilan la biblioteca **cryptography** en Linux. Si utiliza una versión anterior de **pip** y su entorno Linux no dispone de las herramientas necesarias para compilar la biblioteca **cryptography**, tiene que instalarlas. Para obtener más información, consulte [Building cryptography on Linux](https://cryptography.io/en/latest/installation/#building-cryptography-on-linux).

Puede obtener la última versión de desarrollo del cliente de cifrado de DynamoDB desde [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)el repositorio en adelante. GitHub

Después de instalar el cliente de cifrado de DynamoDB, comience examinando el código de Python de ejemplo de esta guía.

# Uso del cliente de cifrado de DynamoDB para Python
<a name="python-using"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En este tema, se explican algunas de las características del cliente de cifrado de DynamoDB para Python que podrían no encontrarse en otras implementaciones de lenguaje de programación. Estas características se han diseñado para facilitar el uso del cliente de cifrado de DynamoDB de la forma más segura. A menos que tenga un caso de uso inusual, le recomendamos que las utilice.

Para obtener más información sobre la programación con el cliente de cifrado de DynamoDB, consulte los ejemplos de [Python](python-examples.md) de esta guía, [los ejemplos del](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) repositorio GitHub y aws-dynamodb-encryption-python la documentación de [Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/) del cliente de cifrado de DynamoDB.

**Topics**
+ [Clases auxiliares de cliente](#python-helpers)
+ [TableInfo clase](#table-info)
+ [Acciones de atributo en Python](#python-attribute-actions)

## Clases auxiliares de cliente
<a name="python-helpers"></a>

El cliente de cifrado de DynamoDB para Python incluye varias clases auxiliares de cliente, que interactúan con las clases de Boto 3 para DynamoDB. Estas clases auxiliares se han diseñado para facilitar agregar cifrado y firma a su aplicación de DynamoDB existente y evitar los problemas más habituales del siguiente modo:
+ Evite cifrar la clave principal del elemento, ya sea añadiendo una acción de anulación de la clave principal del objeto o lanzando una excepción si el [AttributeActions](#python-attribute-actions)objeto indica explícitamente al cliente que cifre la clave principal. `AttributeActions` Si la acción predeterminada en su objeto `AttributeActions` es `DO_NOTHING`, las clases auxiliares de cliente utilizan dicha acción para la clave principal. De lo contrario, utilizan `SIGN_ONLY`.
+ Cree un [TableInfo objeto y complete](#python-helpers) el contexto de [cifrado de DynamoDB en función de una llamada a DynamoDB](concepts.md#encryption-context). Esto ayuda a garantizar que el contexto de cifrado de DynamoDB sea exacto y el cliente pueda identificar la clave principal.
+ Admite métodos, tales como `put_item` y `get_item`, que cifran y descifran de modo transparente los elementos de tabla al escribir o leer desde una tabla de DynamoDB. Solo el método `update_item` no se admite.

Puede utilizar las clases auxiliares de cliente en lugar de interactuar directamente con el [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor) de nivel inferior. Utilice estas clases a menos que tenga que establecer opciones avanzadas en el encriptador de elementos.

Las clases auxiliares de cliente incluyen:
+ [EncryptedTable](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/table.html#module-dynamodb_encryption_sdk.encrypted.table)para las aplicaciones que utilizan el recurso [Tabla](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#table) de DynamoDB para procesar una tabla a la vez.
+ [EncryptedResource](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/resource.html)para aplicaciones que utilizan la clase [Service Resource](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#service-resource) de DynamoDB para el procesamiento por lotes.
+ [EncryptedClient](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/client.html)para aplicaciones que utilizan el [cliente de nivel inferior de DynamoDB](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#client).

Para usar las clases auxiliares del cliente, la persona que llama debe tener permiso para llamar a la operación de DynamoDB en la tabla de destino [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html).

## TableInfo clase
<a name="table-info"></a>

La [TableInfo](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/tools/structures.html#dynamodb_encryption_sdk.structures.TableInfo)clase es una clase auxiliar que representa una tabla de DynamoDB, completa con campos para su clave principal e índices secundarios. Le ayuda a obtener información precisa y en tiempo real sobre la tabla.

Si utiliza una [clase auxiliar de cliente](#python-helpers), crea y utiliza un objeto `TableInfo` automáticamente. De lo contrario, puede crear una explícitamente. Para ver un ejemplo, consulta [Utilice el encriptador de elementos](python-examples.md#python-example-item-encryptor).

Cuando se llama al `refresh_indexed_attributes` método en un `TableInfo` objeto, se rellenan los valores de las propiedades del objeto mediante una llamada a la operación DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). Consultar la tabla ofrece mucha más confianza que codificar de forma rígida los nombres de índice. La clase `TableInfo` incluye además una `encryption_context_values` propiedad que proporciona los valores requeridos para el [contexto de cifrado de DynamoDB](concepts.md#encryption-context). 

Para usar el `refresh_indexed_attributes` método, la persona que llama debe tener permiso para llamar a la operación de [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)DynamoDB en la tabla de destino.

## Acciones de atributo en Python
<a name="python-attribute-actions"></a>

Las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) indican al encriptador de elementos qué acciones hay que realizar en cada atributo del elemento. Para especificar acciones de atributo en Python, cree un objeto `AttributeActions` con una acción predeterminada y cualquier excepción para atributos particulares. Los valores válidos se definen en el tipo enumerado `CryptoAction`.

**importante**  
Después de utilizar las acciones de atributo para cifrar los elementos de la tabla, agregar o quitar atributos del modelo de datos puede provocar un error de validación de firma que le impide descifrar los datos. Para ver una explicación detallada, consulte [Cambiar el modelo de datos](data-model.md).

```
DO_NOTHING = 0
SIGN_ONLY = 1
ENCRYPT_AND_SIGN = 2
```

Por ejemplo, este objeto `AttributeActions` establece `ENCRYPT_AND_SIGN` como predeterminado para todos los atributos y especifica excepciones para los atributos `ISBN` y `PublicationYear`.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={
        'ISBN': CryptoAction.DO_NOTHING,
        'PublicationYear': CryptoAction.SIGN_ONLY
    }
)
```

Si utiliza una [clase auxiliar de cliente](#python-helpers), no tiene que especificar una acción de atributo para los atributos de clave principal. Las clases auxiliares de cliente impiden que cifre su clave principal.

Si no utiliza una clase auxiliar de cliente y la acción predeterminada es `ENCRYPT_AND_SIGN`, debe especificar una acción para la clave principal. La acción recomendada para las claves principales es `SIGN_ONLY`. Para facilitarlo, utilice el método `set_index_keys`, que utiliza SIGN\$1ONLY para claves principales o DO\$1NOTHING, cuando esa es la acción predeterminada.

**aviso**  
No cifre los atributos de clave principal. Deben permanecer en texto no cifrado para que DynamoDB pueda encontrar el elemento sin realizar un examen completo de la tabla.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
)
actions.set_index_keys(*table_info.protected_index_keys())
```

# Código de ejemplo para el cliente de cifrado de DynamoDB para Python
<a name="python-examples"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En los siguientes ejemplos, se muestra cómo utilizar el cliente de cifrado de DynamoDB para Python para proteger los datos de DynamoDB en su aplicación. Puedes encontrar más ejemplos (y aportar los tuyos propios) en el directorio de [ejemplos](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) del [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)repositorio de. GitHub

**Topics**
+ [Usa la clase de ayuda al EncryptedTable cliente](#python-example-table)
+ [Utilice el encriptador de elementos](#python-example-item-encryptor)

## Usa la clase de ayuda al EncryptedTable cliente
<a name="python-example-table"></a>

El ejemplo siguiente le muestra cómo utilizar el [proveedor de KMS directo](direct-kms-provider.md) con la `EncryptedTable` [clase auxiliar cliente](python-using.md#python-helpers). Este ejemplo utiliza el mismo [proveedor de materiales criptográficos](DDBEC-legacy-concepts.md#concept-material-provider) que el ejemplo [Utilice el encriptador de elementos](#python-example-item-encryptor) siguiente. Sin embargo, utiliza la clase `EncryptedTable` en lugar de interactuar directamente con el [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor) de nivel inferior.

Comparando estos ejemplos, puede ver el trabajo que realiza la clase auxiliar cliente automáticamente. Esto incluye la creación del [contexto de cifrado de DynamoDB](concepts.md#encryption-context) y asegurarse de que los atributos de clave principal estén siempre firmados, pero nunca cifrados. Para crear el contexto de cifrado y descubrir la clave principal, las clases auxiliares del cliente llaman a la operación DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). Para ejecutar este código, debe tener permiso para llamar a esta operación.

**Vea la muestra de código completa**: [aws\$1kms\$1encrypted\$1table.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py)

Paso 1: crear la tabla  
Empiece creando una instancia de una tabla de DynamoDB estándar con el nombre de la tabla.  

```
table_name='test-table'
table = boto3.resource('dynamodb').Table(table_name)
```

Paso 2: crear un proveedor de materiales criptográficos  
Cree una instancia del [proveedor de materiales criptográficos](crypto-materials-providers.md) (CMP) que ha seleccionado.  
Este ejemplo utiliza el [proveedor de KMS directo](direct-kms-provider.md), pero puede utilizar cualquier CMP compatible. Para crear un proveedor de KMS directo, especifique un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys). En este ejemplo se utiliza el nombre de recurso de Amazon (ARN) del AWS KMS key, pero se puede utilizar cualquier identificador clave válido.  

```
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
```

Paso 3: crear el objeto de acciones de atributo  
Las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) indican al encriptador de elementos qué acciones hay que realizar en cada atributo del elemento. El objeto `AttributeActions` de este ejemplo cifra y firma todos los elementos, excepto el atributo `test`, que se pasa por alto.  
No especifique acciones de atributo para los atributos de clave principal cuando utilice una clase auxiliar cliente. La clase `EncryptedTable` firma, pero no cifra nunca, los atributos de clave principal.  

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={'test': CryptoAction.DO_NOTHING}
)
```

Paso 4: crear la tabla cifrada  
Cree la tabla cifrada utilizando la tabla estándar, el proveedor de KMS directo y las acciones de atributo. Este paso completa la configuración.   

```
encrypted_table = EncryptedTable(
    table=table,
    materials_provider=kms_cmp,
    attribute_actions=actions
)
```

Paso 5: colocar el elemento de texto no cifrado en la tabla  
Cuando se llama al método `put_item` en la `encrypted_table`, los elementos de la tabla se cifran de modo transparente, se firman y se agrega a su tabla de DynamoDB.  
Primero, defina el elemento de tabla.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
A continuación, colóquelo en la tabla.  

```
encrypted_table.put_item(Item=plaintext_item)
```

Para obtener el elemento desde la tabla de DynamoDB en su forma cifrada, llame al método `get_item` en el objeto `table`. Para obtener el objeto descifrado, llame al método `get_item` en el objeto `encrypted_table`.

## Utilice el encriptador de elementos
<a name="python-example-item-encryptor"></a>

En este ejemplo, se muestra cómo interactuar directamente con el [encriptador de elementos](DDBEC-legacy-concepts.md#item-encryptor) en la al cifrar elementos de tabla, en lugar de utilizar las [clases auxiliares de cliente](python-using.md#python-helpers) que interactúan con el encriptador de elementos. 

Cuando se utiliza esta técnica, crea el contexto de cifrado de DynamoDB y el objeto de configuración (`CryptoConfig`) manualmente. Además, cifra los elementos en una llamada y los coloca en su tabla de DynamoDB en una llamada independiente. Esto le permite personalizar sus `put_item` llamadas y utilizar el cliente de cifrado de DynamoDB para cifrar y firmar datos estructurados que nunca se envían a DynamoDB.

Este ejemplo utiliza el [proveedor de KMS directo](direct-kms-provider.md), pero puede utilizar cualquier CMP compatible.

**Vea la muestra de código completa**: [aws\$1kms\$1encrypted\$1item.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

Paso 1: crear la tabla  
Empiece creando una instancia de un recurso de tabla de DynamoDB estándar con el nombre de la tabla.  

```
table_name='test-table'
table = boto3.resource('dynamodb').Table(table_name)
```

Paso 2: crear un proveedor de materiales criptográficos  
Cree una instancia del [proveedor de materiales criptográficos](crypto-materials-providers.md) (CMP) que ha seleccionado.  
Este ejemplo utiliza el [proveedor de KMS directo](direct-kms-provider.md), pero puede utilizar cualquier CMP compatible. Para crear un proveedor de KMS directo, especifique un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys). En este ejemplo se utiliza el nombre de recurso de Amazon (ARN) del AWS KMS key, pero se puede utilizar cualquier identificador clave válido.  

```
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
```

Paso 3: Usa la clase TableInfo auxiliar  
Para obtener información sobre la tabla de DynamoDB, cree una instancia de [TableInfo](python-using.md#python-helpers)la clase auxiliar. Cuando trabaja directamente con el encriptador de elementos, tiene que crear una instancia `TableInfo` y llamar a sus métodos. Las [clases auxiliares de cliente](python-using.md#python-helpers) lo hacen automáticamente.  
El `refresh_indexed_attributes` método `TableInfo` utiliza la operación [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)DynamoDB para obtener información precisa y en tiempo real sobre la tabla. Incluye su clave principal y sus índices secundarios locales y globales. El intermediario tiene que tener permiso para llamar a `DescribeTable`.  

```
table_info = TableInfo(name=table_name)
table_info.refresh_indexed_attributes(table.meta.client)
```

Paso 4: crear el contexto de cifrado de DynamoDB  
El [contexto de cifrado de DynamoDB](concepts.md#encryption-context) contiene información acerca de la estructura de la tabla y cómo se cifra y se firma. En este ejemplo, se crea un contexto de cifrado de DynamoDB explícitamente, porque interactúa con el encriptador de elementos. Las [clases auxiliares de cliente](python-using.md#python-helpers) crean el contexto de cifrado de DynamoDB para usted.   
Para obtener la clave de partición y la clave de clasificación, puede usar las propiedades de la clase [TableInfo](python-using.md#python-helpers)auxiliar.   

```
index_key = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
}

encryption_context = EncryptionContext(
    table_name=table_name,
    partition_key_name=table_info.primary_index.partition,
    sort_key_name=table_info.primary_index.sort,
    attributes=dict_to_ddb(index_key)
)
```

Paso 5: crear el objeto de acciones de atributo  
Las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) indican al encriptador de elementos qué acciones hay que realizar en cada atributo del elemento. El objeto `AttributeActions` en este ejemplo cifra y firma todos los elementos, excepto los atributos de clave principal, que se firman, pero no se cifran y el atributo `test`, que se pasa por alto.  
Cuando se interactúa directamente con el encriptador de elementos y la acción predeterminada es `ENCRYPT_AND_SIGN`, debe especificar una acción alternativa para la clave principal. Puede utilizar el método `set_index_keys`, que usa `SIGN_ONLY` para la clave principal o utiliza `DO_NOTHING` si es la acción predeterminada.  
Para especificar la clave principal, en este ejemplo se utilizan las claves de índice del [TableInfo](python-using.md#python-helpers)objeto, que se rellenan con una llamada a DynamoDB. Esta técnica es más segura que los nombres de clave principal de codificación rígida.  

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={'test': CryptoAction.DO_NOTHING}
)
actions.set_index_keys(*table_info.protected_index_keys())
```

Paso 6: crear la configuración para el elemento  
Para configurar el cliente de cifrado de DynamoDB, utilice los objetos que acaba de crear en [CryptoConfig](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/config.html)una configuración para el elemento de la tabla. Las clases auxiliares del cliente las crean por usted. CryptoConfig   

```
crypto_config = CryptoConfig(
    materials_provider=kms_cmp,
    encryption_context=encryption_context,
    attribute_actions=actions
)
```

Paso 7: cifrar el elemento  
En este paso, se cifra y firma el elemento, pero no lo coloca en la tabla de DynamoDB.   
Cuando utiliza una clase auxiliar de cliente, sus elementos se cifran y se firman de modo transparente y, a continuación, se agregan a su tabla de DynamoDB cuando llama al `put_item` método de la clase auxiliar. Cuando utiliza el encriptador de elementos directamente, las acciones de cifrado y colocación son independientes.  
En primer lugar, cree un elemento de texto no cifrado.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_key': 55,
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
A continuación, cífrelo y fírmelo. El método `encrypt_python_item` requiere el objeto de configuración `CryptoConfig`.  

```
encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
```

Paso 8: colocar el elemento en la tabla  
En este paso, se coloca el elemento cifrado y firmado en la tabla de DynamoDB.  

```
table.put_item(Item=encrypted_item)
```

Para ver el elemento cifrado, llame al método `get_item` en el objeto `table` original, en lugar del objeto `encrypted_table`. Obtiene el elemento de la tabla DynamoDB sin verificarlo y descifrarlo.

```
encrypted_item = table.get_item(Key=partition_key)['Item']
```

En la imagen siguiente se muestra una parte de un elemento de tabla cifrado y firmado de ejemplo.

Los valores de atributo cifrados son datos binarios. Los nombres y los valores de los atributos de clave principal (`partition_attribute` y `sort_attribute`) y el atributo `test` permanecen en texto no cifrado. La salida muestra además el atributo que contiene la firma (`*amzn-ddb-map-sig*`) y el [atributo de descripción de materiales](DDBEC-legacy-concepts.md#legacy-material-description) (`*amzn-ddb-map-desc*`).

![\[Un fragmento de un elemento cifrado y firmado\]](http://docs.aws.amazon.com/es_es/database-encryption-sdk/latest/devguide/images/encrypted-item-closeup.png)


# Cambiar el modelo de datos
<a name="data-model"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cada vez que cifra o descifra un elemento, tiene que proporcionar acciones de atributo [Acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) que indiquen al DynamoDB qué atributos cifrar y firmar, qué atributos firmar (pero no cifrar) y cuáles omitir. Las acciones de atributo no se guardan en el elemento cifrado y no actualiza automáticamente las acciones de atributo.

**importante**  
El cliente de cifrado de DynamoDB no admite el cifrado de datos de tablas de DynamoDB existentes y no cifrados.

Cada vez que cambie el modelo de datos, es decir, cuando agregue o quite atributos de los elementos de la tabla, corre el riesgo de que se produzca un error. Si las acciones de atributo que especifique no cuentan para todos los atributos del elemento, el elemento podría no cifrarse y firmarse del modo previsto. Lo que es más importante, si las acciones de atributo que proporciona al descifrar un elemento difieren de las acciones de atributo que proporcione al cifrar el elemento, la verificación de la firma podría fallar. 

Por ejemplo, si las acciones de atributo utilizadas para cifrar el elemento indican que se firme el atributo `test`, la firma en el elemento incluirá el atributo `test`. Pero, si las acciones de atributo utilizadas para descifrar el elemento no se tienen en cuenta para el atributo `test`, la verificación devolverá un error, ya que el cliente intentará verificar una firma que no incluye el atributo `test`. 

Este es un problema particular cuando varias aplicaciones leen y escriben los mismos elementos de porque debe calcular la misma firma para los elementos en todas las aplicaciones. También es un problema para cualquier aplicación distribuida porque los cambios en las acciones de atributos deben propagarse a todos los hosts. Incluso si un host accede a sus tablas de en un proceso, establecer un proceso de prácticas recomendadas ayudará a evitar errores si el proyecto se vuelve más complejo.

Para evitar errores de validación de firmas que le impidan leer los elementos de la tabla, siga las instrucciones siguientes.
+ [Añadir un atributo](#add-attribute): si el nuevo atributo cambia sus acciones de atributo, implemente completamente el cambio de acción de atributo antes de incluir el nuevo atributo en un elemento.
+ [Eliminar un atributo](#remove-attribute): si dejas de usar un atributo en tus artículos, no cambies las acciones de los atributos. 
+ Cambiar la acción: después de haber utilizado una configuración de acciones de atributos para cifrar los elementos de la tabla, no podrá cambiar de forma segura la acción predeterminada o la acción de un atributo existente sin volver a cifrar todos los elementos de la tabla.

Los errores de validación de firmas pueden ser extremadamente difíciles de resolver, por lo que el mejor enfoque es prevenirlos. 

**Topics**
+ [Adición de un atributo](#add-attribute)
+ [Eliminación de un atributo](#remove-attribute)

## Adición de un atributo
<a name="add-attribute"></a>

Al agregar un nuevo atributo a los elementos de tabla, es posible que tenga que cambiar las acciones de atributo. Para evitar errores de validación de firmas, se recomienda implementar este cambio en un proceso de dos etapas. Verifique que la primera etapa esté completa antes de comenzar la segunda etapa.

1. Cambie las acciones de atributo en todas las aplicaciones que leen o escriben en la tabla. Implemente estos cambios y confirme que la actualización se ha propagado a todos los hosts de destino. 

1. Escriba valores en el nuevo atributo de los elementos de la tabla.

Este enfoque de dos etapas garantiza que todas las aplicaciones y hosts tengan las mismas acciones de atributo y calculará la misma firma antes de que cualquier otro encuentre el nuevo atributo. Esto es importante incluso cuando la acción del atributo es *Do nothing* (no cifrar ni firmar), porque el valor predeterminado de algunos encriptadores es cifrar y firmar.

Los siguientes ejemplos muestran el código de la primera etapa de este proceso. Agregan un nuevo atributo de elemento, `link`, que almacena un vínculo a otro elemento de tabla. Dado que este vínculo debe permanecer como texto sin formato, el ejemplo le asigna la acción de solo firma. Después de implementar completamente este cambio y comprobar que todas las aplicaciones y hosts tienen las nuevas acciones de atributo, puede comenzar a usar el atributo `link` en los elementos de tabla.

------
#### [ Java DynamoDB Mapper ]

Cuando usa `DynamoDB Mapper` y `AttributeEncryptor`, todos los atributos están cifrados y firmados por defecto, excepto las claves principales, que están firmadas pero no cifradas. Para especificar una acción de solo firma, utilice la anotación `@DoNotEncrypt`. 

En este ejemplo se utiliza la anotación `@DoNotEncrypt` para el nuevo atributo `link`.

```
@DynamoDBTable(tableName = "ExampleTable")
public static final class DataPoJo {
  private String partitionAttribute;
  private int sortAttribute;
  private String link;

  @DynamoDBHashKey(attributeName = "partition_attribute")
  public String getPartitionAttribute() {
    return partitionAttribute;
  }
    
  public void setPartitionAttribute(String partitionAttribute) {
    this.partitionAttribute = partitionAttribute;
  }

  @DynamoDBRangeKey(attributeName = "sort_attribute")
  public int getSortAttribute() {
    return sortAttribute;
  }

  public void setSortAttribute(int sortAttribute) {
    this.sortAttribute = sortAttribute;
  }

  @DynamoDBAttribute(attributeName = "link")
  @DoNotEncrypt
  public String getLink() {
    return link;
  }

  public void setLink(String link) {
    this.link = link;
  }

  @Override
  public String toString() {
    return "DataPoJo [partitionAttribute=" + partitionAttribute + ",
        sortAttribute=" + sortAttribute + ",
        link=" + link + "]";
  }
}
```

------
#### [ Java DynamoDB encryptor ]

 En el encriptador de nivel inferior, debe establecer acciones para cada atributo. En este ejemplo se utiliza una instrucción switch donde el valor predeterminado es `encryptAndSign` y se especifican excepciones para la clave de partición, la clave de clasificación y el nuevo atributo `link`. En este ejemplo, si el código de atributo de vínculo no se implementó completamente antes de utilizarlo, algunas aplicaciones cifrarían y firmarían el atributo de vínculo, pero solo lo firmarían otras.

```
for (final String attributeName : record.keySet()) {
    switch (attributeName) {
        case partitionKeyName:
            // fall through to the next case
        case sortKeyName:
            // partition and sort keys must be signed, but not encrypted
            actions.put(attributeName, signOnly);
            break;
        case "link":
            // only signed
            actions.put(attributeName, signOnly);
            break;
        default:
            // Encrypt and sign all other attributes
            actions.put(attributeName, encryptAndSign);
            break;
    }
}
```

------
#### [ Python ]

En DynamoDB para Python, puede especificar una acción predeterminada para todos los atributos y, a continuación, especificar excepciones. 

Si utiliza una [clase auxiliar de cliente](python-using.md#python-helpers) de Python, no tiene que especificar una acción de atributo para los atributos de clave principal. Las clases auxiliares de cliente impiden que cifre su clave principal. Sin embargo, si no está utilizando una clase auxiliar de cliente, debe establecer la acción SIGN\$1ONLY en la clave de partición y la clave de clasificación. Si accidentalmente cifra la partición o la clave de clasificación, no podrá recuperar los datos sin un análisis completo de la tabla.

En este ejemplo se especifica una excepción para el nuevo atributo `link`, que obtiene la acción `SIGN_ONLY`.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={
      'example': CryptoAction.DO_NOTHING,  
      'link': CryptoAction.SIGN_ONLY
    }
)
```

------

## Eliminación de un atributo
<a name="remove-attribute"></a>

Si ya no necesita un atributo en los elementos que se han cifrado con , puede dejar de usar el atributo. Sin embargo, no elimine ni cambie la acción de ese atributo. Si lo hace y, a continuación, encuentra un elemento con ese atributo, la firma calculada para el artículo no coincidirá con la firma original y la validación de la firma fallará.

Aunque podría tener la tentación de eliminar todos los rastros del atributo del código, agregue un comentario de que el elemento ya no se usa en lugar de eliminarlo. Incluso si realiza un análisis de tabla completo para eliminar todas las instancias del atributo, un elemento cifrado con ese atributo podría almacenarse en caché o estar en proceso en algún lugar de la configuración.

# Solución de problemas en la aplicación DynamoDB Encryption Client
<a name="troubleshooting"></a>

**nota**  
Nuestra biblioteca de cifrado del cliente pasó a [llamarse SDK de cifrado de bases de datos de AWS](DDBEC-rename.md). En el siguiente tema, se presenta información sobre las versiones 1.*x*—2.*x* del cliente de cifrado de DynamoDB para Java y versiones 1.*x*—3.*x* del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el [SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

En esta sección se describen los problemas que podría encontrar al utilizar el y se ofrecen sugerencias para resolverlos.

Para enviar comentarios sobre el cliente de cifrado de DynamoDB, registre un problema en [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/)el repositorio o. [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/) GitHub 

Para enviar comentarios sobre esta documentación, utilice el enlace de comentarios de cualquier página.

**Topics**
+ [Acceso denegado](#kms-permissions)
+ [Errores de verificación de firma](#change-data-model)
+ [Problemas con las tablas globales de versiones anteriores](#fix-global-tables)
+ [Rendimiento deficiente del proveedor más reciente](#mrp-ttl-delay)

## Acceso denegado
<a name="kms-permissions"></a>

**Problema**: su aplicación ha denegado el acceso a un recurso que la necesita.

**Sugerencia**: obtenga información acerca de los permisos requeridos y agréguelos al contexto de seguridad en el que se ejecuta su aplicación.

**Detalles**

Para ejecutar una aplicación que usa una biblioteca de , el intermediario debe tener permiso para utilizar sus componentes. De lo contrario, se les denegará el acceso a los elementos requeridos. 
+ El cliente de cifrado de DynamoDB no requiere una cuenta de Amazon Web Services (AWS) ni depende de ningún servicio. AWS Sin embargo, si su aplicación lo usa AWS, necesitará [una cuenta Cuenta de AWS](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) y [usuarios que tengan permiso](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html) para usar la cuenta.
+ El cliente de cifrado de DynamoDB no requiere Amazon DynamoDB. Sin embargo, si la aplicación que utiliza el cliente crea tablas de DynamoDB, coloca elementos en una tabla u obtiene elementos de una tabla, el intermediario debe tener permiso para utilizar las operaciones de DynamoDB requeridas en su Cuenta de AWS. Para obtener más información, consulte los [temas de control de acceso](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html) en la *Guía para desarrolladores de Amazon DynamoDB*.
+ Si la aplicación utiliza una [clase auxiliar de cliente](python-using.md#python-helpers) en el cliente de cifrado de DynamoDB para Python, la persona que llama debe tener permiso para llamar a la operación de DynamoDB. [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)
+ El cliente de cifrado de DynamoDB no AWS Key Management Service requiere ().AWS KMS[Sin embargo, si la aplicación utiliza un [proveedor de materiales de Direct KMS](direct-kms-provider.md) o utiliza un [proveedor más reciente](most-recent-provider.md) con un almacén de proveedores que lo utilice AWS KMS, la persona que llama debe tener permiso para utilizar las operaciones AWS KMS[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)y descifrar.](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

## Errores de verificación de firma
<a name="change-data-model"></a>

**Problema**: un elemento no se puede descifrar porque la verificación de firma devuelve un error. El elemento podría no estar cifrado y firmado del modo previsto.

**Sugerencia**: asegúrese de que las acciones de atributos que proporcione cuenten para todos los atributos del elemento. Al descifrar un elemento, asegúrese de proporcionar acciones de atributo que coincidan con las acciones utilizadas para cifrar el elemento.

**Detalles**

Las [acciones de atributo](DDBEC-legacy-concepts.md#legacy-attribute-actions) que proporciona indican qué atributos cifrar y firmar, qué atributos firmar (pero no cifrar) y cuáles ignorar. 

Si las acciones de atributo que especifique no cuentan para todos los atributos del elemento, el elemento podría no cifrarse y firmarse del modo previsto. Si las acciones de atributo que proporciona al descifrar un elemento difieren de las acciones de atributo que proporcione al cifrar el elemento, la verificación de la firma podría fallar. Se trata de un problema particular para aplicaciones distribuidas en las que las nuevas acciones de atributos podrían no haberse propagado a todos los hosts.

Los errores de validación de firmas son difíciles de resolver. Para ayudar a prevenirlos, tome precauciones adicionales al cambiar el modelo de datos. Para obtener más información, consulte [Cambiar el modelo de datos](data-model.md).

## Problemas con las tablas globales de versiones anteriores
<a name="fix-global-tables"></a>

**Problema**: los elementos de una tabla global de Amazon DynamoDB de una versión anterior no se pueden descifrar porque no se puede comprobar la firma.

**Sugerencia**: defina las acciones de los atributos de forma que los campos de replicación reservados no estén cifrados ni firmados.

**Detalles**

Puede utilizar el cliente de cifrado de DynamoDB con las tablas globales de [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html). Se recomienda utilizar tablas globales con una clave KMS [multirregional y replicar la clave KMS](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) en todos los Regiones de AWS lugares donde esté replicada la tabla global.

A partir de la [versión 2019.11.21](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html) de tablas globales, puede utilizarlas con el cliente de cifrado de DynamoDB sin ninguna configuración especial. Sin embargo, si utiliza tablas globales de la [versión 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html), debe asegurarse de que los campos de replicación reservados no estén cifrados ni firmados.

[Si utiliza las tablas globales de la versión 2017.11.29, debe configurar las acciones de atributo para los siguientes atributos `DO_NOTHING` en [`@DoNotTouch`Java](java-using.md#attribute-actions-java) o Python.](python-using.md#python-attribute-actions)
+ `aws:rep:deleting`
+ `aws:rep:updatetime`
+ `aws:rep:updateregion`

Si utiliza cualquier otra versión de las tablas globales, no es necesario realizar ninguna acción.

## Rendimiento deficiente del proveedor más reciente
<a name="mrp-ttl-delay"></a>

**Problema**: la aplicación responde menos, especialmente después de actualizarse a una versión más reciente del cliente de cifrado de DynamoDB.

**Sugerencia**: ajuste el time-to-live valor y el tamaño de la memoria caché.

**Detalles**

El proveedor más reciente está diseñado para mejorar el rendimiento de las aplicaciones que utilizan el cliente de cifrado de DynamoDB al permitir una reutilización limitada del material criptográfico. Al configurar el proveedor más reciente para su aplicación, debe equilibrar la mejora del rendimiento con los problemas de seguridad que se derivan del almacenamiento en caché y la reutilización. 

En las versiones más recientes del cliente de cifrado de DynamoDB, time-to-live el valor (TTL) determina durante cuánto tiempo se pueden utilizar los proveedores de material criptográfico en caché (). CMPs El TTL también determina la frecuencia con la que el proveedor más reciente comprueba si hay una nueva versión del CMP. 

Si su TTL es demasiado largo, su aplicación podría infringir sus normas empresariales o normas de seguridad. Si tu TTL es demasiado breve, las llamadas frecuentes a la tienda del proveedor pueden provocar que la tienda del proveedor limite las solicitudes de tu aplicación y de otras aplicaciones que comparten tu cuenta de servicio. Para resolver este problema, ajusta el TTL y el tamaño de la caché a un valor que cumpla tus objetivos de latencia y disponibilidad y que se ajuste a tus estándares de seguridad. Para obtener más información, consulte [Establecer un valor time-to-live](most-recent-provider.md#most-recent-provider-ttl).