

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.

# Ejemplos de Java
<a name="ddb-java-examples"></a>


****  

|  | 
| --- |
| Se cambió el nombre de nuestra biblioteca de cifrado del lado del cliente por el de SDK de cifrado de AWS bases de datos. En esta guía para desarrolladores, se sigue proporcionando información sobre el [cliente de cifrado de DynamoDB](legacy-dynamodb-encryption-client.md). | 

Los siguientes ejemplos muestran cómo utilizar la biblioteca de cifrado del cliente de Java para DynamoDB para proteger los elementos de tabla en su aplicación. Puedes encontrar más ejemplos (y añadir los tuyos propios) en los [ejemplos de Java del repositorio](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples) aws-database-encryption-sdk -dynamodb de. GitHub

Los siguientes ejemplos muestran cómo configurar la biblioteca de cifrado del cliente de Java para DynamoDB en una tabla de Amazon DynamoDB nueva y sin rellenar. Si desea configurar las tablas de Amazon DynamoDB existentes para el cifrado del cliente, consulte. [Agregar la versión 3.x a una tabla existente](ddb-java-config-existing-table.md)

**Topics**
+ [Uso del cliente mejorado de DynamoDB](#ddb-java-enhanced-client-example)
+ [API de bajo nivel de DynamoDB](#ddb-java-lowlevel-API-example)
+ [Usando el nivel inferior DynamoDbItemEncryptor](#ddb-java-itemencryptor)

## Uso del cliente mejorado de DynamoDB
<a name="ddb-java-enhanced-client-example"></a>

En el siguiente ejemplo, se muestra cómo utilizar el cliente mejorado de DynamoDB y el `DynamoDbEncryptionInterceptor` con un [conjunto de claves de AWS KMS](use-kms-keyring.md) para cifrar los elementos de la tabla de DynamoDB como parte de las llamadas a la API de DynamoDB.

Puede utilizar cualquier conjunto de [claves compatible con el cliente mejorado de DynamoDB, pero le recomendamos que utilice uno de los anillos](keyrings.md) de AWS KMS claves siempre que sea posible.

**nota**  
El cliente mejorado de DynamoDB no admite [el cifrado con capacidad de búsqueda.](searchable-encryption.md) Úselo `DynamoDbEncryptionInterceptor` con el API de bajo nivel de DynamoDB para usar el cifrado con capacidad de búsqueda.

**Consulte el ejemplo de código completo**[: .java EnhancedPutGetExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/EnhancedPutGetExample.java)

**Paso 1: Crea el llavero AWS KMS **  
El siguiente ejemplo se utiliza `CreateAwsKmsMrkMultiKeyring` para crear un AWS KMS anillo de claves con una clave KMS de cifrado simétrico. El método `CreateAwsKmsMrkMultiKeyring` garantiza que el conjunto de claves maneje correctamente las claves de una sola región y de múltiples regiones.  

```
final MaterialProviders matProv = MaterialProviders.builder()
        .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
        .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Paso 2: crear un esquema de tabla a partir de la clase de datos anotados**  
En el siguiente ejemplo, se utiliza la clase de datos anotada para crear la `TableSchema`.  
[En este ejemplo, se supone que las acciones de clase y atributo de datos anotados se definieron mediante .java. SimpleClass](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java) Para obtener más información sobre cómo anotar las acciones de los atributos, consulte [Utilice una clase de datos anotada](ddb-java-using.md#ddb-attribute-actions-annotated-data-class).  
[El SDK AWS de cifrado de bases de datos no admite anotaciones en atributos anidados.](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html)

```
final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);
```

**Paso 3: defina qué atributos se excluyen de las firmas**  
En el ejemplo siguiente, se supone que todos los atributos `DO_NOTHING` comparten el prefijo distinto "`:`" y se utiliza el prefijo para definir los atributos no firmados permitidos. El cliente asume que cualquier nombre de atributo con el prefijo “`:`” está excluido de las firmas. Para obtener más información, consulte [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**Paso 4: crear el contexto de cifrado**  
En el siguiente ejemplo, se define un mapa `tableConfigs` que representa la configuración de cifrado de la tabla de DynamoDB.   
En este ejemplo, se especifica el nombre de la tabla de DynamoDB como [nombre de la tabla lógica](ddb-java-using.md#logical-table-name). Se recomienda encarecidamente especificar el nombre de la tabla de DynamoDB como nombre de la tabla lógica cuando defina por primera vez la configuración de cifrado. Para obtener más información, consulte [Configuración de cifrado en el SDK de cifrado AWS de bases de datos para DynamoDB](ddb-java-using.md#ddb-config-encrypt).  
Para utilizar [balizas firmadas](configure.md#signed-beacons) o [cifrado con capacidad de búsqueda](searchable-encryption.md), también debe incluirlos [`SearchConfig`](ddb-java-using.md#ddb-search-config)en la configuración de cifrado.

```
final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
tableConfigs.put(ddbTableName,
    DynamoDbEnhancedTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .schemaOnEncrypt(tableSchema)
        .build());
```

**Paso 5: Cree la `DynamoDbEncryptionInterceptor`**  
En el siguiente ejemplo, se crea un nuevo `DynamoDbEncryptionInterceptor` con la `tableConfigs` del **Paso 4**.  

```
final DynamoDbEncryptionInterceptor interceptor =
    DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
        CreateDynamoDbEncryptionInterceptorInput.builder()
            .tableEncryptionConfigs(tableConfigs)
            .build()
    );
```

**Paso 6: Crear un nuevo cliente AWS SDK de DynamoDB**  
**En el siguiente ejemplo, se crea un nuevo cliente AWS SDK de DynamoDB mediante `interceptor` el paso 5.**  

```
final DynamoDbClient ddb = DynamoDbClient.builder()
        .overrideConfiguration(
                ClientOverrideConfiguration.builder()
                       .addExecutionInterceptor(interceptor)
                       .build())
        .build();
```

**Paso 7: Crear el cliente mejorado de DynamoDB y crear una tabla**  
En el siguiente ejemplo, se crea el cliente mejorado DynamoDB mediante el cliente del SDK DynamoDB de AWS creado en el **Paso 6** y se crea una tabla con la clase de datos anotados.  

```
final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
        .dynamoDbClient(ddb)
        .build();
final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
```

**Paso 8: Cifrar y guardar un elemento de la tabla**  
En el siguiente ejemplo, se coloca un elemento en la tabla de DynamoDB mediante el cliente mejorado de DynamoDB. El elemento se cifra y se firma en el lado del cliente antes de enviarlo a DynamoDB.  

```
final SimpleClass item = new SimpleClass();
item.setPartitionKey("EnhancedPutGetExample");
item.setSortKey(0);
item.setAttribute1("encrypt and sign me!");
item.setAttribute2("sign me!");
item.setAttribute3("ignore me!");

table.putItem(item);
```

## API de bajo nivel de DynamoDB
<a name="ddb-java-lowlevel-API-example"></a>

En el siguiente ejemplo, se muestra cómo utilizar la API de DynamoDB de bajo nivel con un [conjunto de claves de AWS KMS](use-kms-keyring.md) para cifrar y firmar automáticamente los elementos del lado del cliente con las solicitudes de DynamoDB de `PutItem`.

Puede utilizar cualquier [llavero](keyrings.md) compatible, pero le recomendamos que utilice uno de los AWS KMS llaveros siempre que sea posible.

**[Consulta el ejemplo de código completo: .java BasicPutGetExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/BasicPutGetExample.java)**

**Paso 1: Crea el llavero AWS KMS **  
El siguiente ejemplo se utiliza `CreateAwsKmsMrkMultiKeyring` para crear un AWS KMS anillo de claves con una clave KMS de cifrado simétrico. El método `CreateAwsKmsMrkMultiKeyring` garantiza que el conjunto de claves maneje correctamente las claves de una sola región y de múltiples regiones.  

```
final MaterialProviders matProv = MaterialProviders.builder()
         .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
         .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Paso 2: configurar las acciones de sus atributos**  
En el siguiente ejemplo, se define un mapa `attributeActionsOnEncrypt` que representa ejemplos de [acciones de atributos](concepts.md#crypt-actions) para un elemento de la tabla.  
En el siguiente ejemplo no se define ningún atributo como. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` Si especifica algún `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atributo, los atributos de partición y ordenación también deben serlo`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_ONLY); 
// The sort attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_ONLY); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put(":attribute3", CryptoAction.DO_NOTHING);
```

**Paso 3: defina qué atributos se excluyen de las firmas**  
En el ejemplo siguiente, se supone que todos los atributos `DO_NOTHING` comparten el prefijo distinto "`:`" y se utiliza el prefijo para definir los atributos no firmados permitidos. El cliente asume que cualquier nombre de atributo con el prefijo “`:`” está excluido de las firmas. Para obtener más información, consulte [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**Paso 4: definir la configuración de cifrado de la tabla de DynamoDB**  
El siguiente ejemplo define un mapa `tableConfigs` que representa la configuración de cifrado de esta tabla de DynamoDB.  
En este ejemplo, se especifica el nombre de la tabla de DynamoDB como [nombre de la tabla lógica](ddb-java-using.md#logical-table-name). Se recomienda encarecidamente especificar el nombre de la tabla de DynamoDB como nombre de la tabla lógica cuando defina por primera vez la configuración de cifrado. Para obtener más información, consulte [Configuración de cifrado en el SDK de cifrado AWS de bases de datos para DynamoDB](ddb-java-using.md#ddb-config-encrypt).  
Para utilizar [balizas firmadas](configure.md#signed-beacons) o [cifrado con capacidad de búsqueda](searchable-encryption.md), también debe incluir [`SearchConfig`](ddb-java-using.md#ddb-search-config) en la configuración de cifrado.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .attributeActionsOnEncrypt(attributeActionsOnEncrypt)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .build();
tableConfigs.put(ddbTableName, config);
```

**Paso 5: Crear el `DynamoDbEncryptionInterceptor`**  
En el siguiente ejemplo, se crea el `DynamoDbEncryptionInterceptor` con la `tableConfigs` del **Paso 4**.  

```
DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder()
        .config(DynamoDbTablesEncryptionConfig.builder()
                .tableEncryptionConfigs(tableConfigs)
                .build())
        .build();
```

**Paso 6: Crear un nuevo cliente AWS SDK de DynamoDB**  
**En el siguiente ejemplo, se crea un nuevo cliente AWS SDK de DynamoDB mediante `interceptor` el paso 5.**  

```
final DynamoDbClient ddb = DynamoDbClient.builder()
        .overrideConfiguration(
                ClientOverrideConfiguration.builder()
                       .addExecutionInterceptor(interceptor)
                       .build())
        .build();
```

**Paso 7: Cifrar y firmar un elemento de la tabla de DynamoDB**  
En el siguiente ejemplo, se define un mapa `item` que representa un elemento de tabla de ejemplo y se coloca el elemento en la tabla de DynamoDB. El elemento se cifra y se firma en el lado del cliente antes de enviarlo a DynamoDB.  

```
final HashMap<String, AttributeValue> item = new HashMap<>();
item.put("partition_key", AttributeValue.builder().s("BasicPutGetExample").build());
item.put("sort_key", AttributeValue.builder().n("0").build());
item.put("attribute1", AttributeValue.builder().s("encrypt and sign me!").build());
item.put("attribute2", AttributeValue.builder().s("sign me!").build());
item.put(":attribute3", AttributeValue.builder().s("ignore me!").build());

final PutItemRequest putRequest = PutItemRequest.builder()
        .tableName(ddbTableName)
        .item(item)
        .build();

final PutItemResponse putResponse = ddb.putItem(putRequest);
```

## Usando el nivel inferior DynamoDbItemEncryptor
<a name="ddb-java-itemencryptor"></a>

En el siguiente ejemplo, se muestra cómo utilizar el nivel inferior `DynamoDbItemEncryptor` con un [conjunto de claves de AWS KMS](use-kms-keyring.md) para cifrar y firmar directamente los elementos de la tabla. `DynamoDbItemEncryptor` No coloca el elemento en la tabla de DynamoDB.

Puede utilizar cualquier conjunto de [claves compatible con el cliente mejorado de DynamoDB, pero le recomendamos que utilice uno de los anillos](keyrings.md) de AWS KMS claves siempre que sea posible.

**nota**  
El nivel inferior `DynamoDbItemEncryptor` no admite el cifrado [con capacidad de búsqueda.](searchable-encryption.md) Úselo `DynamoDbEncryptionInterceptor` con el API de bajo nivel de DynamoDB para usar el cifrado con capacidad de búsqueda.

**Consulte el ejemplo de código completo**[: .java ItemEncryptDecryptExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/itemencryptor/ItemEncryptDecryptExample.java)

**Paso 1: Crea el llavero AWS KMS **  
El siguiente ejemplo se utiliza `CreateAwsKmsMrkMultiKeyring` para crear un AWS KMS anillo de claves con una clave KMS de cifrado simétrico. El método `CreateAwsKmsMrkMultiKeyring` garantiza que el conjunto de claves maneje correctamente las claves de una sola región y de múltiples regiones.  

```
final MaterialProviders matProv = MaterialProviders.builder()
         .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
         .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Paso 2: configurar las acciones de sus atributos**  
En el siguiente ejemplo, se define un mapa `attributeActionsOnEncrypt` que representa ejemplos de [acciones de atributos](concepts.md#crypt-actions) para un elemento de la tabla.  
En el siguiente ejemplo no se define ningún atributo como. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` Si especifica algún `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atributo, los atributos de partición y ordenación también deben serlo`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_ONLY); 
// The sort attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_ONLY); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put(":attribute3", CryptoAction.DO_NOTHING);
```

**Paso 3: defina qué atributos se excluyen de las firmas**  
En el ejemplo siguiente, se supone que todos los atributos `DO_NOTHING` comparten el prefijo distinto "`:`" y se utiliza el prefijo para definir los atributos no firmados permitidos. El cliente asume que cualquier nombre de atributo con el prefijo “`:`” está excluido de las firmas. Para obtener más información, consulte [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**Paso 4: defina la configuración de `DynamoDbItemEncryptor`**  
En el siguiente ejemplo, se consulta la configuración de `DynamoDbItemEncryptor`.  
En este ejemplo, se especifica el nombre de la tabla de DynamoDB como [nombre de la tabla lógica](ddb-java-using.md#logical-table-name). Se recomienda encarecidamente especificar el nombre de la tabla de DynamoDB como nombre de la tabla lógica cuando defina por primera vez la configuración de cifrado. Para obtener más información, consulte [Configuración de cifrado en el SDK de cifrado AWS de bases de datos para DynamoDB](ddb-java-using.md#ddb-config-encrypt).  

```
final DynamoDbItemEncryptorConfig config = DynamoDbItemEncryptorConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .attributeActionsOnEncrypt(attributeActionsOnEncrypt)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .build();
```

**Paso 5: Crear el `DynamoDbItemEncryptor`**  
En el siguiente ejemplo, se crea un nuevo `DynamoDbItemEncryptor`, con la `config` del **Paso 4**.  

```
final DynamoDbItemEncryptor itemEncryptor = DynamoDbItemEncryptor.builder()
        .DynamoDbItemEncryptorConfig(config)
        .build();
```

**Paso 6: cifrar y firmar directamente un elemento de la tabla**  
En el siguiente ejemplo, se cifra y firma directamente un elemento mediante el `DynamoDbItemEncryptor`. `DynamoDbItemEncryptor` no coloca el elemento en la tabla de DynamoDB.  

```
final Map<String, AttributeValue> originalItem = new HashMap<>();
originalItem.put("partition_key", AttributeValue.builder().s("ItemEncryptDecryptExample").build());
originalItem.put("sort_key", AttributeValue.builder().n("0").build());
originalItem.put("attribute1", AttributeValue.builder().s("encrypt and sign me!").build());
originalItem.put("attribute2", AttributeValue.builder().s("sign me!").build());
originalItem.put(":attribute3", AttributeValue.builder().s("ignore me!").build());

final Map<String, AttributeValue> encryptedItem = itemEncryptor.EncryptItem(
        EncryptItemInput.builder()
                .plaintextItem(originalItem)
                .build()
).encryptedItem();
```