

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.

# .NET
<a name="ddb-net"></a>

En este tema se explica cómo instalar y usar la versión 3. *x* de la biblioteca de cifrado del lado del cliente.NET para DynamoDB. Para obtener más información sobre la programación con el SDK AWS de cifrado de bases de datos para DynamoDB, consulte los ejemplos [de.NET en el repositorio -dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/) en aws-database-encryption-sdk. GitHub

La biblioteca de cifrado del lado del cliente.NET para DynamoDB es para desarrolladores que escriben aplicaciones en C\$1 y otros lenguajes de programación.NET. Es compatible con Windows, macOS y Linux.

Todas las implementaciones de [lenguajes de programación](ddb-programming-languages.md) del SDK de cifrado de AWS bases de datos para DynamoDB son interoperables. Sin embargo, no SDK para .NET admite valores vacíos para los tipos de datos de listas o mapas. Esto significa que si utiliza la biblioteca de cifrado del lado del cliente de Java para DynamoDB para escribir un elemento que contenga valores vacíos para un tipo de datos de lista o mapa, no podrá descifrar ni leer ese elemento mediante la biblioteca de cifrado del lado del cliente .NET para DynamoDB.

**Topics**
+ [Instalación](#ddb-net-install)
+ [Debugging](#ddb-net-debugging)
+ [Uso del cliente.NET](ddb-net-using.md)
+ [Ejemplos de.NET](ddb-net-examples.md)
+ [Agregar la versión 3.x a una tabla existente](ddb-net-config-existing-table.md)

## Instalación de la biblioteca de cifrado del lado del cliente.NET para DynamoDB
<a name="ddb-net-install"></a>

[La biblioteca de cifrado del lado del cliente .NET para DynamoDB está disponible como AWS.Cryptography. DbEncryptionSDK. DynamoDb](https://www.nuget.org/packages/AWS.Cryptography.DbEncryptionSDK.DynamoDb/)paquete en NuGet. Para obtener más información sobre la instalación y creación de la biblioteca, consulte el [archivo.NET README.md](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/DynamoDbEncryption/runtimes/net/README.md) en el aws-database-encryption-sdk repositorio -dynamodb. La biblioteca de cifrado del lado del cliente.NET para DynamoDB requiere las claves « SDK para .NET incluso si no se utilizan» (). AWS Key Management Service AWS KMS SDK para .NET Se instala con el paquete. NuGet 

Versión 3. *x* de la biblioteca de cifrado del lado del cliente .NET para DynamoDB es compatible con .NET 6.0 y .NET Framework net48 y versiones posteriores.

## Depuración con .NET
<a name="ddb-net-debugging"></a>

La biblioteca de cifrado del lado del cliente.NET para DynamoDB no genera ningún registro. Las excepciones de la biblioteca de cifrado del lado del cliente de.NET para DynamoDB generan un mensaje de excepción, pero no se rastrean las pilas.

Para ayudarle a depurar, asegúrese de activar el inicio de sesión en la SDK para .NET. Los registros y los mensajes de error de SDK para .NET pueden ayudarle a distinguir los errores que se producen en la biblioteca SDK para .NET de cifrado del lado del cliente de.NET para DynamoDB. *Para obtener ayuda con el SDK para .NET registro, consulte la Guía para desarrolladores [AWSLogging](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-config-other.html#config-setting-awslogging).AWS SDK para .NET * (Para ver el tema, amplíe la sección **Abrir para ver la sección de contenido de .NET Framework**).

# Uso de la biblioteca de cifrado del lado del cliente.NET para DynamoDB
<a name="ddb-net-using"></a>

En este tema se explican algunas de las funciones y clases auxiliares de la versión 3. *x* de la biblioteca de cifrado del lado del cliente.NET para DynamoDB. 

Para obtener más información sobre la programación con la biblioteca de cifrado del lado del cliente .NET para DynamoDB, consulte los [ejemplos de.NET](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/) en el repositorio -dynamodb de. aws-database-encryption-sdk GitHub

**Topics**
+ [Encriptadores de elementos](#ddb-net-item-encryptors)
+ [Acciones de atributo](#ddb-net-attribute-actions)
+ [La configuración de cifrado](#ddb-net-config-encrypt)
+ [Actualización de un elemento](#ddb-net-update-items)

## Encriptadores de elementos
<a name="ddb-net-item-encryptors"></a>

En esencia, el SDK de cifrado AWS de bases de datos para DynamoDB es un cifrador de elementos. Puede utilizar la versión 3. *x* de la biblioteca de cifrado del lado del cliente .NET para que DynamoDB cifre, firme, verifique y descifre los elementos de la tabla de DynamoDB de las siguientes maneras.

**El SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB**  
Puede usar la [configuración de cifrado de tablas](#ddb-net-config-encrypt) para crear un cliente de DynamoDB que cifre y firme automáticamente los elementos del lado del cliente con sus solicitudes de DynamoDB. `PutItem` [https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-document](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-document)  
[Debe usar el SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB para utilizar el cifrado con capacidad de búsqueda.](searchable-encryption.md)

**El nivel inferior `DynamoDbItemEncryptor`**  
El nivel inferior cifra y firma o descifra y verifica `DynamoDbItemEncryptor` directamente los elementos de la tabla sin llamar a DynamoDB. No realiza DynamoDB ni `PutItem` solicitudes`GetItem`. Por ejemplo, puede usar el nivel inferior `DynamoDbItemEncryptor` para descifrar y verificar directamente un elemento de DynamoDB que ya haya recuperado. Si utiliza el nivel inferior`DynamoDbItemEncryptor`, le recomendamos que utilice el [modelo de programación de bajo nivel](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-low-level) que SDK para .NET proporciona para la comunicación con DynamoDB.  
El nivel inferior `DynamoDbItemEncryptor` no admite el cifrado [con capacidad de búsqueda.](searchable-encryption.md)

## Acciones de atributos en el SDK de cifrado AWS de bases de datos para DynamoDB
<a name="ddb-net-attribute-actions"></a>

[Las acciones de atributos](concepts.md#crypt-actions) determinan qué valores de atributo están cifrados y firmados, cuáles solo están firmados, cuáles están firmados e incluidos en el contexto de cifrado y cuáles se ignoran.

Para especificar las acciones de los atributos con el cliente .NET, defina manualmente las acciones de los atributos mediante un modelo de objetos. Especifique las acciones de los atributos creando un `Dictionary` objeto en el que los pares nombre-valor representen los nombres de los atributos y las acciones especificadas.

Especifique `ENCRYPT_AND_SIGN` si desea cifrar y firmar un atributo. Especifique `SIGN_ONLY` firmar, pero no cifrar, un atributo. Especifique si `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` desea firmar un atributo e incluirlo en el contexto de cifrado. No se puede cifrar un atributo sin firmarlo también. Especifique `DO_NOTHING` que se omita un atributo.

Los atributos de partición y ordenación deben ser uno de `SIGN_ONLY` los dos`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Si define algún atributo como`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, los atributos de partición y ordenación también deben serlo`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**nota**  
Tras definir las acciones de los atributos, debe definir qué atributos se excluyen de las firmas. Para facilitar la adición de nuevos atributos sin firmar en el futuro, recomendamos elegir un prefijo distinto (como “`:`“) para identificar los atributos sin firmar. Incluya este prefijo en el nombre del atributo para todos los atributos marcados `DO_NOTHING` al definir el esquema y las acciones de atributos de DynamoDB.

El siguiente modelo de objetos muestra cómo especificar `ENCRYPT_AND_SIGN` `SIGN_ONLY``SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, y `DO_NOTHING` atribuir acciones con el cliente.NET. En este ejemplo se utiliza el prefijo `:` "» para identificar `DO_NOTHING` los atributos.

**nota**  
Para utilizar la acción `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` criptográfica, debe utilizar la versión 3.3 o posterior del SDK de cifrado de AWS bases de datos. Implemente la nueva versión en todos los lectores antes de [actualizar su modelo de datos](ddb-update-data-model.md) para `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` incluirla.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT, // The partition attribute must be signed
    ["sort_key"] = CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT, // The sort attribute must be signed
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    ["attribute3"] = CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
    [":attribute4"] = CryptoAction.DO_NOTHING
};
```

## Configuración de cifrado en el SDK de cifrado AWS de bases de datos para DynamoDB
<a name="ddb-net-config-encrypt"></a>

Al utilizar el SDK de cifrado AWS de bases de datos, debe definir explícitamente una configuración de cifrado para la tabla de DynamoDB. Los valores necesarios en la configuración de cifrado dependen de si ha definido las acciones de los atributos manualmente o con una clase de datos anotada.

El siguiente fragmento define una configuración de cifrado de tablas de DynamoDB mediante el SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB y los atributos no firmados permitidos definidos por un prefijo distinto.

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    // Optional: SearchConfig only required if you use beacons
    Search = new SearchConfig
    {
        WriteVersion = 1, // MUST be 1
        Versions = beaconVersions
    }    
};
tableConfigs.Add(ddbTableName, config);
```

**Nombre de la tabla lógica**  
Un nombre de tabla lógico para la tabla de DynamoDB.  
El nombre de la tabla lógica está enlazado criptográficamente a todos los datos almacenados en la tabla para simplificar las operaciones de restauración de DynamoDB. 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. Debe especificar siempre el mismo nombre de tabla lógica. Para que el descifrado se realice correctamente, el nombre de la tabla lógica debe coincidir con el nombre especificado en el cifrado. En caso de que el nombre de la tabla de DynamoDB cambie después de [restaurar la tabla de DynamoDB a partir de una copia de seguridad, el nombre de la tabla](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html) lógica garantiza que la operación de descifrado siga reconociendo la tabla.

**Atributos no firmados permitidos**  
Los atributos marcados `DO_NOTHING` en tus acciones de atributos.  
Los atributos no firmados permitidos indican al cliente qué atributos están excluidos de las firmas. El cliente asume que todos los demás atributos están incluidos en la firma. A continuación, al descifrar un registro, el cliente determina qué atributos debe verificar y cuáles debe ignorar de los atributos no firmados permitidos que especificó. No puede eliminar un atributo de los atributos no firmados permitidos.  
Puede definir los atributos no firmados permitidos de forma explícita mediante la creación de una matriz que enumere todos sus `DO_NOTHING` atributos. También puedes especificar un prefijo distinto al asignar un nombre a tus `DO_NOTHING` atributos y usar el prefijo para indicar al cliente qué atributos no están firmados. Recomendamos encarecidamente especificar un prefijo distinto porque simplifica el proceso de añadir un nuevo `DO_NOTHING` atributo en el futuro. Para obtener más información, consulte [Actualización de su modelo de datos](ddb-update-data-model.md).  
Si no especifica un prefijo para todos los `DO_NOTHING` atributos, puede configurar una `allowedUnsignedAttributes` matriz que enumere de forma explícita todos los atributos que el cliente debería esperar que no estén firmados cuando los encuentre al descifrarlos. Solo debe definir de forma explícita los atributos no firmados permitidos si es absolutamente necesario.

**Configuración de búsqueda (opcional)**  
`SearchConfig`Define la [versión de baliza](using-beacons.md#beacon-version).  
`SearchConfig`Debe especificarse para utilizar [balizas firmadas](configure.md#signed-beacons) o [cifradas con capacidad de búsqueda](searchable-encryption.md).

**Conjunto de algoritmos (opcional)**  
El `algorithmSuiteId` define qué conjunto de algoritmos utiliza el SDK de cifrado de bases de datos de AWS .  
A menos que especifique explícitamente un conjunto de algoritmos alternativo, el SDK AWS de cifrado de bases de datos utiliza el [conjunto de algoritmos predeterminado](supported-algorithms.md#recommended-algorithms). [El conjunto de algoritmos predeterminado utiliza el algoritmo AES-GCM con la derivación de claves, [las firmas digitales](concepts.md#digital-sigs) y el compromiso de claves.](concepts.md#key-commitment) Aunque es probable que el conjunto de algoritmos predeterminado sea adecuado para la mayoría de las aplicaciones, puede elegir un conjunto de algoritmos alternativo. Por ejemplo, algunos modelos de confianza quedarían satisfechos con un conjunto de algoritmos sin firmas digitales. Para obtener información sobre los conjuntos de algoritmos compatibles con el SDK AWS de cifrado de bases de datos, consulte[Conjuntos de algoritmos compatibles en el SDK de cifrado AWS de bases de datos](supported-algorithms.md).  
Para seleccionar el [conjunto de algoritmos AES-GCM sin firmas digitales ECDSA](supported-algorithms.md#other-algorithms), incluya el siguiente fragmento en la configuración de cifrado de la tabla.  

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

## Actualización de elementos con el SDK de cifrado de bases de datos AWS
<a name="ddb-net-update-items"></a>

El SDK AWS de cifrado de bases de datos no admite [ddb: UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) para elementos que incluyen atributos cifrados o firmados. Para actualizar un atributo cifrado o firmado, debe usar [ddb](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html):. PutItem Cuando se especifica la misma clave principal que un elemento existente en la solicitud `PutItem`, el nuevo elemento sustituye completamente al existente. También puedes usar [CLOBBER](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html#CLOBBER) para borrar y reemplazar todos los atributos al guardar después de actualizar tus artículos.

# Ejemplos de.NET
<a name="ddb-net-examples"></a>

En los ejemplos siguientes se muestra cómo utilizar la biblioteca de cifrado del lado del cliente de.NET para DynamoDB a fin de proteger los elementos de la tabla de la aplicación. Para encontrar más ejemplos (y aportar los suyos propios), consulte los [ejemplos de.NET en el repositorio -dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/net/src) en. aws-database-encryption-sdk GitHub

Los siguientes ejemplos muestran cómo configurar la biblioteca de cifrado del lado del cliente.NET 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-net-config-existing-table.md)

**Topics**
+ [Uso del SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB](#ddb-net-lowlevel-API-example)
+ [Uso del nivel inferior `DynamoDbItemEncryptor`](#ddb-net-itemencryptor)

## Uso del SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB
<a name="ddb-net-lowlevel-API-example"></a>

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

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

**[Consulta el ejemplo de código completo: .cs BasicPutGetExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/BasicPutGetExample.cs)**

**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.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Paso 2: configurar las acciones de sus atributos**  
En el siguiente ejemplo, se define un `attributeActionsOnEncrypt` diccionario que representa ejemplos de [acciones de atributo](concepts.md#crypt-actions) para un elemento de la tabla.  
El siguiente ejemplo no 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`.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":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-net-using.md#net-allowed-unauth).  

```
const String unsignAttrPrefix = ":";
```

**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-net-using.md#net-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-net-using.md#ddb-net-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.

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix
};
tableConfigs.Add(ddbTableName, config);
```

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

```
var ddb = new Client.DynamoDbClient(
    new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });
```

**Paso 6: Cifrar y firmar un elemento de la tabla de DynamoDB**  
En el siguiente ejemplo, se define un `item` diccionario 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.  

```
var item = new Dictionary<String, AttributeValue>
{
    ["partition_key"] = new AttributeValue("BasicPutGetExample"),
    ["sort_key"] = new AttributeValue { N = "0" },
    ["attribute1"] = new AttributeValue("encrypt and sign me!"),
    ["attribute2"] = new AttributeValue("sign me!"),
    [":attribute3"] = new AttributeValue("ignore me!")
};

PutItemRequest putRequest = new PutItemRequest
{
    TableName = ddbTableName,
    Item = item
};

PutItemResponse putResponse = await ddb.PutItemAsync(putRequest);
```

## Uso del nivel inferior `DynamoDbItemEncryptor`
<a name="ddb-net-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) Utilice el SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB para utilizar el cifrado con capacidad de búsqueda.

**Consulte el ejemplo de código completo**[: .cs ItemEncryptDecryptExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/itemencryptor/ItemEncryptDecryptExample.cs)

**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.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Paso 2: configurar las acciones de sus atributos**  
En el siguiente ejemplo, se define un `attributeActionsOnEncrypt` diccionario que representa ejemplos de [acciones de atributo](concepts.md#crypt-actions) para un elemento de la tabla.  
El siguiente ejemplo no 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`.

```
var attributeActionsOnEncrypt = new Dictionary<String, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":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-net-using.md#net-allowed-unauth).  

```
String unsignAttrPrefix = ":";
```

**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-net-using.md#net-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-net-using.md#ddb-net-config-encrypt).  

```
var config = new DynamoDbItemEncryptorConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix
};
```

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

```
var itemEncryptor = new DynamoDbItemEncryptor(config);
```

**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.  

```
var originalItem = new Dictionary<String, AttributeValue>
{
    ["partition_key"] = new AttributeValue("ItemEncryptDecryptExample"),
    ["sort_key"] = new AttributeValue { N = "0" },
    ["attribute1"] = new AttributeValue("encrypt and sign me!"),
    ["attribute2"] = new AttributeValue("sign me!"),
    [":attribute3"] = new AttributeValue("ignore me!")
};

var encryptedItem = itemEncryptor.EncryptItem(
    new EncryptItemInput { PlaintextItem = originalItem }
).EncryptedItem;
```

# Configurar una tabla de DynamoDB existente para usar AWS el SDK de cifrado de bases de datos para DynamoDB
<a name="ddb-net-config-existing-table"></a>

Con la versión 3. *x* de la biblioteca de cifrado del lado del cliente .NET para DynamoDB, puede configurar las tablas de Amazon DynamoDB existentes para el cifrado del lado del cliente. En este tema se proporcionan instrucciones sobre los tres pasos que debe seguir para añadir la versión 3.*x* a una tabla de DynamoDB existente y rellenada.

## Paso 1: prepararse para leer y escribir elementos cifrados
<a name="ddb-net-add-step1"></a>

Complete los siguientes pasos para preparar su cliente del SDK de cifrado de AWS bases de datos para leer y escribir elementos cifrados. Tras implementar los siguientes cambios, el cliente seguirá leyendo y escribiendo elementos de texto no cifrado. No cifrará ni firmará ningún elemento nuevo escrito en la tabla, pero podrá descifrar los elementos cifrados en cuanto aparezcan. Estos cambios preparan al cliente para empezar a [cifrar nuevos elementos.](#ddb-net-add-step2) Los siguientes cambios deben implementarse en cada lector antes de continuar con el siguiente paso.

**1. Defina las [acciones de sus atributos](concepts.md#crypt-actions)**  
Cree un modelo de objetos para definir qué valores de atributo se cifrarán y firmarán, cuáles solo se firmarán y cuáles se ignorarán.  
De forma predeterminada, los atributos de la clave principal están firmados pero no cifrados (`SIGN_ONLY`) y todos los demás atributos están cifrados y firmados `ENCRYPT_AND_SIGN`().  
Especifique `ENCRYPT_AND_SIGN` si desea cifrar y firmar un atributo. Especifique `SIGN_ONLY` firmar, pero no cifrar, un atributo. Especifique `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` el signo y el atributo e inclúyalos en el contexto de cifrado. No se puede cifrar un atributo sin firmarlo también. Especifique `DO_NOTHING` que se omita un atributo. Para obtener más información, consulte [Acciones de atributos en el SDK de cifrado AWS de bases de datos para DynamoDB](ddb-net-using.md#ddb-net-attribute-actions).  
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`.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":attribute3"] = CryptoAction.DO_NOTHING
};
```

**2. Defina qué atributos se excluirán 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 asumirá que cualquier nombre de atributo con el prefijo "`:`" está excluido de las firmas. Para obtener más información, consulte [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

```
const String unsignAttrPrefix = ":";
```

**3. Cree un [conjunto de claves](keyrings.md)**  
El siguiente ejemplo crea un [conjunto de claves de AWS KMS](use-kms-keyring.md). El AWS KMS anillo de claves utiliza un cifrado simétrico o un RSA asimétrico AWS KMS keys para generar, cifrar y descifrar las claves de datos.  
En este ejemplo, se utiliza `CreateMrkMultiKeyring` para crear un conjunto de claves de AWS KMS con una clave de 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.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**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-net-using.md#net-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.  
Debe especificarlo `FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` como modificación de texto no cifrado. Esta política sigue leyendo y escribiendo elementos de texto no cifrado, lee los elementos cifrados y prepara al cliente para escribir elementos cifrados.  
Para obtener más información sobre los valores incluidos en la tabla de configuración de cifrado, consulte. [Configuración de cifrado en el SDK de cifrado AWS de bases de datos para DynamoDB](ddb-java-using.md#ddb-config-encrypt)  

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    PlaintextOverride = FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT
};
tableConfigs.Add(ddbTableName, config);
```

**5. Crear un nuevo cliente AWS SDK de DynamoDB**  
**En el siguiente ejemplo, se crea un nuevo cliente AWS SDK de DynamoDB mediante `TableEncryptionConfigs` el paso 4.**  

```
var ddb = new Client.DynamoDbClient(
    new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });
```

## Paso 2: escribir elementos cifrados y firmados
<a name="ddb-net-add-step2"></a>

Actualice la política de texto sin formato en la configuración de cifrado de la tabla para permitir que el cliente escriba elementos cifrados y firmados. Tras implementar el siguiente cambio, el cliente cifrará y firmará los nuevos elementos en función de las acciones de atributos que configuró en el **paso** 1. El cliente podrá leer los elementos en texto no cifrado y los elementos cifrados y firmados.

Antes de continuar con el [Paso 3](#ddb-net-add-step3), debe cifrar y firmar todos los elementos de texto no cifrado existentes en la tabla. No existe una métrica o consulta única que pueda ejecutar para cifrar rápidamente los elementos de texto no cifrado existentes. Utilice el proceso que mejor se adapte a su sistema. Por ejemplo, puede utilizar un proceso asíncrono que escanee lentamente la tabla y reescriba los elementos mediante las acciones de los atributos y la configuración de cifrado que haya definido. Para identificar los elementos de texto sin formato de la tabla, se recomienda buscar todos los elementos que no contengan los `aws_dbe_foot` atributos que el `aws_dbe_head` SDK de cifrado de AWS bases de datos añade a los elementos cuando están cifrados y firmados.

En el siguiente ejemplo, se actualiza la configuración de cifrado de la tabla desde el **paso 1**. Debe actualizar la anulación de texto no cifrado con `FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT`. Esta política sigue leyendo los elementos de texto no cifrado, pero también lee y escribe los elementos cifrados. Cree un nuevo cliente AWS SDK de DynamoDB con la actualización. `TableEncryptionConfigs`

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    PlaintextOverride = FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT
};
tableConfigs.Add(ddbTableName, config);
```

## Paso 3: Lee solo los elementos cifrados y firmados
<a name="ddb-net-add-step3"></a>

Una vez cifrados y firmados todos los elementos, actualice la modificación del texto sin formato en la configuración de cifrado de la tabla para que el cliente solo pueda leer y escribir los elementos cifrados y firmados. Tras implementar el siguiente cambio, el cliente cifrará y firmará los nuevos elementos en función de las acciones de atributos que configuró en el **paso 1**. El cliente solo podrá leer los elementos cifrados y firmados.

En el siguiente ejemplo, se actualiza la configuración de cifrado de la tabla desde el **paso** 2. Puede actualizar la anulación de texto no cifrado con `FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT` o eliminar la política de texto no cifrado de su configuración. De forma predeterminada, el cliente solo lee y escribe los elementos cifrados y firmados. Cree un nuevo cliente AWS SDK de DynamoDB con la actualización. `TableEncryptionConfigs`

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    // Optional: you can also remove the plaintext policy from your configuration
    PlaintextOverride = FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT
};
tableConfigs.Add(ddbTableName, config);
```