

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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

Questo argomento spiega come installare e utilizzare la versione 3. *x* della libreria di crittografia lato client.NET per DynamoDB. Per i dettagli sulla programmazione con AWS Database Encryption SDK per DynamoDB, consulta gli [esempi.NET nel](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/) aws-database-encryption-sdk repository -dynamodb su. GitHub

La libreria di crittografia lato client.NET per DynamoDB è destinata agli sviluppatori che scrivono applicazioni in C\$1 e altri linguaggi di programmazione.NET. ed è supportata su Windows, macOS e Linux.

Tutte le implementazioni del [linguaggio di programmazione](ddb-programming-languages.md) del AWS Database Encryption SDK per DynamoDB sono interoperabili. Tuttavia, non SDK per .NET supporta valori vuoti per i tipi di dati di elenchi o mappe. Ciò significa che se si utilizza la libreria di crittografia lato client Java per DynamoDB per scrivere un elemento che contiene valori vuoti per un tipo di dati di elenco o mappa, non è possibile decrittografare e leggere tale elemento utilizzando la libreria di crittografia lato client.NET per DynamoDB.

**Topics**
+ [Installazione](#ddb-net-install)
+ [Debug](#ddb-net-debugging)
+ [Utilizzo del client.NET](ddb-net-using.md)
+ [esempi.NET](ddb-net-examples.md)
+ [Aggiungi la versione 3.x a una tabella esistente](ddb-net-config-existing-table.md)

## Installazione della libreria di crittografia lato client.NET per DynamoDB
<a name="ddb-net-install"></a>

[La libreria di crittografia lato client.NET per DynamoDB è disponibile come AWS.Cryptography. DbEncryptionSDK. DynamoDb](https://www.nuget.org/packages/AWS.Cryptography.DbEncryptionSDK.DynamoDb/)pacchetto in NuGet. Per informazioni dettagliate sull'installazione e la creazione della libreria, consultate il [file.NET README.md](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/DynamoDbEncryption/runtimes/net/README.md) nel repository -dynamodb. aws-database-encryption-sdk La libreria di crittografia lato client.NET per DynamoDB richiede le chiavi SDK per .NET anche se non si utilizzano (). AWS Key Management Service AWS KMS SDK per .NET Viene installato con il pacchetto. NuGet 

Versione 3. *x* della libreria di crittografia lato client.NET per DynamoDB supporta .NET 6.0 e.NET Framework net48 e versioni successive.

## Esecuzione del debug con.NET
<a name="ddb-net-debugging"></a>

La libreria di crittografia lato client.NET per DynamoDB non genera alcun registro. Le eccezioni nella libreria di crittografia lato client.NET per DynamoDB generano un messaggio di eccezione, ma nessuna traccia dello stack.

Per aiutarti a eseguire il debug, assicurati di abilitare l'accesso a. SDK per .NET I log e i messaggi di errore di SDK per .NET possono aiutarti a distinguere gli errori derivanti SDK per .NET da quelli presenti nella libreria di crittografia lato client.NET per DynamoDB. *Per informazioni sulla SDK per .NET registrazione, consulta la Guida per gli sviluppatori. [AWSLogging](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-config-other.html#config-setting-awslogging)AWS SDK per .NET * (Per vedere l'argomento, espandi la sezione **Apri per visualizzare il contenuto di.NET Framework**).

# Utilizzo della libreria di crittografia lato client.NET per DynamoDB
<a name="ddb-net-using"></a>

Questo argomento spiega alcune delle funzioni e delle classi di supporto della versione 3. *x* della libreria di crittografia lato client.NET per DynamoDB. 

Per i dettagli sulla programmazione con la libreria di crittografia lato client.NET per DynamoDB, consulta gli [esempi.NET](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/) nel repository -dynamodb su. aws-database-encryption-sdk GitHub

**Topics**
+ [Componenti di crittografia dell'item](#ddb-net-item-encryptors)
+ [Operazioni di attributo](#ddb-net-attribute-actions)
+ [Configurazione della crittografia](#ddb-net-config-encrypt)
+ [Aggiornamento degli elementi](#ddb-net-update-items)

## Componenti di crittografia dell'item
<a name="ddb-net-item-encryptors"></a>

Fondamentalmente, il AWS Database Encryption SDK per DynamoDB è un cifratore di elementi. È possibile utilizzare la versione 3. *x* della libreria di crittografia lato client.NET per DynamoDB per crittografare, firmare, verificare e decrittografare gli elementi della tabella DynamoDB nei seguenti modi.

**L'SDK di crittografia del AWS database di basso livello per l'API DynamoDB**  
È possibile utilizzare la [configurazione di crittografia delle tabelle](#ddb-net-config-encrypt) per creare un client DynamoDB che crittografa e firma automaticamente gli elementi lato client con le richieste 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)  
[È necessario utilizzare l'API AWS Database Encryption SDK di basso livello per DynamoDB per utilizzare la crittografia ricercabile.](searchable-encryption.md)

**Il livello inferiore `DynamoDbItemEncryptor`**  
Il livello inferiore crittografa e firma o decrittografa e verifica `DynamoDbItemEncryptor` direttamente gli elementi della tabella senza chiamare DynamoDB. Non crea DynamoDB o `PutItem` richieste`GetItem`. Ad esempio, puoi utilizzare il livello inferiore per `DynamoDbItemEncryptor` decrittografare e verificare direttamente un elemento DynamoDB che hai già recuperato. Se si utilizza il livello inferiore`DynamoDbItemEncryptor`, si consiglia di utilizzare il [modello di programmazione di basso livello](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-low-level) SDK per .NET fornito per comunicare con DynamoDB.  
[Il livello inferiore non supporta la crittografia ricercabile`DynamoDbItemEncryptor`.](searchable-encryption.md)

## Azioni relative agli attributi nel AWS Database Encryption SDK per DynamoDB
<a name="ddb-net-attribute-actions"></a>

[Le azioni relative](concepts.md#crypt-actions) agli attributi determinano quali valori degli attributi sono crittografati e firmati, quali sono solo firmati, quali sono firmati e inclusi nel contesto di crittografia e quali vengono ignorati.

Per specificare le azioni relative agli attributi con il client.NET, definisci manualmente le azioni relative agli attributi utilizzando un modello a oggetti. Specificate le azioni relative agli attributi creando un `Dictionary` oggetto in cui le coppie nome-valore rappresentano i nomi degli attributi e le azioni specificate.

Specificate `ENCRYPT_AND_SIGN` di crittografare e firmare un attributo. `SIGN_ONLY`Specificare di firmare, ma non crittografare, un attributo. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`Specificare di firmare un attributo e di includerlo nel contesto di crittografia. Non è possibile crittografare un attributo senza firmarlo. `DO_NOTHING`Specificare di ignorare un attributo.

Gli attributi di partizione e ordinamento devono essere `SIGN_ONLY` o`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Se si definiscono gli attributi come`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, allora anche gli attributi di partizione e ordinamento devono essere uguali. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`

**Nota**  
Dopo aver definito le azioni relative agli attributi, è necessario definire quali attributi sono esclusi dalle firme. Per semplificare l'aggiunta di nuovi attributi non firmati in futuro, consigliamo di scegliere un prefisso distinto (ad esempio "`:`«) per identificare gli attributi non firmati. Includi questo prefisso nel nome dell'attributo per tutti gli attributi contrassegnati durante `DO_NOTHING` la definizione dello schema DynamoDB e delle azioni degli attributi.

Il seguente modello a oggetti mostra come specificare `ENCRYPT_AND_SIGN` `SIGN_ONLY``SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, e `DO_NOTHING` attribuire azioni con il client.NET. Questo esempio utilizza il prefisso "`:`" per identificare `DO_NOTHING` gli attributi.

**Nota**  
Per utilizzare l'azione `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` crittografica, è necessario utilizzare la versione 3.3 o successiva di AWS Database Encryption SDK. Distribuisci la nuova versione a tutti i lettori prima di [aggiornare il modello di dati](ddb-update-data-model.md) per includere. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`

```
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
};
```

## Configurazione della crittografia nel AWS Database Encryption SDK per DynamoDB
<a name="ddb-net-config-encrypt"></a>

Quando si utilizza AWS Database Encryption SDK, è necessario definire in modo esplicito una configurazione di crittografia per la tabella DynamoDB. I valori richiesti nella configurazione di crittografia dipendono dal fatto che le azioni degli attributi siano state definite manualmente o con una classe di dati annotata.

Il seguente frammento definisce una configurazione di crittografia delle tabelle DynamoDB utilizzando l'API AWS Database Encryption SDK di basso livello per DynamoDB e gli attributi non firmati consentiti definiti da un prefisso 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);
```

**Nome della tabella logica**  
Un nome di tabella logica per la tabella DynamoDB.  
Il nome della tabella logica è associato crittograficamente a tutti i dati memorizzati nella tabella per semplificare le operazioni di ripristino di DynamoDB. Consigliamo vivamente di specificare il nome della tabella DynamoDB come nome della tabella logica quando si definisce per la prima volta la configurazione di crittografia. È necessario specificare sempre lo stesso nome di tabella logica. Affinché la decrittografia abbia esito positivo, il nome della tabella logica deve corrispondere al nome specificato nella crittografia. Nel caso in cui il nome della tabella DynamoDB cambi dopo il [ripristino della tabella DynamoDB da un backup, il nome della tabella](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html) logica assicura che l'operazione di decrittografia riconosca ancora la tabella.

**Attributi non firmati consentiti**  
Gli attributi contrassegnati `DO_NOTHING` nelle azioni relative agli attributi.  
Gli attributi non firmati consentiti indicano al client quali attributi sono esclusi dalle firme. Il client presume che tutti gli altri attributi siano inclusi nella firma. Quindi, durante la decrittografia di un record, il client determina quali attributi deve verificare e quali ignorare tra gli attributi non firmati consentiti specificati. Non è possibile rimuovere un attributo dagli attributi non firmati consentiti.  
È possibile definire gli attributi non firmati consentiti in modo esplicito creando un array che elenca tutti gli attributi. `DO_NOTHING` È inoltre possibile specificare un prefisso distinto quando si assegnano nomi `DO_NOTHING` agli attributi e utilizzare il prefisso per indicare al client quali attributi non sono firmati. Consigliamo vivamente di specificare un prefisso distinto perché semplifica il processo di aggiunta di un nuovo `DO_NOTHING` attributo in futuro. Per ulteriori informazioni, consulta [Aggiornamento del modello di dati](ddb-update-data-model.md).  
Se non si specifica un prefisso per tutti gli `DO_NOTHING` attributi, è possibile configurare un `allowedUnsignedAttributes` array che elenchi in modo esplicito tutti gli attributi che il client dovrebbe aspettarsi che non siano firmati quando li incontra durante la decrittografia. È necessario definire in modo esplicito gli attributi non firmati consentiti solo se assolutamente necessario.

**Configurazione della ricerca (opzionale)**  
`SearchConfig`definisce la versione del [beacon](using-beacons.md#beacon-version).  
[È `SearchConfig` necessario specificare il per utilizzare la [crittografia ricercabile](searchable-encryption.md) o i beacon firmati.](configure.md#signed-beacons)

**Algorithm Suite (opzionale)**  
`algorithmSuiteId`Definisce la suite di algoritmi utilizzata da AWS Database Encryption SDK.  
A meno che non si specifichi esplicitamente una suite di algoritmi alternativa, AWS Database Encryption SDK utilizza la suite di algoritmi [predefinita](supported-algorithms.md#recommended-algorithms). [La suite di algoritmi predefinita utilizza l'algoritmo AES-GCM con derivazione delle chiavi, firme [digitali](concepts.md#digital-sigs) e impegno delle chiavi.](concepts.md#key-commitment) Sebbene la suite di algoritmi predefinita sia probabilmente adatta alla maggior parte delle applicazioni, è possibile scegliere una suite di algoritmi alternativa. Ad esempio, alcuni modelli di fiducia sarebbero soddisfatti da una suite di algoritmi senza firme digitali. Per informazioni sulle suite di algoritmi supportate da AWS Database Encryption SDK, consulta. [Suite di algoritmi supportate nel AWS Database Encryption SDK](supported-algorithms.md)  
Per selezionare la [suite di algoritmi AES-GCM senza firme digitali ECDSA](supported-algorithms.md#other-algorithms), includi il seguente frammento nella configurazione di crittografia delle tabelle.  

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

## Aggiornamento degli AWS elementi con Database Encryption SDK
<a name="ddb-net-update-items"></a>

Il AWS Database Encryption SDK non supporta [ddb: UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) per gli elementi che includono attributi crittografati o firmati. Per aggiornare un attributo crittografato o firmato, è necessario utilizzare [ddb](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html):. PutItem Quando specifichi la stessa chiave primaria di un elemento esistente nella tua `PutItem` richiesta, il nuovo elemento sostituisce completamente l'elemento esistente. Puoi anche usare [CLOBBER](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html#CLOBBER) per cancellare e sostituire tutti gli attributi al momento del salvataggio dopo aver aggiornato i tuoi articoli.

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

Gli esempi seguenti mostrano come utilizzare la libreria di crittografia lato client.NET per DynamoDB per proteggere gli elementi della tabella nell'applicazione. Per trovare altri esempi (e contribuire con i tuoi), consulta gli [esempi.NET](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/net/src) nel repository -dynamodb su. aws-database-encryption-sdk GitHub

Gli esempi seguenti mostrano come configurare la libreria di crittografia lato client.NET per DynamoDB in una nuova tabella Amazon DynamoDB non popolata. Se desideri configurare le tabelle Amazon DynamoDB esistenti per la crittografia lato client, consulta. [Aggiungi la versione 3.x a una tabella esistente](ddb-net-config-existing-table.md)

**Topics**
+ [Utilizzo dell'SDK di basso livello AWS Database Encryption per DynamoDB API](#ddb-net-lowlevel-API-example)
+ [Utilizzo del livello inferiore `DynamoDbItemEncryptor`](#ddb-net-itemencryptor)

## Utilizzo dell'SDK di basso livello AWS Database Encryption per DynamoDB API
<a name="ddb-net-lowlevel-API-example"></a>

L'esempio seguente mostra come utilizzare l'API AWS Database Encryption SDK di basso livello per DynamoDB con un [AWS KMS portachiavi](use-kms-keyring.md) per crittografare e firmare automaticamente gli elementi lato client con le richieste DynamoDB. `PutItem`

Puoi utilizzare qualsiasi [portachiavi supportato, ma ti consigliamo di utilizzare uno dei portachiavi](keyrings.md) quando possibile. AWS KMS 

**[Guarda l'esempio di codice completo: .cs BasicPutGetExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/BasicPutGetExample.cs)**

**Fase 1: Creare il portachiavi AWS KMS **  
L'esempio seguente utilizza la creazione `CreateAwsKmsMrkMultiKeyring` di un AWS KMS portachiavi con una chiave KMS di crittografia simmetrica. Il `CreateAwsKmsMrkMultiKeyring` metodo garantisce che il portachiavi gestisca correttamente sia le chiavi a regione singola che quelle a più regioni.  

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

**Passaggio 2: configura le azioni relative agli attributi**  
L'esempio seguente definisce un `attributeActionsOnEncrypt` dizionario che rappresenta [azioni di esempio relative agli attributi](concepts.md#crypt-actions) per un elemento della tabella.  
L'esempio seguente non definisce alcun attributo come`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Se si specifica un `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` attributo, devono esserlo `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` anche gli attributi di partizione e ordinamento.

```
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
};
```

**Fase 3: Definire quali attributi sono esclusi dalle firme**  
L'esempio seguente presuppone che tutti `DO_NOTHING` gli attributi condividano il prefisso distinto "`:`«e utilizza il prefisso per definire gli attributi non firmati consentiti. Il client presuppone che qualsiasi nome di attributo con il prefisso "`:`" sia escluso dalle firme. Per ulteriori informazioni, consulta [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

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

**Fase 4: Definire la configurazione di crittografia delle tabelle DynamoDB**  
L'esempio seguente definisce una `tableConfigs` mappa che rappresenta la configurazione di crittografia per questa tabella DynamoDB.  
[Questo esempio specifica il nome della tabella DynamoDB come nome della tabella logica.](ddb-net-using.md#net-logical-table-name) Consigliamo vivamente di specificare il nome della tabella DynamoDB come nome della tabella logica quando si definisce per la prima volta la configurazione di crittografia. Per ulteriori informazioni, consulta [Configurazione della crittografia nel AWS Database Encryption SDK per DynamoDB](ddb-net-using.md#ddb-net-config-encrypt).  
Per utilizzare la [crittografia ricercabile](searchable-encryption.md) o [i beacon firmati](configure.md#signed-beacons), è necessario includerli anche nella configurazione di crittografia. [`SearchConfig`](ddb-java-using.md#ddb-search-config)

```
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);
```

**Fase 5: Creare un nuovo client AWS SDK DynamoDB**  
**L'esempio seguente crea un nuovo client AWS SDK DynamoDB utilizzando `TableEncryptionConfigs` lo Step 4.**  

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

**Fase 6: Crittografare e firmare un elemento della tabella DynamoDB**  
L'esempio seguente definisce un `item` dizionario che rappresenta un elemento di tabella di esempio e inserisce l'elemento nella tabella DynamoDB. L'elemento viene crittografato e firmato lato client prima di essere inviato 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);
```

## Utilizzo del livello inferiore `DynamoDbItemEncryptor`
<a name="ddb-net-itemencryptor"></a>

L'esempio seguente mostra come utilizzare il livello inferiore `DynamoDbItemEncryptor` con un [AWS KMS portachiavi](use-kms-keyring.md) per crittografare e firmare direttamente gli elementi della tabella. Non `DynamoDbItemEncryptor` inserisce l'elemento nella tabella DynamoDB.

Puoi utilizzare qualsiasi [portachiavi](keyrings.md) supportato con DynamoDB Enhanced Client, ma consigliamo di utilizzare uno dei AWS KMS portachiavi quando possibile.

**Nota**  
[Il livello inferiore `DynamoDbItemEncryptor` non supporta la crittografia ricercabile.](searchable-encryption.md) Utilizza l'API AWS Database Encryption SDK di basso livello per DynamoDB per utilizzare la crittografia ricercabile.

**[Guarda l'esempio di codice completo: .cs ItemEncryptDecryptExample](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/itemencryptor/ItemEncryptDecryptExample.cs)**

**Fase 1: Creare il portachiavi AWS KMS **  
L'esempio seguente utilizza la creazione `CreateAwsKmsMrkMultiKeyring` di un AWS KMS portachiavi con una chiave KMS di crittografia simmetrica. Il `CreateAwsKmsMrkMultiKeyring` metodo garantisce che il portachiavi gestisca correttamente sia le chiavi a regione singola che quelle a più regioni.  

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

**Passaggio 2: configura le azioni relative agli attributi**  
L'esempio seguente definisce un `attributeActionsOnEncrypt` dizionario che rappresenta [azioni di esempio relative agli attributi](concepts.md#crypt-actions) per un elemento della tabella.  
L'esempio seguente non definisce alcun attributo come`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Se si specifica un `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` attributo, devono esserlo `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` anche gli attributi di partizione e ordinamento.

```
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
};
```

**Fase 3: Definire quali attributi sono esclusi dalle firme**  
L'esempio seguente presuppone che tutti `DO_NOTHING` gli attributi condividano il prefisso distinto "`:`«e utilizza il prefisso per definire gli attributi non firmati consentiti. Il client presuppone che qualsiasi nome di attributo con il prefisso "`:`" sia escluso dalle firme. Per ulteriori informazioni, consulta [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

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

**Fase 4: Definire la configurazione `DynamoDbItemEncryptor`**  
L'esempio seguente definisce la configurazione per`DynamoDbItemEncryptor`.  
[Questo esempio specifica il nome della tabella DynamoDB come nome della tabella logica.](ddb-net-using.md#net-logical-table-name) Consigliamo vivamente di specificare il nome della tabella DynamoDB come nome della tabella logica quando si definisce per la prima volta la configurazione di crittografia. Per ulteriori informazioni, consulta [Configurazione della crittografia nel AWS Database Encryption SDK per 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
};
```

**Fase 5: Creare il `DynamoDbItemEncryptor`**  
L'esempio seguente ne crea uno nuovo `DynamoDbItemEncryptor` utilizzando il `config` tratto dal **passaggio 4**.  

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

**Fase 6: Crittografare e firmare direttamente un elemento della tabella**  
L'esempio seguente crittografa e firma direttamente un elemento utilizzando il. `DynamoDbItemEncryptor` Non `DynamoDbItemEncryptor` inserisce l'elemento nella tabella 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;
```

# Configurare una tabella DynamoDB esistente per utilizzare AWS il Database Encryption SDK per DynamoDB
<a name="ddb-net-config-existing-table"></a>

Con la versione 3. *x* della libreria di crittografia lato client.NET per DynamoDB, puoi configurare le tabelle Amazon DynamoDB esistenti per la crittografia lato client. Questo argomento fornisce indicazioni sui tre passaggi da eseguire per aggiungere la versione 3. *x* su una tabella DynamoDB esistente e popolata.

## Fase 1: Prepararsi a leggere e scrivere elementi crittografati
<a name="ddb-net-add-step1"></a>

Completa i seguenti passaggi per preparare il client AWS Database Encryption SDK per leggere e scrivere elementi crittografati. Dopo aver implementato le seguenti modifiche, il client continuerà a leggere e scrivere elementi in testo non crittografato. Non crittograferà né firmerà i nuovi elementi scritti nella tabella, ma sarà in grado di decrittografare gli elementi crittografati non appena vengono visualizzati. Queste modifiche preparano il client a iniziare a [crittografare](#ddb-net-add-step2) nuovi elementi. Le seguenti modifiche devono essere implementate su ciascun lettore prima di procedere al passaggio successivo.

**1. Definite le azioni relative agli [attributi](concepts.md#crypt-actions)**  
Create un modello a oggetti per definire quali valori degli attributi verranno crittografati e firmati, quali verranno solo firmati e quali ignorati.  
Per impostazione predefinita, gli attributi della chiave primaria sono firmati ma non crittografati (`SIGN_ONLY`) e tutti gli altri attributi sono crittografati e firmati (`ENCRYPT_AND_SIGN`).  
`ENCRYPT_AND_SIGN`Specificare di crittografare e firmare un attributo. `SIGN_ONLY`Specificare di firmare, ma non crittografare, un attributo. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`Specificare se firmare e attribuire e includerlo nel contesto di crittografia. Non è possibile crittografare un attributo senza firmarlo. `DO_NOTHING`Specificare di ignorare un attributo. Per ulteriori informazioni, consulta [Azioni relative agli attributi nel AWS Database Encryption SDK per DynamoDB](ddb-net-using.md#ddb-net-attribute-actions).  
Se specificate degli `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` attributi, devono esserlo `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` anche gli attributi di partizione e ordinamento.

```
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. Definite quali attributi verranno esclusi dalle firme**  
L'esempio seguente presuppone che tutti `DO_NOTHING` gli attributi condividano il prefisso distinto "`:`«e utilizza il prefisso per definire gli attributi non firmati consentiti. Il client presumerà che qualsiasi nome di attributo con il prefisso "`:`" sia escluso dalle firme. Per ulteriori informazioni, consulta [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

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

**3. [Crea un portachiavi](keyrings.md)**  
L'esempio seguente crea un [AWS KMS portachiavi](use-kms-keyring.md). Il AWS KMS portachiavi utilizza la crittografia simmetrica o RSA asimmetrica per generare, crittografare e AWS KMS keys decrittografare le chiavi di dati.  
Questo esempio utilizza per creare un portachiavi con una chiave KMS di crittografia `CreateMrkMultiKeyring` simmetrica. AWS KMS Il `CreateAwsKmsMrkMultiKeyring` metodo garantisce che il portachiavi gestisca correttamente sia le chiavi a regione singola che quelle a più regioni.  

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

**4. Definire la configurazione di crittografia delle tabelle DynamoDB **  
L'esempio seguente definisce una `tableConfigs` mappa che rappresenta la configurazione di crittografia per questa tabella DynamoDB.  
[Questo esempio specifica il nome della tabella DynamoDB come nome della tabella logica.](ddb-net-using.md#net-logical-table-name) Consigliamo vivamente di specificare il nome della tabella DynamoDB come nome della tabella logica quando si definisce per la prima volta la configurazione di crittografia.  
È necessario specificare `FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` come override in testo semplice. Questa politica continua a leggere e scrivere elementi in testo non crittografato, legge elementi crittografati e prepara il client a scrivere elementi crittografati.  
Per ulteriori informazioni sui valori inclusi nella configurazione di crittografia delle tabelle, vedere. [Configurazione della crittografia nel AWS Database Encryption SDK per 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. Crea un nuovo client AWS SDK DynamoDB**  
**L'esempio seguente crea un nuovo client AWS SDK DynamoDB utilizzando `TableEncryptionConfigs` lo Step 4.**  

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

## Fase 2: Scrivere elementi crittografati e firmati
<a name="ddb-net-add-step2"></a>

Aggiorna la politica di testo in chiaro nella configurazione di crittografia delle tabelle per consentire al client di scrivere elementi crittografati e firmati. **Dopo aver implementato la seguente modifica, il client crittograferà e firmerà i nuovi elementi in base alle azioni degli attributi configurate nel passaggio 1.** Il client sarà in grado di leggere elementi in testo semplice e elementi crittografati e firmati.

Prima di procedere alla [Fase 3](#ddb-net-add-step3), è necessario crittografare e firmare tutti gli elementi di testo in chiaro esistenti nella tabella. Non è possibile eseguire alcuna metrica o query per crittografare rapidamente gli elementi di testo in chiaro esistenti. Utilizzate il processo più adatto al vostro sistema. Ad esempio, è possibile utilizzare un processo asincrono che scansiona lentamente la tabella e quindi riscrive gli elementi utilizzando le azioni degli attributi e la configurazione di crittografia definite. Per identificare gli elementi di testo in chiaro nella tabella, consigliamo di cercare tutti gli elementi che non contengono gli `aws_dbe_foot` attributi `aws_dbe_head` e che AWS Database Encryption SDK aggiunge agli elementi quando sono crittografati e firmati.

**L'esempio seguente aggiorna la configurazione di crittografia della tabella dal passaggio 1.** È necessario aggiornare l'override del testo in chiaro con. `FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` Questo criterio continua a leggere gli elementi di testo in chiaro, ma legge e scrive anche gli elementi crittografati. Crea un nuovo client AWS SDK DynamoDB utilizzando l'aggiornamento. `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);
```

## Passaggio 3: Leggi solo gli elementi crittografati e firmati
<a name="ddb-net-add-step3"></a>

Dopo aver crittografato e firmato tutti gli elementi, aggiorna l'override del testo in chiaro nella configurazione di crittografia delle tabelle per consentire al client solo di leggere e scrivere elementi crittografati e firmati. **Dopo aver implementato la seguente modifica, il client crittograferà e firmerà i nuovi elementi in base alle azioni degli attributi configurate nel passaggio 1.** Il client sarà in grado di leggere solo gli elementi crittografati e firmati.

L'esempio seguente aggiorna la configurazione di crittografia delle tabelle dal **passaggio 2**. È possibile aggiornare l'override del testo in chiaro con `FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT` o rimuovere la politica del testo in chiaro dalla configurazione. Per impostazione predefinita, il client legge e scrive solo elementi crittografati e firmati. Crea un nuovo client AWS SDK DynamoDB utilizzando l'aggiornamento. `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);
```