

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Ancien client de chiffrement DynamoDB
<a name="legacy-dynamodb-encryption-client"></a>

Le 9 juin 2023, notre bibliothèque de chiffrement côté client a été renommée AWS Database Encryption SDK. Le SDK AWS de chiffrement de base de données continue de prendre en charge les anciennes versions du client de chiffrement DynamoDB. Pour plus d'informations sur les différentes parties de la bibliothèque de chiffrement côté client qui ont changé avec le changement de nom, consultez. [Changement du nom du client de chiffrement Amazon DynamoDB](DDBEC-rename.md)

Pour migrer vers la dernière version de la bibliothèque de chiffrement côté client Java pour DynamoDB, consultez. [Migrer vers la version 3.x](ddb-java-migrate.md)

**Topics**
+ [AWS SDK de chiffrement de base de données pour la prise en charge des versions DynamoDB](#legacy-support)
+ [Fonctionnement du client de chiffrement DynamoDB](DDBEC-legacy-how-it-works.md)
+ [Concepts du client de chiffrement Amazon DynamoDB](DDBEC-legacy-concepts.md)
+ [Fournisseur de matériel cryptographique](crypto-materials-providers.md)
+ [Langages de programmation disponibles pour le client de chiffrement Amazon DynamoDB](programming-languages.md)
+ [Modification de votre modèle de données](data-model.md)
+ [Résolution des problèmes liés à votre application cliente de chiffrement DynamoDB](troubleshooting.md)

## AWS SDK de chiffrement de base de données pour la prise en charge des versions DynamoDB
<a name="legacy-support"></a>

Les rubriques du chapitre Legacy fournissent des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python.

Le tableau suivant répertorie les langues et les versions qui prennent en charge le chiffrement côté client dans Amazon DynamoDB.


| Langage de programmation | Version | Phase du cycle de vie de la version majeure du SDK | 
| --- | --- | --- | 
|  Java  |  Versions 1. *x*  |  [End-of-Support phase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), en vigueur en juillet 2022  | 
|  Java  |  Versions 2. *x*  |  [Disponibilité générale](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 
|  Java  |  Version 3. *x*  |  [Disponibilité générale](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 
|  Python  |  Versions 1. *x*  |  [End-of-Support phase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), en vigueur en juillet 2022  | 
|  Python  |  Versions 2. *x*  |  [End-of-Support phase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), en vigueur en juillet 2022  | 
|  Python  |  Versions 3. *x*  |  [Disponibilité générale](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 

# Fonctionnement du client de chiffrement DynamoDB
<a name="DDBEC-legacy-how-it-works"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Le client de chiffrement DynamoDB est spécialement conçu pour protéger les données que vous stockez dans DynamoDB. Les bibliothèques incluent les implémentations sécurisées que vous pouvez étendre ou utiliser inchangées. Et, la plupart des éléments sont représentés par des éléments abstraits afin que vous puissiez créer et utiliser des composants personnalisés compatibles.

**Chiffrement et signature des éléments de table**

Au cœur du client de chiffrement DynamoDB se trouve *un outil de chiffrement d'éléments* qui chiffre, signe, vérifie et déchiffre les éléments de table. Il prend les informations sur les éléments de table et les instructions sur les éléments à chiffrer et signer. Il obtient les matériaux de chiffrement et les instructions sur leur utilisation auprès d'un [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) que vous sélectionnez et configurez. 

Le schéma suivant illustre un aperçu de haut niveau du processus.

![\[Chiffrement et signature d'éléments dans le client de chiffrement DynamoDB\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/arch-encrypt.png)


Pour chiffrer et signer un élément de table, le client de chiffrement DynamoDB a besoin des éléments suivants :
+ **Informations sur le tableau.** Il obtient des informations sur la table à partir d'un contexte de [chiffrement DynamoDB](concepts.md#encryption-context) que vous fournissez. Certains assistants obtiennent les informations requises auprès de DynamoDB et créent le contexte de chiffrement DynamoDB pour vous. 
**Note**  
Le *contexte de chiffrement DynamoDB dans le client de chiffrement* DynamoDB n'est pas lié au contexte de chiffrement dans () et *le*. AWS Key Management Service AWS KMS AWS Encryption SDK
+ **Attributs à chiffrer et signer.** Il obtient ces informations à partir des [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) que vous fournissez.
+ **Matériaux de chiffrement, clés de chiffrement et de signature incluses.** Il obtient ces informations auprès d'un [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) que vous sélectionnez et configurez. 
+ **Instructions pour le chiffrement et la signature de l'élément**. Le fournisseur CMP ajoute les instructions sur l'utilisation des matériaux de chiffrement, algorithmes de chiffrement et de signature inclus, à la [description du matériau réel](DDBEC-legacy-concepts.md#legacy-material-description).

Le [chiffreur d'élément](DDBEC-legacy-concepts.md#item-encryptor) utilise tous ces éléments pour chiffrer et signer l'élément. Le chiffreur d'élément ajoute aussi deux attributs à l'élément : un [attribut de description de matériau](DDBEC-legacy-concepts.md#legacy-material-description) qui contient les instructions de chiffrement et de signature (description du matériau réel), et un attribut qui contient la signature. Vous pouvez interagir directement avec le chiffreur d'élément, ou utilisez les fonctions d'annotation qui interagissent avec le chiffreur d'élément pour que vous implémentiez le comportement par défaut sécurisé.

Il en résulte un élément DynamoDB contenant les données chiffrées et signées.

**Vérification et déchiffrement des éléments de table**

Ces composants fonctionnent aussi ensemble pour vérifier et déchiffrer votre élément, comme illustré dans le schéma suivant.

![\[Vérification et déchiffrement d'éléments dans le client de chiffrement DynamoDB\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/arch-decrypt.png)


Pour vérifier et déchiffrer un élément, le client de chiffrement DynamoDB a besoin des mêmes composants, de composants présentant la même configuration ou de composants spécialement conçus pour déchiffrer les éléments, comme suit :
+ **Informations relatives à la table** issues du contexte de [chiffrement DynamoDB](concepts.md#encryption-context).
+ **Attributs à vérifier et à déchiffrer.** Il obtient ces informations à partir des [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions).
+ **Matériaux de déchiffrement, clés de vérification et de déchiffrement incluses**, depuis le [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) que vous sélectionnez et configurez.

  L'élément chiffré n'inclut pas d'enregistrement du CMP qui a été utilisé pour le chiffrer. Vous devez fournir le même CMP, un CMP avec la même configuration ou un CMP qui a été conçu pour déchiffrer les éléments.
+ **Informations sur la façon dont l'élément a été chiffré et signé**, algorithmes de chiffrement et de signature inclus. Le client obtient ces informations à partir de l'[attribut de description du matériau](DDBEC-legacy-concepts.md#legacy-material-description) de l'élément.

Le [chiffreur d'élément](DDBEC-legacy-concepts.md#item-encryptor) utilise tous ces éléments pour vérifier et déchiffrer l'élément. Il supprime aussi les attribut de description de matériau et de signature. Le résultat est un élément DynamoDB en texte brut.

# Concepts du client de chiffrement Amazon DynamoDB
<a name="DDBEC-legacy-concepts"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cette rubrique explique les concepts et la terminologie utilisés dans le client de chiffrement Amazon DynamoDB. 

Pour savoir comment les composants du client de chiffrement DynamoDB interagissent, consultez. [Fonctionnement du client de chiffrement DynamoDB](DDBEC-legacy-how-it-works.md)

**Topics**
+ [Fournisseur CMP (Cryptographic Materials Provider)](#concept-material-provider)
+ [Chiffreurs d'éléments](#item-encryptor)
+ [Actions d'attribut](#legacy-attribute-actions)
+ [Description du matériau](#legacy-material-description)
+ [Client de chiffrement DynamoDB](#legacy-encryption-context)
+ [Magasin de fournisseur](#provider-store)

## Fournisseur CMP (Cryptographic Materials Provider)
<a name="concept-material-provider"></a>

*Lorsque vous implémentez le client de chiffrement DynamoDB, l'une de vos premières tâches consiste [à sélectionner un fournisseur de matériel cryptographique](crypto-materials-providers.md) (CMP) (également appelé fournisseur de matériel de chiffrement).* Votre choix détermine une grande part du reste de l'implémentation. 

Un *fournisseur CMP* recueille, assemble et retourne les matériaux de chiffrement que le [chiffreur d'élément](#item-encryptor) utilise pour chiffrer et signer vos éléments de table. Le CMP détermine les algorithmes de chiffrement à utiliser, ainsi que la façon de générer et de protéger le chiffrement et les clés de signature.

Le fournisseur CMP interagit avec le chiffreur d'élément. Celui-ci demande les matériaux de chiffrement ou de déchiffrement au CMP, et le CMP les retourne au chiffreur d'élément. Puis, celui-ci utilise les matériaux de chiffrement pour chiffrer et signer, ou vérifier et déchiffrer, l'élément.

Vous spécifiez le CMP lorsque vous configurez le client. Vous pouvez créer un CMP personnalisé compatible ou utiliser l'un des nombreux modèles de CMPs la bibliothèque. La plupart CMPs sont disponibles pour plusieurs langages de programmation. 

## Chiffreurs d'éléments
<a name="item-encryptor"></a>

Le *chiffreur d'éléments est* un composant de niveau inférieur qui effectue des opérations de chiffrement pour le client de chiffrement DynamoDB. Il demande les matériaux de chiffrement auprès d'un [fournisseur CMP](#concept-material-provider), puis utilise les matériaux retournés par le CMP pour chiffrer et signer, ou vérifier et déchiffrer, votre élément de table.

Vous pouvez interagir directement avec le chiffreur d'élément ou utiliser les annotations fournis par votre bibliothèque. Par exemple, le client de chiffrement DynamoDB pour Java inclut `AttributeEncryptor` une classe d'assistance que vous pouvez utiliser avec `DynamoDBMapper` le chiffreur d'éléments, au lieu d'interagir directement avec celui-ci. `DynamoDBEncryptor` La bibliothèque Python inclut les classes d'annotations `EncryptedTable`, `EncryptedClient` et `EncryptedResource` qui interagissent avec le chiffreur d'éléments pour vous.

## Actions d'attribut
<a name="legacy-attribute-actions"></a>

Les *actions d'attribut* informent le chiffreur d'élément des actions à exécuter sur chaque attribut de l'élément. 

L'action d'attribut peut avoir l'une des valeurs suivantes :
+ **Chiffrer et signer** — Chiffrez la valeur de l'attribut. Incluez l'attribut (nom et valeur) dans la signature de l'élément.
+ **Signe uniquement** — Incluez l'attribut dans la signature de l'article.
+ **Ne rien faire** : ne chiffrez ni ne signez l'attribut.

Pour tout attribut pouvant stocker des données sensibles, utilisez **Chiffrer et signer**. Pour les attributs de clé primaire (clé de partition et clé de tri), utilisez **Signer uniquement**. L'[attribut de description de matériau](#legacy-material-description) et l'attribut de signature ne sont pas signés ou chiffrés. Vous n'avez pas besoin de spécifier les actions d'attribut pour ces attributs.

Choisissez soigneusement vos actions d'attribut. En cas de doute, utilisez **Chiffrer et signer**. Une fois que vous avez utilisé le client de chiffrement DynamoDB pour protéger les éléments de votre table, vous ne pouvez pas modifier l'action d'un attribut sans risquer une erreur de validation de signature. Pour en savoir plus, consultez [Modification de votre modèle de données](data-model.md).

**Avertissement**  
Ne chiffrez pas les attributs de la clé primaire. Ils doivent rester en texte brut pour que DynamoDB puisse trouver l'élément sans exécuter une analyse complète du tableau.

Si le contexte de [chiffrement DynamoDB](concepts.md#encryption-context) identifie les attributs de votre clé primaire, le client génère une erreur si vous essayez de les chiffrer.

La technique que vous utilisez pour spécifier les actions d'attribut dépend du langage de programmation que vous utilisez. Elle peut aussi être spécifique aux classes d'annotations que vous utilisez.

Pour plus d'informations, consultez la documentation de votre langage de programmation.
+ [Python](python-using.md#python-attribute-actions)
+ [Java](java-using.md#attribute-actions-java)

## Description du matériau
<a name="legacy-material-description"></a>

La *description du matériau* pour un élément de table chiffré se compose d'informations, telles que les algorithmes de chiffrement, sur la façon dont l'élément de table est chiffré et signé. Le [fournisseur CMP](#concept-material-provider) enregistre la description du matériau tandis qu'il rassemble les matériaux de chiffrement pour le chiffrement et la signature. Par la suite, quand il doit rassembler les matériaux de chiffrement pour vérifier et chiffrer l'élément, il utilise la description du matériau comme guide. 

Dans le client de chiffrement DynamoDB, la description matérielle fait référence à trois éléments connexes :

**Description du matériau demandé**  
Certains [fournisseurs de matériel cryptographique](#concept-material-provider) (CMPs) vous permettent de définir des options avancées, telles qu'un algorithme de chiffrement. Pour indiquer vos choix, vous ajoutez des paires nom-valeur à la propriété de description matérielle du [contexte de chiffrement DynamoDB dans votre demande de chiffrement](concepts.md#encryption-context) d'un élément de table. L'élément est appelé *description du matériau demandé*. Les valeurs autorisées pour la description du matériau demandé sont définies par le fournisseur CMP que vous choisissez.   
Comme la description du matériau peut remplacer les valeurs par défaut sécurisées, il est recommandé d'omettre la description du matériau demandé à moins que vous n'ayez une excellente raison de l'utiliser.

**Description du matériau réel**  
La description matérielle renvoyée par les [fournisseurs de matériel cryptographique](#concept-material-provider) (CMPs) est connue sous le nom de *description matérielle réelle*. Elle décrit les valeurs réelles que le CMP a utilisées quand il a rassemblé les matériaux de chiffrement. Elle se compose généralement de la description du matériau demandé, le cas échéant, avec les ajouts et les modifications.

**Attribut de description du matériau**  
Le client enregistre la description du matériau réel dans l'*attribut de description du matériau* de l'élément chiffré. Le nom de l'attribut de description du matériau est `amzn-ddb-map-desc` et sa valeur est la description du matériau réel. Le client utilise les valeurs de l'attribut de description du matériau pour vérifier et déchiffrer l'élément.

## Client de chiffrement DynamoDB
<a name="legacy-encryption-context"></a>

Le contexte de *chiffrement DynamoDB* fournit des informations sur la table et l'élément au fournisseur de [matériel cryptographique](#concept-material-provider) (CMP). [Dans les implémentations avancées, le contexte de chiffrement DynamoDB peut inclure une description matérielle demandée.](#legacy-material-description)

Lorsque vous chiffrez des éléments de table, le contexte de chiffrement DynamoDB est lié cryptographiquement aux valeurs d'attributs chiffrées. Lorsque vous déchiffrez, si le contexte de chiffrement DynamoDB ne correspond pas exactement, en distinguant majuscules et minuscules, au contexte de chiffrement DynamoDB utilisé pour le chiffrement, l'opération de déchiffrement échoue. Si vous interagissez directement avec le [chiffreur d'éléments, vous devez fournir un contexte de chiffrement DynamoDB lorsque vous appelez une méthode de chiffrement ou](#item-encryptor) de déchiffrement. La plupart des assistants créent le contexte de chiffrement DynamoDB pour vous.

**Note**  
Le *contexte de chiffrement DynamoDB dans le client de chiffrement* DynamoDB n'est pas lié au contexte de chiffrement dans () et *le*. AWS Key Management Service AWS KMS AWS Encryption SDK

Le contexte de chiffrement DynamoDB peut inclure les champs suivants. Tous les champs et valeurs sont facultatifs.
+ Nom de la table
+ Nom de la clé de partition
+ Nom de la clé de tri
+ Paires nom-valeur des attributs
+ [Description du matériau demandé](#legacy-material-description)

## Magasin de fournisseur
<a name="provider-store"></a>

Une *boutique de fournisseurs* est un composant qui renvoie des [fournisseurs de matériel cryptographique](#concept-material-provider) (CMPs). Le magasin du fournisseur peut les créer CMPs ou les obtenir à partir d'une autre source, telle qu'un autre magasin du fournisseur. Le magasin du fournisseur enregistre les versions CMPs qu'il crée dans un stockage persistant dans lequel chaque CMP stocké est identifié par le nom matériel du demandeur et le numéro de version. 

Le [fournisseur le plus récent](most-recent-provider.md) du client de chiffrement DynamoDB l'obtient CMPs auprès d'un magasin du fournisseur, mais vous pouvez utiliser le magasin du fournisseur pour CMPs approvisionner n'importe quel composant. Chaque fournisseur le plus récent est associé à une boutique de fournisseurs, mais une boutique de fournisseurs peut fournir des CMPs informations à de nombreux demandeurs sur plusieurs hôtes.

Le magasin du fournisseur crée de nouvelles versions CMPs de On Demand et renvoie les versions nouvelles et existantes. Il retourne aussi le dernier numéro de version d'un nom de matériau donné. Le demandeur peut ainsi savoir lorsque le magasin de fournisseur a une nouvelle version de son fournisseur, puis la demander.

Le client de chiffrement DynamoDB inclut [ MetaStore](most-recent-provider.md#about-metastore)un magasin fournisseur qui crée des clés CMPs Wrapped qui sont stockées dans DynamoDB et chiffrées à l'aide d'un client de chiffrement DynamoDB interne. 

**En savoir plus :**
+ Magasin de fournisseur : [Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/ProviderStore.html), [Python](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/src/dynamodb_encryption_sdk/material_providers/store/__init__.py)
+ MetaStore: [Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/MetaStore.html), [Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/materials_providers/metastore.html#module-dynamodb_encryption_sdk.material_providers.store.meta)

# Fournisseur de matériel cryptographique
<a name="crypto-materials-providers"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

L'une des décisions les plus importantes que vous prenez lorsque vous utilisez le client de chiffrement DynamoDB est de sélectionner [un fournisseur de matériel cryptographique](DDBEC-legacy-concepts.md#concept-material-provider) (CMP). Le fournisseur CMP assemble et retourne les matériaux de déchiffrement au chiffreur d'élément. Il détermine aussi la façon dont les clés de chiffrement et les clés de signature sont générées, que les nouveaux matériaux de clés soient générés pour chaque élément ou soient réutilisés, et les algorithmes de chiffrement et de signature qui sont utilisés. 

Vous pouvez choisir un CMP parmi les implémentations fournies dans les bibliothèques du client de chiffrement DynamoDB ou créer un CMP personnalisé compatible. Le choix du fournisseur CMP peut aussi dépendre du [langage de programmation](programming-languages.md) que vous utilisez.

Cette rubrique décrit les plus courantes CMPs et propose quelques conseils pour vous aider à choisir celle qui convient le mieux à votre application.

**Fournisseur de matériaux KMS direct**  
Le fournisseur de matériel KMS direct protège les articles de votre table sous un format [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)qui ne laisse jamais [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) non chiffré. Votre application n'a pas à générer ou gérer des matériaux de chiffrement. Comme il utilise le AWS KMS key pour générer des clés de chiffrement et de signature uniques pour chaque élément, ce fournisseur appelle AWS KMS chaque fois qu'il chiffre ou déchiffre un élément.   
Si vous utilisez AWS KMS et qu'un AWS KMS appel par transaction est pratique pour votre application, ce fournisseur est un bon choix.  
Pour en savoir plus, consultez [Fournisseur de matériaux KMS direct](direct-kms-provider.md).

**Fournisseur CMP encapsulé**  
Le Wrapped Materials Provider (Wrapped CMP) vous permet de générer et de gérer vos clés d'encapsulation et de signature en dehors du client de chiffrement DynamoDB.   
Le fournisseur CMP encapsulé génère une clé de chiffrement unique pour chaque élément. Puis, il utilise les clés d'encapsulation (ou de désencapsulation) et de signature que vous fournissez. En tant que tel, vous déterminez de quelle façon les clés d'encapsulation et de signature sont générées, et si elles sont propres à chaque élément ou sont réutilisées. Le Wrapped CMP est une alternative sécurisée au [fournisseur Direct KMS](direct-kms-provider.md) pour les applications qui n'utilisent pas de matériel cryptographique AWS KMS et qui peuvent le gérer en toute sécurité.  
Pour en savoir plus, consultez [Fournisseur de matériaux encapsulé](wrapped-provider.md).

**À propos du fournisseur le plus récent**  
Le *fournisseur le plus récent* est un [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) conçu pour travailler avec un [magasin de fournisseur](DDBEC-legacy-concepts.md#provider-store). Il CMPs provient du magasin du fournisseur et obtient le matériel cryptographique qu'il renvoie depuis le CMPs. Le fournisseur le plus récent utilise généralement chaque fournisseur CMP pour satisfaire plusieurs demandes de matériaux de chiffrement, mais vous pouvez utiliser les fonctions du magasin de fournisseur pour contrôler l'étendue à laquelle les matériaux sont réutilisés, déterminer à quelle fréquence a lieu la rotation des fournisseurs CMP et, même, modifier le type de fournisseur CMP utilisé sans modifier le fournisseur le plus récent.  
Vous pouvez utiliser le fournisseur le plus récent avec n'importe quel magasin de fournisseur compatible. Le client de chiffrement DynamoDB inclut MetaStore un, qui est un magasin fournisseur qui renvoie Wrapped. CMPs  
Le fournisseur le plus récent constitue un bon choix pour les applications qui doivent minimiser les appels à leur source de chiffrement, et pour les applications qui peuvent réutiliser certains matériaux de chiffrement sans enfreindre leurs exigences de sécurité. Par exemple, il vous permet de protéger votre matériel cryptographique avec un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) sans avoir à appeler AWS KMS chaque fois que vous chiffrez ou déchiffrez un élément.  
Pour en savoir plus, consultez [À propos du fournisseur le plus récent](most-recent-provider.md).

**Fournisseur de matériaux statique**  
Le fournisseur de matériaux statiques est conçu pour les tests, les proof-of-concept démonstrations et la compatibilité existante. Il ne génère pas de matériaux de chiffrement uniques pour chaque élément. Il retourne les mêmes clés de chiffrement et de signature que vous fournissez, et ces clés sont utilisées directement pour chiffrer, déchiffrer et signer vos éléments de table.   
Le [fournisseur statique asymétrique](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html) de la bibliothèque Java n'est pas un fournisseur statique. Il fournit juste d'autres constructeurs au [fournisseur CMP encapsulé](wrapped-provider.md). Il est sûr pour une utilisation en production, mais vous devez utiliser directement le CMP encapsulé chaque fois que possible.

**Topics**
+ [Fournisseur de matériaux KMS direct](direct-kms-provider.md)
+ [Fournisseur de matériaux encapsulé](wrapped-provider.md)
+ [À propos du fournisseur le plus récent](most-recent-provider.md)
+ [Fournisseur de matériaux statique](static-provider.md)

# Fournisseur de matériaux KMS direct
<a name="direct-kms-provider"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Le fournisseur de *matériel Direct KMS (fournisseur* direct KMS) protège les éléments de votre table sous un format [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)qui ne laisse jamais [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) non chiffré. Le [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) retourne une clé de chiffrement et une clé de signature uniques pour chaque élément de table. Pour ce faire, il appelle AWS KMS chaque fois que vous chiffrez ou déchiffrez un élément.

Si vous traitez des éléments DynamoDB à une fréquence élevée et à grande échelle, vous risquez de dépasser les limites, ce qui entraîne des AWS KMS [requests-per-secondretards](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second) de traitement. Si vous devez dépasser une limite, créez un dossier dans le [AWS Support Centre](https://console.aws.amazon.com/support/home). Vous pouvez également envisager de faire appel à un fournisseur de matériel cryptographique avec une réutilisation limitée des clés, tel que le [fournisseur le plus récent](most-recent-provider.md).

Pour utiliser le fournisseur Direct KMS, l'appelant doit avoir, au moins [un Compte AWS](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) AWS KMS key, et l'autorisation d'appeler les opérations [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)et de [déchiffrer](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) sur le. AWS KMS key AWS KMS key Il doit s'agir d'une clé de chiffrement symétrique ; le client de chiffrement DynamoDB ne prend pas en charge le chiffrement asymétrique. [Si vous utilisez une table [globale DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), vous souhaiterez peut-être spécifier AWS KMS une clé multirégionale.](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) Pour en savoir plus, consultez [Comment l'utiliser](#provider-kms-how-to-use).

**Note**  
Lorsque vous utilisez le fournisseur Direct KMS, les noms et les valeurs de vos attributs de clé primaire apparaissent en texte clair dans le [contexte de AWS KMS chiffrement](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) et dans AWS CloudTrail les journaux des AWS KMS opérations associées. Toutefois, le client de chiffrement DynamoDB n'expose jamais le texte en clair des valeurs d'attributs chiffrées.

Le fournisseur Direct KMS est l'un des nombreux [fournisseurs de matériel cryptographique](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) pris en charge par le client de chiffrement DynamoDB. Pour plus d'informations sur l'autre CMPs, voir[Fournisseur de matériel cryptographique](crypto-materials-providers.md).

**Pour obtenir un exemple de code, consultez :**
+ Java: [AwsKmsEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)
+ Python : [aws-kms-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py), [aws-kms-encrypted-item](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

**Topics**
+ [Comment l'utiliser](#provider-kms-how-to-use)
+ [Comment ça marche](#provider-kms-how-it-works)

## Comment l'utiliser
<a name="provider-kms-how-to-use"></a>

Pour créer un fournisseur KMS direct, utilisez le paramètre Key ID pour spécifier une [clé KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) de chiffrement symétrique dans votre compte. La valeur du paramètre Key ID peut être l'ID de clé, l'ARN de clé, le nom d'alias ou l'ARN d'alias du AWS KMS key. Pour plus de détails sur les identificateurs de clé, consultez la section [Identifiants de clé](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) dans le guide du *AWS Key Management Service développeur*.

Le fournisseur Direct KMS nécessite une clé KMS de chiffrement symétrique. Vous ne pouvez pas utiliser de clé KMS asymétrique. Toutefois, vous pouvez utiliser une clé KMS multirégionale, une clé KMS contenant des éléments clés importés ou une clé KMS dans un magasin de clés personnalisé. Vous devez disposer des autorisations [kms : GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) et [KMS:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) sur la clé KMS. Vous devez donc utiliser une clé gérée par le client, et non une clé KMS AWS gérée ou AWS détenue.

Le client de chiffrement DynamoDB pour Python détermine la région à AWS KMS appeler depuis la région dans la valeur du paramètre ID clé, s'il en inclut une. Sinon, il utilise la région du AWS KMS client, si vous en spécifiez une, ou la région que vous configurez dans le AWS SDK pour Python (Boto3). Pour plus d'informations sur la sélection de régions en Python, consultez [Configuration](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) dans le manuel de AWS référence de l'API SDK for Python (Boto3).

Le client de chiffrement DynamoDB pour Java détermine la région à AWS KMS appeler depuis la région du client, si AWS KMS le client que vous spécifiez inclut une région. Dans le cas contraire, il utilise la région que vous configurez dans le AWS SDK pour Java. Pour plus d'informations sur la sélection des régions dans le AWS SDK pour Java, voir [Région AWS sélection](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html) dans le guide du AWS SDK pour Java développeur.

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

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

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

L'exemple suivant utilise la clé ARN pour spécifier le AWS KMS key. Si votre identifiant de clé n'inclut pas de Région AWS, le client de chiffrement DynamoDB obtient la région à partir de la session Botocore configurée, s'il en existe une, ou à partir des paramètres par défaut de Boto.

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

------

Si vous utilisez des tables [globales Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), nous vous recommandons de chiffrer vos données sous une clé multirégionale. AWS KMS Les clés multirégionales sont AWS KMS keys différentes Régions AWS et peuvent être utilisées de manière interchangeable car elles ont le même identifiant de clé et le même matériau de clé. Pour plus de détails, consultez la section [Utilisation de clés multirégionales](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) dans le *Guide du AWS Key Management Service développeur*.

**Note**  
Si vous utilisez la [version 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html) des tables globales, vous devez définir des actions attributaires afin que les champs de réplication réservés ne soient ni chiffrés ni signés. Pour en savoir plus, consultez [Problèmes liés aux anciennes versions des tables globales](troubleshooting.md#fix-global-tables).

Pour utiliser une clé multirégionale avec le client de chiffrement DynamoDB, créez une clé multirégionale et répliquez-la dans les régions dans lesquelles votre application s'exécute. Configurez ensuite le fournisseur Direct KMS pour utiliser la clé multirégionale dans la région dans laquelle le client de chiffrement DynamoDB appelle. AWS KMS

L'exemple suivant configure le client de chiffrement DynamoDB pour chiffrer les données dans la région USA Est (Virginie du Nord) (us-east-1) et les déchiffrer dans la région USA Ouest (Oregon) (us-west-2) à l'aide d'une clé multirégionale.

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

Dans cet exemple, le client de chiffrement DynamoDB obtient la région à AWS KMS appeler depuis la région du client. AWS KMS La `keyArn` valeur identifie une clé multirégionale dans la même région.

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

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

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

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

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

Dans cet exemple, le client de chiffrement DynamoDB obtient la région à AWS KMS appeler depuis la région dans l'ARN de la clé.

```
# Encrypt in us-east-1

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

```
# Decrypt in us-west-2

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

------

## Comment ça marche
<a name="provider-kms-how-it-works"></a>

Le fournisseur Direct KMS renvoie des clés de chiffrement et de signature protégées par un AWS KMS key code que vous spécifiez, comme indiqué dans le schéma suivant.

![\[Entrée, traitement et sortie du fournisseur KMS direct dans le client de chiffrement DynamoDB\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/directKMS.png)

+ Pour générer du matériel de chiffrement, le fournisseur Direct KMS demande de AWS KMS [générer une clé de données unique](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) pour chaque élément à l'aide d'une clé AWS KMS key que vous spécifiez. Il dérive les clés de chiffrement et de signature de l'élément depuis la copie en texte brut de la [clé de données](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys), puis retourne les clés de chiffrement et de signature, ainsi que la clé des données chiffrées, qui est stockée dans l'[attribut de description de matériau](DDBEC-legacy-concepts.md#legacy-material-description) de l'élément. 

  Le chiffreur d'élément utilise les clés de chiffrement et de signature, et les supprime de la mémoire dès que possible. Seule la copie chiffrée de la clé de données à partir de laquelle elles ont été dérivées est enregistrée dans l'élément chiffré.
+ Pour générer du matériel de déchiffrement, le fournisseur KMS direct demande de AWS KMS déchiffrer la clé de données chiffrée. Puis, il dérive les clés de vérification et de signature de la clé de données en texte brut, et les retourne au chiffreur d'élément.

  Le chiffreur d'élément vérifie l'élément et, si la vérification aboutit, déchiffre les valeurs chiffrées. Puis, il supprime les clés de la mémoire dès que possible.

### Obtention des matériaux de chiffrement
<a name="direct-kms-get-encryption-materials"></a>

Cette section décrit en détail les entrées, les sorties et le traitement du fournisseur KMS direct quand il reçoit une demande de matériaux de chiffrement de la part du [chiffreur d'élément](DDBEC-legacy-concepts.md#item-encryptor).

**Entrée ** (depuis l'application)
+ L'identifiant clé d'un AWS KMS key. 

**Entrée** (depuis le chiffreur d'élément)
+ [Contexte de chiffrement DynamoDB](concepts.md#encryption-context)

**Sortie** (vers le chiffreur d'élément)
+ Clé de chiffrement (texte brut)
+ Clé de signature
+ Dans [Description du matériau réel](DDBEC-legacy-concepts.md#legacy-material-description) : ces valeurs sont enregistrées dans l'attribut de description du matériau que le client ajoute à l'élément.
  + amzn-ddb-env-key: clé de données codée en Base64 cryptée par le AWS KMS key
  + amzn-ddb-env-alg: algorithme de chiffrement, par défaut [AES/256](https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/archived-crypto-projects/aes-development)
  + amzn-ddb-sig-alg: algorithme de signature, par défaut, [Hmac /256 SHA256](https://en.wikipedia.org/wiki/HMAC)
  + amzn-ddb-wrap-alg: km

**Traitement**

1. Le fournisseur Direct KMS envoie AWS KMS une demande d'utilisation de la clé spécifiée AWS KMS key pour [générer une clé de données unique](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) pour l'article. L'opération retourne une clé en texte brut et une copie chiffrée sous la AWS KMS key. Ce matériau est appelé *matériau de clé initial*.

   La demande inclut les valeurs suivantes en texte brut dans le [contexte de chiffrement AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context). Ces valeurs non secrètes sont liées en termes de chiffrement à l'objet chiffré, si bien que le même contexte de chiffrement est requis au déchiffrement. Vous pouvez utiliser ces valeurs pour identifier l'appel AWS KMS dans les [AWS CloudTrail journaux](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-overview.html).
   + amzn-ddb-env-alg — Algorithme de chiffrement, par défaut AES/256
   + amzn-ddb-sig-alg — Algorithme de signature, par défaut Hmac /256 SHA256
   + (Facultatif) aws-kms-table — *table name*
   + (Facultatif) *partition key name* — *partition key value* (les valeurs binaires sont codées en Base64)
   + (Facultatif) *sort key name* — *sort key value* (les valeurs binaires sont codées en Base64)

   Le fournisseur Direct KMS obtient les valeurs du contexte de AWS KMS chiffrement à partir du contexte de chiffrement [DynamoDB de l'élément](concepts.md#encryption-context). Si le contexte de chiffrement DynamoDB n'inclut aucune valeur, telle que le nom de la table, cette paire nom-valeur est omise du contexte de chiffrement. AWS KMS 

1. Le fournisseur KMS direct dérive une clé de chiffrement symétrique et une clé de signature à partir de la clé de données. Par défaut, il utilise l'[algorithme de hachage sécurisé (SHA) 256](https://en.wikipedia.org/wiki/SHA-2) et la [fonction de dérivation de clé RFC5869 basée sur HMAC pour dériver une clé](https://tools.ietf.org/html/rfc5869) de chiffrement symétrique AES 256 bits et une clé de signature HMAC-SHA-256 bits. 

1. Le fournisseur KMS direct retourne la sortie du chiffreur d'élément.

1. Le chiffreur d'élément utilise la clé de chiffrement pour chiffrer les attributs spécifiés et la clé de signature pour les signer, à l'aide des algorithmes spécifiés dans la description du matériau réel. Il supprime les clés en texte brut de la mémoire dès que possible.

### Obtention des matériaux de déchiffrement
<a name="direct-kms-get-decryption-materials"></a>

Cette section décrit en détail les entrées, les sorties et le traitement du fournisseur KMS direct quand il reçoit une demande de déchiffrement de matériaux de la part du [chiffreur d'élément](DDBEC-legacy-concepts.md#item-encryptor).

**Entrée ** (depuis l'application)
+ L'identifiant clé d'un AWS KMS key. 

  La valeur de l'ID de clé peut être l'ID de clé, l'ARN de clé, le nom d'alias ou l'ARN d'alias du AWS KMS key. Toutes les valeurs qui ne sont pas incluses dans l'ID de clé, telles que la région, doivent être disponibles dans le [profil AWS nommé](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles). La clé ARN fournit toutes les valeurs AWS KMS nécessaires.

**Entrée** (depuis le chiffreur d'élément)
+ Copie du contexte de [chiffrement DynamoDB](concepts.md#encryption-context) qui contient le contenu de l'attribut de description du matériau.

**Sortie** (vers le chiffreur d'élément)
+ Clé de chiffrement (texte brut)
+ Clé de signature

**Traitement**

1. Le fournisseur Direct KMS obtient la clé de données chiffrée à partir de l'attribut de description du matériau contenu dans l'élément chiffré. 

1. Il demande AWS KMS d'utiliser le paramètre spécifié AWS KMS key pour [déchiffrer](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) la clé de données cryptée. L'opération retourne une clé en texte brut.

   Cette demande doit utiliser le même [contexte de chiffrement AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) que celui utilisé pour générer et chiffrer la clé de données.
   + aws-kms-table – *table name*
   + *partition key name*— *partition key value* (les valeurs binaires sont codées en Base64)
   + (Facultatif) *sort key name* — *sort key value* (les valeurs binaires sont codées en Base64)
   + amzn-ddb-env-alg — Algorithme de chiffrement, par défaut AES/256
   + amzn-ddb-sig-alg — Algorithme de signature, par défaut Hmac /256 SHA256

1. Le fournisseur Direct KMS utilise l'[algorithme de hachage sécurisé (SHA) 256](https://en.wikipedia.org/wiki/SHA-2) et une [fonction de dérivation de clé RFC5869 basée sur HMAC pour dériver une clé](https://tools.ietf.org/html/rfc5869) de chiffrement symétrique AES 256 bits et une clé de signature HMAC-SHA-256 bits à partir de la clé de données. 

1. Le fournisseur KMS direct retourne la sortie du chiffreur d'élément.

1. Le chiffreur d'élément utilise la clé de signature pour vérifier l'élément. S'il réussit, il utilise la clé de chiffrement symétrique pour déchiffrer les valeurs d'attribut chiffrées. Ces opérations utilisent les algorithmes de chiffrement et de signature spécifiés dans la description du matériau réel. Le chiffreur d'élément supprime les clés en texte brut de la mémoire dès que possible.

# Fournisseur de matériaux encapsulé
<a name="wrapped-provider"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Le *Wrapped Materials Provider* (Wrapped CMP) vous permet d'utiliser des clés d'encapsulation et de signature provenant de n'importe quelle source avec le client de chiffrement DynamoDB. Le CMP Wrapped ne dépend d'aucun AWS service. Cependant, vous devez générer et gérer vos clés d'encapsulation et de signature en dehors du client, y compris la fourniture des clés appropriées pour vérifier et déchiffrer l'élément. 

Le fournisseur CMP encapsulé génère une clé de chiffrement d'élément unique pour chaque élément. Il encapsule la clé de chiffrement d'élément avec la clé d'encapsulation que vous fournissez et enregistre la clé de chiffrement d'élément encapsulée dans l'[attribut de description de matériau](DDBEC-legacy-concepts.md#legacy-material-description) de l'élément. Comme vous fournissez les clés d'encapsulation et de signature, vous déterminez de quelle façon les clés d'encapsulation et de signature sont générées, et si elles sont propres à chaque élément ou sont réutilisées. 

Le fournisseur CMP encapsulé constitue une implémentation sécurisée et un bon choix pour les applications qui peuvent gérer les matériaux de chiffrement.

Le Wrapped CMP est l'un des nombreux [fournisseurs de matériel cryptographique](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) pris en charge par le client de chiffrement DynamoDB. Pour plus d'informations sur l'autre CMPs, voir[Fournisseur de matériel cryptographique](crypto-materials-providers.md).

**Pour obtenir un exemple de code, consultez :**
+ Java: [AsymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java)
+ Python : [wrapped-rsa-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_rsa_encrypted_table.py), [wrapped-symmetric-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_symmetric_encrypted_table.py)

**Topics**
+ [Comment l'utiliser](#wrapped-cmp-how-to-use)
+ [Comment ça marche](#wrapped-cmp-how-it-works)

## Comment l'utiliser
<a name="wrapped-cmp-how-to-use"></a>

Pour créer un fournisseur CMP encapsulé, spécifiez une clé d'encapsulation (requise au chiffrement), une clé de désencapsulation (requise au déchiffrement) et une clé de signature. Vous devez fournir les clés lorsque vous chiffrez et déchiffrez les éléments.

Les clés d'encapsulation, de désencapsulation et de signature peuvent être des clés symétriques ou des paires de clés asymétriques. 

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

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

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

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

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

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

------

## Comment ça marche
<a name="wrapped-cmp-how-it-works"></a>

Le fournisseur CMP encapsulé génère une nouvelle clé de chiffrement d'élément pour chaque élément. Il utilise les clés d'encapsulation, de désencapsulation et de signature que vous fournissez, comme illustré dans le schéma suivant.

![\[Entrée, traitement et sortie du fournisseur de matériaux encapsulés dans le client de chiffrement DynamoDB\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/wrappedCMP.png)


### Obtention des matériaux de chiffrement
<a name="wrapped-cmp-get-encryption-materials"></a>

Cette section décrit en détail les entrées, les sorties et le traitement du fournisseur CMP encapsulé quand il reçoit une demande de matériaux de chiffrement. 

**Entrée** (depuis l'application)
+ Clé d'encapsulation : clé symétrique [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) ou clé publique [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)). Obligatoire si les valeurs d'attribut sont chiffrées. Sinon, elle est facultative et ignorée.
+ Clé de désencapsulation : facultative et ignorée. 
+ Clé de signature

**Entrée** (depuis le chiffreur d'élément)
+ [Contexte de chiffrement DynamoDB](concepts.md#encryption-context)

**Sortie** (vers le chiffreur d'élément) :
+ Clé de chiffrement d'élément en texte brut
+ Clé de signature (inchangée)
+ [Description du matériau réel](DDBEC-legacy-concepts.md#legacy-material-description) : ces valeurs sont enregistrées dans l'[attribut de description du matériau](DDBEC-legacy-concepts.md#legacy-material-description) que le client ajoute à l'élément. 
  + `amzn-ddb-env-key` : clé de chiffrement d'élément codée en base64
  + `amzn-ddb-env-alg` : algorithme de chiffrement utilisé pour chiffrer l'élément. La valeur par défaut est AES-256-CBC.
  + `amzn-ddb-wrap-alg` : algorithme d'encapsulation utilisé par le fournisseur CMP encapsulé pour encapsuler la clé de chiffrement d'élément. Si la clé d'encapsulation est une clé AES, la clé est encapsulée à l'aide de `AES-Keywrap` non complétée, comme défini dans [RFC 3394](https://tools.ietf.org/html/rfc3394.html). Si la clé d'encapsulation est une clé RSA, elle est chiffrée à l'aide de RSA OAEP avec rembourrage. MGF1 

**Traitement**

Lorsque vous chiffrez un élément, vous transmettez une clé d'encapsulation et une clé de signature. Une clé de désencapsulation est facultative et ignorée.

1. Le fournisseur CMP encapsulé génère une clé de chiffrement d'élément symétrique unique pour l'élément de table.

1. Il utilise la clé d'encapsulation que vous spécifiez pour encapsuler la clé de chiffrement d'élément. Puis, il la supprime de la mémoire dès que possible.

1. Il retourne la clé de chiffrement d'élément en texte brut, la clé de signature que vous avez fournie et une [description de matériau réel](DDBEC-legacy-concepts.md#legacy-material-description) qui inclut la clé de chiffrement d'élément encapsulé, ainsi que les algorithmes de chiffrement et d'encapsulation.

1. Le chiffreur d'élément utilise la clé de chiffrement en texte brut pour chiffrer l'élément. Il utilise la clé de signature que vous avez fournie pour signer l'élément. Puis, il supprime les clés en texte brut de la mémoire dès que possible. Il copie les champs de la description du matériel réel, y compris la clé de chiffrement encapsulée (`amzn-ddb-env-key`), dans l'attribut de la description de matériau de l'élément.

### Obtention des matériaux de déchiffrement
<a name="wrapped-cmp-get-decryption-materials"></a>

Cette section décrit en détail les entrées, les sorties et le traitement du fournisseur CMP encapsulé quand il reçoit une demande de matériaux de déchiffrement. 

**Entrée** (depuis l'application)
+ Clé d'encapsulation : facultative et ignorée.
+ Clé de désencapsulation : la même clé symétrique [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) ou la même clé privée [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) qui correspond à la clé publique RSA utilisée pour chiffrer. Obligatoire si les valeurs d'attribut sont chiffrées. Sinon, elle est facultative et ignorée.
+ Clé de signature

**Entrée** (depuis le chiffreur d'élément)
+ Copie du contexte de [chiffrement DynamoDB](concepts.md#encryption-context) qui contient le contenu de l'attribut de description du matériau.

**Sortie** (vers le chiffreur d'élément)
+ Clé de chiffrement d'élément en texte brut
+ Clé de signature (inchangée)

**Traitement**

Lorsque vous déchiffrez un élément, vous transmettez une clé de désencapsulation et une clé de signature. Une clé d'encapsulation est facultative et ignorée.

1. Le fournisseur CMP encapsulé obtient la clé de chiffrement d'élément encapsulé depuis l'attribut de description du matériau de l'élément.

1. Il utilise la clé et l'algorithme de désencapsulation pour désencapsuler la clé de chiffrement d'élément. 

1. Il retourne la clé de chiffrement de l'élément en texte brut, la clé de signature, et les algorithmes de chiffrement et de signature au chiffreur d'élément.

1. Le chiffreur d'élément utilise la clé de signature pour vérifier l'élément. S'il réussit, il utilise la clé de chiffrement d'élément pour déchiffrer l'élément. Puis, il supprime les clés en texte brut de la mémoire dès que possible.

# À propos du fournisseur le plus récent
<a name="most-recent-provider"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Le *fournisseur le plus récent* est un [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) conçu pour travailler avec un [magasin de fournisseur](DDBEC-legacy-concepts.md#provider-store). Il CMPs provient du magasin du fournisseur et obtient le matériel cryptographique qu'il renvoie depuis le CMPs. Il utilise généralement chaque CMP pour répondre à plusieurs demandes de matériaux de chiffrement. Cependant, vous pouvez utiliser les fonctions de son magasin de fournisseur pour contrôler jusqu'à quelle mesure les matériaux sont réutilisés, déterminer la fréquence de rotation de son fournisseur CMP et, même, modifier le type de fournisseur CMP utilisé sans modifier le fournisseur le plus récent.

**Note**  
Le code associé au `MostRecentProvider` symbole du fournisseur le plus récent peut stocker du matériel cryptographique en mémoire pendant toute la durée de vie du processus. Cela peut permettre à un appelant d'utiliser des clés qu'il n'est plus autorisé à utiliser.   
Le `MostRecentProvider` symbole est obsolète dans les anciennes versions prises en charge du client de chiffrement DynamoDB et supprimé de la version 2.0.0. Il est remplacé par le `CachingMostRecentProvider` symbole. Pour en savoir plus, consultez [Mises à jour du fournisseur le plus récent](#mrp-versions).

Le fournisseur le plus récent constitue un bon choix pour les applications qui doivent minimiser les appels au magasin de fournisseur et à sa source de chiffrement, et pour les applications qui peuvent réutiliser certains matériaux de chiffrement sans enfreindre leurs exigences de sécurité. Par exemple, il vous permet de protéger votre matériel cryptographique sous un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) sans appeler AWS KMS chaque fois que vous cryptez ou décryptez un élément.

Le magasin de fournisseurs que vous choisissez détermine le type de magasin utilisé par le fournisseur le plus récent et la fréquence à CMPs laquelle il reçoit un nouveau CMP. Vous pouvez utiliser tout magasin de fournisseur compatible avec le fournisseur le plus récent, y compris les magasins de fournisseur personnalisés que vous concevez. 

Le client de chiffrement DynamoDB inclut *MetaStore*un qui crée et [renvoie des fournisseurs de matériaux encapsulés (encapsulés](wrapped-provider.md)). CMPs Il MetaStore enregistre plusieurs versions du Wrapped CMPs qu'il génère dans une table DynamoDB interne et les protège par un chiffrement côté client par une instance interne du client de chiffrement DynamoDB. 

Vous pouvez configurer le MetaStore pour utiliser n'importe quel type de CMP interne pour protéger le contenu du tableau, y compris un [fournisseur KMS direct](direct-kms-provider.md) qui génère du matériel cryptographique protégé par vos soins AWS KMS key, un CMP encapsulé qui utilise les clés d'encapsulage et de signature que vous fournissez, ou un CMP personnalisé compatible que vous concevez.

**Pour obtenir un exemple de code, consultez :**
+ Java: [MostRecentEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java)
+ Python : [most\$1recent\$1provider\$1encrypted\$1table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/most_recent_provider_encrypted_table.py)

**Topics**
+ [Comment l'utiliser](#mrp-how-to-use-it)
+ [Comment ça marche](#mrp-how-it-works)
+ [Mises à jour du fournisseur le plus récent](#mrp-versions)

## Comment l'utiliser
<a name="mrp-how-to-use-it"></a>

Pour créer un fournisseur le plus récent, vous devez créer et configurer un magasin de fournisseur, puis créer un fournisseur le plus récent qui utilise le magasin de fournisseur. 

[Les exemples suivants montrent comment créer un fournisseur le plus récent qui utilise un MetaStore et protège les versions de sa table DynamoDB interne avec du matériel cryptographique provenant d'un fournisseur KMS direct.](direct-kms-provider.md) Ces exemples utilisent le [`CachingMostRecentProvider`](#mrp-versions)symbole. 

Chaque fournisseur le plus récent possède un nom qui l'identifie CMPs dans le MetaStore tableau, un paramètre [time-to-live](#most-recent-provider-ttl)(TTL) et un paramètre de taille de cache qui détermine le nombre d'entrées que le cache peut contenir. Ces exemples définissent la taille du cache à 1 000 entrées et à un TTL de 60 secondes.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

------

## Comment ça marche
<a name="mrp-how-it-works"></a>

Le fournisseur le plus récent CMPs provient d'un magasin de fournisseurs. Puis, il utilise le fournisseur CMP pour générer les matériaux de chiffrement qu'il retourne au chiffreur d'élément.

### À propos du fournisseur le plus récent
<a name="about-mrp"></a>

Le fournisseur le plus récent obtient un [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) à partir d'un [magasin de fournisseur](DDBEC-legacy-concepts.md#provider-store). Puis, il utilise le fournisseur CMP pour générer les matériaux de chiffrement qu'il retourne. Chaque fournisseur le plus récent est associé à une boutique de fournisseurs, mais une boutique de fournisseurs peut CMPs approvisionner plusieurs fournisseurs sur plusieurs hôtes.

Le fournisseur le plus récent peut travailler avec n'importe quel fournisseur CMP compatible d'un magasin de fournisseur. Il demande du matériel de chiffrement ou de déchiffrement au CMP et renvoie le résultat au chiffreur d'articles. Il n'effectue pas d'opération de chiffrement.

Pour demander un fournisseur CMP auprès de son magasin de fournisseur, le fournisseur le plus récent fournit son nom de matériau et la version d'un fournisseur CMP existant qu'il veut utiliser. Pour les matériaux de chiffrement, le fournisseur le plus récent demande toujours la version maximale (la « plus récente »). Pour les matériaux de chiffrement, il demande la version du fournisseur CMP qui a été utilisée pour créer les matériaux de chiffrement, comme illustré dans le diagramme suivant.

![\[Fournisseur le plus récent\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/most-recent-provider-1.png)


Le fournisseur le plus récent enregistre les versions CMPs renvoyées par le magasin du fournisseur dans un cache local le moins récemment utilisé (LRU) en mémoire. Le cache permet au fournisseur le plus récent d'obtenir CMPs ce dont il a besoin sans avoir à appeler le magasin du fournisseur pour chaque élément. Vous pouvez effacer le cache à la demande.

Le fournisseur le plus récent utilise une [time-to-livevaleur](#most-recent-provider-ttl) configurable que vous pouvez ajuster en fonction des caractéristiques de votre application.

### À propos de MetaStore
<a name="about-metastore"></a>

Vous pouvez utiliser un fournisseur le plus récent avec n'importe quel magasin de fournisseur, y compris un magasin de fournisseur personnalisé compatible. Le client de chiffrement DynamoDB inclut MetaStore une implémentation sécurisée que vous pouvez configurer et personnaliser.

A *MetaStore*est un [magasin fournisseur](DDBEC-legacy-concepts.md#provider-store) qui crée et renvoie des [Wrapped CMPs](wrapped-provider.md) configurés avec la clé d'encapsulation, la clé de déballage et la clé de signature requises par Wrapped CMPs . A MetaStore est une option sécurisée pour le fournisseur le plus récent, car Wrapped génère CMPs toujours des clés de chiffrement uniques pour chaque article. Seule la clé d'encapsulation qui protège la clé de chiffrement d'élément et la clé de signature sont réutilisées.

Le schéma suivant montre les composants du fournisseur le plus récent MetaStore et la manière dont il interagit avec celui-ci.

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


Il MetaStore génère le Wrapped CMPs, puis le stocke (sous forme cryptée) dans une table DynamoDB interne. La clé de partition est le nom du matériel du fournisseur le plus récent ; la clé de tri son numéro de version. Les éléments de la table sont protégés par un client de chiffrement DynamoDB interne, comprenant un crypteur d'éléments et un fournisseur [interne de matériel cryptographique](DDBEC-legacy-concepts.md#concept-material-provider) (CMP).

Vous pouvez utiliser n'importe quel type de CMP interne MetaStore, y compris un [fournisseur KMS direct](wrapped-provider.md), un CMP encapsulé avec du matériel cryptographique que vous fournissez ou un CMP personnalisé compatible. Si le CMP interne de votre ordinateur MetaStore est un fournisseur KMS direct, vos clés d'emballage et de signature réutilisables sont protégées par un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS). Les MetaStore appels AWS KMS chaque fois qu'il ajoute une nouvelle version CMP à sa table interne ou qu'il obtient une version CMP à partir de sa table interne.

### Définition d'une time-to-live valeur
<a name="most-recent-provider-ttl"></a>

Vous pouvez définir une valeur time-to-live (TTL) pour chaque fournisseur le plus récent que vous créez. En général, utilisez la valeur TTL la plus basse adaptée à votre application.

L'utilisation de la valeur TTL est modifiée dans le `CachingMostRecentProvider` symbole du fournisseur le plus récent. 

**Note**  
Le `MostRecentProvider` symbole du fournisseur le plus récent est obsolète dans les anciennes versions prises en charge du client de chiffrement DynamoDB et supprimé de la version 2.0.0. Il est remplacé par le `CachingMostRecentProvider` symbole. Nous vous recommandons de mettre à jour votre code dès que possible. Pour en savoir plus, consultez [Mises à jour du fournisseur le plus récent](#mrp-versions).

**`CachingMostRecentProvider`**  
`CachingMostRecentProvider`Utilise la valeur TTL de deux manières différentes.   
+ Le TTL détermine la fréquence à laquelle le fournisseur le plus récent vérifie la présence d'une nouvelle version du CMP dans le magasin du fournisseur. Si une nouvelle version est disponible, le fournisseur le plus récent remplace son CMP et actualise son matériel cryptographique. Dans le cas contraire, il continue d'utiliser son CMP et son matériel cryptographique actuels.
+ Le TTL détermine la durée pendant CMPs laquelle le cache peut être utilisé. Avant d'utiliser un CMP mis en cache pour le chiffrement, le fournisseur le plus récent évalue le temps passé dans le cache. Si le temps de cache du CMP dépasse le TTL, le CMP est expulsé du cache et le fournisseur le plus récent obtient une nouvelle version de CMP dans le magasin de son fournisseur.

**`MostRecentProvider`**  
Dans le`MostRecentProvider`, le TTL détermine la fréquence à laquelle le fournisseur le plus récent vérifie la présence d'une nouvelle version du CMP dans le magasin du fournisseur. Si une nouvelle version est disponible, le fournisseur le plus récent remplace son CMP et actualise son matériel cryptographique. Dans le cas contraire, il continue d'utiliser son CMP et son matériel cryptographique actuels.

Le TTL ne détermine pas la fréquence à laquelle une nouvelle version du CMP est créée. Vous créez de nouvelles versions CMP en faisant [pivoter les matériaux cryptographiques](#most-recent-provider-rotate).

La valeur TTL idéale varie en fonction de l'application et de ses objectifs de latence et de disponibilité. Un TTL inférieur améliore votre profil de sécurité en réduisant le temps pendant lequel les documents cryptographiques sont stockés en mémoire. En outre, un TTL inférieur actualise les informations critiques plus fréquemment. Par exemple, si votre CMP interne est un [fournisseur KMS direct](direct-kms-provider.md), il vérifie plus fréquemment que l'appelant est toujours autorisé à utiliser un. AWS KMS key

Toutefois, si le TTL est trop bref, les appels fréquents vers le magasin du fournisseur peuvent augmenter vos coûts et obliger ce dernier à limiter les demandes provenant de votre application et d'autres applications partageant votre compte de service. Il peut également être avantageux de coordonner le TTL avec la vitesse à laquelle vous faites pivoter les documents cryptographiques. 

Pendant les tests, modifiez le TTL et la taille du cache en fonction des différentes charges de travail jusqu'à ce que vous trouviez une configuration adaptée à votre application et à vos normes de sécurité et de performance.

### Rotation des matériaux de chiffrement
<a name="most-recent-provider-rotate"></a>

Lorsqu'un fournisseur le plus récent a besoin de matériel de chiffrement, il utilise toujours la version la plus récente de son CMP dont il a connaissance. La fréquence à laquelle il vérifie la présence d'une version plus récente est déterminée par la valeur [time-to-live](#most-recent-provider-ttl)(TTL) que vous définissez lorsque vous configurez le fournisseur le plus récent. 

Lorsque le TTL expire, le fournisseur le plus récent vérifie la version la plus récente du CMP dans le magasin du fournisseur. Si un CMP est disponible, le fournisseur le plus récent l'obtient et remplace le CMP dans son cache. Il utilise ce CMP et son matériel cryptographique jusqu'à ce qu'il découvre que le magasin du fournisseur dispose d'une version plus récente.

Pour demander au magasin de fournisseur de créer une version d'un CMP pour un fournisseur le plus récent, appelez l'opération Create New Provider du magasin de fournisseur avec le nom de matériau du fournisseur le plus récent. Le magasin de fournisseur crée un CMP et enregistre une copie chiffrée dans son stockage interne avec un numéro de version supérieur. (Il retourne aussi un CMP, mais vous pouvez l'ignorer.) Par conséquent, la prochaine fois que le fournisseur le plus récent demandera au magasin du fournisseur le numéro de version maximal de celui-ci CMPs, il obtiendra le nouveau numéro de version supérieur et l'utilisera dans les demandes ultérieures adressées au magasin pour voir si une nouvelle version du CMP a été créée.

Vous pouvez planifier vos appels Create New Provider en fonction de l'heure, du nombre d'éléments ou d'attributs traités, ou de toute autre métrique qui revêt un sens pour votre application.

### Obtention des matériaux de chiffrement
<a name="most-recent-provider-encrypt"></a>

Le fournisseur le plus récent utilise le processus suivant, illustré dans le diagramme, pour obtenir les matériaux de chiffrement qu'il retourne au chiffreur d'élément. La sortie dépend du type de fournisseur CMP que le magasin de fournisseur retourne. Le fournisseur le plus récent peut utiliser n'importe quel magasin de fournisseurs compatible, y compris MetaStore celui inclus dans le client de chiffrement DynamoDB.

![\[Entrée, traitement et sortie du fournisseur le plus récent dans le client de chiffrement DynamoDB\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/most-recent-provider-provider-store.png)


Lorsque vous créez un fournisseur le plus récent à l'aide du [`CachingMostRecentProvider`symbole](#mrp-versions), vous spécifiez un magasin de fournisseurs, le nom du fournisseur le plus récent et une valeur [time-to-live](#most-recent-provider-ttl)(TTL). Vous pouvez également éventuellement spécifier une taille de cache, qui détermine le nombre maximal de documents cryptographiques pouvant exister dans le cache.

Quand le chiffreur d'élément demande au fournisseur le plus récent les matériaux de chiffrement, le fournisseur le plus récent commence par chercher dans le cache le dernier numéro de version de ses fournisseurs CMP.
+ S'il trouve la dernière version du CMP dans son cache et que le CMP n'a pas dépassé la valeur TTL, le fournisseur le plus récent utilise le CMP pour générer du matériel de chiffrement. Puis, il retourne les matériaux de chiffrement au chiffreur d'élément. Cette opération ne requiert pas d'appel au magasin de fournisseur.
+ Si la dernière version du CMP n'est pas dans son cache, ou si elle est dans le cache mais a dépassé sa valeur TTL, le fournisseur le plus récent demande un CMP à son magasin de fournisseurs. La demande inclut le nom de matériau du fournisseur le plus récent et le numéro de version maximal qu'il connaît.

  1. Le magasin de fournisseur retourne un fournisseur CMP à partir de son stockage permanent. Si le magasin du fournisseur est un MetaStore, il obtient un CMP encapsulé chiffré à partir de sa table DynamoDB interne en utilisant le nom du matériau du fournisseur le plus récent comme clé de partition et le numéro de version comme clé de tri. Il MetaStore utilise son crypteur d'éléments interne et son CMP interne pour déchiffrer le CMP encapsulé. Ensuite, il retourne le fournisseur CMP en texte brut au fournisseur le plus récent. Si le CMP interne est un [fournisseur KMS direct](direct-kms-provider.md), cette étape inclut un appel de [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

  1. Le fournisseur CMP ajoute le champ `amzn-ddb-meta-id` à la [description du matériau réel](DDBEC-legacy-concepts.md#legacy-material-description). Sa valeur est le nom de matériau et la version du CMP dans sa table interne. Le magasin de fournisseur retourne le fournisseur CMP au fournisseur le plus récent.

  1. Le fournisseur le plus récent met en cache mémoire le fournisseur CMP.

  1. Le fournisseur le plus récent utilise le fournisseur CMP pour générer les matériaux de chiffrement. Puis, il retourne les matériaux de chiffrement au chiffreur d'élément.

### Obtention des matériaux de déchiffrement
<a name="most-recent-provider-decrypt"></a>

Quand le chiffreur d'élément demande au fournisseur le plus récent les matériaux de chiffrement, le fournisseur le plus récent utilise le processus suivant pour les obtenir et les retourner.

1. Le fournisseur le plus récent demande au magasin de fournisseur le numéro de version des matériaux de chiffrement utilisés pour chiffrer l'élément. Il transmet la description du matériau réel depuis l'[attribut de description du matériau](DDBEC-legacy-concepts.md#legacy-material-description) de l'élément.

1. Le magasin de fournisseur obtient le numéro de version du CMP en charge du chiffrement auprès du champ `amzn-ddb-meta-id` de la description du matériau réel et le retourne au fournisseur le plus récent.

1. Le fournisseur le plus récent recherche dans son cache le numéro de version du CMP utilisé pour chiffrer et signer l'élément.
+ S'il trouve que la version correspondante du CMP se trouve dans son cache et que le CMP n'a pas dépassé la [valeur time-to-live (TTL)](#most-recent-provider-ttl), le fournisseur le plus récent utilise le CMP pour générer du matériel de déchiffrement. Puis, il retourne les matériaux de déchiffrement au chiffreur d'élément. Cette opération ne requiert pas d'appel au magasin de fournisseur ou à un autre fournisseur CMP.
+ Si la version correspondante du CMP ne se trouve pas dans son cache, ou si le cache AWS KMS key a dépassé sa valeur TTL, le fournisseur le plus récent demande un CMP à son magasin de fournisseurs. Il envoie le nom de matériau et le numéro de version du CMP de chiffrement dans la demande.

  1. Le magasin de fournisseur recherche dans le stockage permanent le fournisseur CMP en utilisant le nom du fournisseur le plus récent comme clé de partition et le numéro de version comme clé de tri.
     + Si le nom et le numéro de version ne sont pas dans le stockage permanent, le magasin de fournisseur lève une exception. Si le magasin de fournisseur a été utilisé pour générer le CMP, celui-ci doit être stocké dans son stockage permanent, à moins qu'il ne soit intentionnellement supprimé.
     + Si le CMP avec le nom et le numéro de version correspondants se trouve dans le stockage permanent du magasin de fournisseur, celui-ci retourne le CMP spécifié au fournisseur le plus récent. 

       Si le magasin du fournisseur est un MetaStore, il obtient le CMP chiffré à partir de sa table DynamoDB. Puis, il utilise les matériaux de chiffrement de son fournisseur CMP interne pour déchiffrer le CMP chiffré avant de retourner le fournisseur CMP au fournisseur le plus récent. Si le CMP interne est un [fournisseur KMS direct](direct-kms-provider.md), cette étape inclut un appel de [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

  1. Le fournisseur le plus récent met en cache mémoire le fournisseur CMP.

  1. Le fournisseur le plus récent utilise le fournisseur CMP pour générer les matériaux de déchiffrement. Puis, il retourne les matériaux de déchiffrement au chiffreur d'élément.

## Mises à jour du fournisseur le plus récent
<a name="mrp-versions"></a>

Le symbole du fournisseur le plus récent est remplacé par `MostRecentProvider``CachingMostRecentProvider`. 

**Note**  
Le `MostRecentProvider` symbole, qui représente le fournisseur le plus récent, est obsolète dans la version 1.15 du client de chiffrement DynamoDB pour Java et dans la version 1.3 du client de chiffrement DynamoDB pour Python et supprimé des versions 2.0.0 du client de chiffrement DynamoDB dans les deux implémentations linguistiques. Utilisez plutôt le`CachingMostRecentProvider`.

`CachingMostRecentProvider`implémente les modifications suivantes :
+ Supprime `CachingMostRecentProvider` périodiquement les documents cryptographiques de la mémoire lorsque leur durée en mémoire dépasse la valeur configurée [time-to-live (TTL).](#most-recent-provider-ttl) 

  Ils `MostRecentProvider` peuvent stocker du matériel cryptographique en mémoire pendant toute la durée de vie du processus. Par conséquent, le fournisseur le plus récent n'est peut-être pas au courant des modifications d'autorisation. Il peut utiliser des clés de chiffrement une fois que les autorisations de l'appelant à les utiliser ont été révoquées. 

  Si vous ne pouvez pas effectuer la mise à jour vers cette nouvelle version, vous pouvez obtenir un effet similaire en appelant régulièrement la `clear()` méthode dans le cache. Cette méthode vide manuellement le contenu du cache et oblige le fournisseur le plus récent à demander un nouveau CMP et de nouveaux matériaux cryptographiques. 
+ `CachingMostRecentProvider`Il inclut également un paramètre de taille de cache qui vous permet de mieux contrôler le cache.

Pour effectuer la mise à jour vers le`CachingMostRecentProvider`, vous devez modifier le nom du symbole dans votre code. À tous les autres égards, le `CachingMostRecentProvider` est entièrement rétrocompatible avec le`MostRecentProvider`. Il n'est pas nécessaire de chiffrer à nouveau les éléments du tableau.

Cependant, cela `CachingMostRecentProvider` génère davantage d'appels vers l'infrastructure clé sous-jacente. Il appelle le magasin du fournisseur au moins une fois par intervalle time-to-live (TTL). Les applications avec de nombreuses applications actives CMPs (en raison de rotations fréquentes) ou les applications avec de grands flottes sont les plus susceptibles d'être sensibles à ce changement. 

Avant de publier votre code mis à jour, testez-le minutieusement pour vous assurer que les appels les plus fréquents n'altèrent pas votre application ou n'entraînent pas de ralentissement de la part des services dont dépend votre fournisseur, tels que AWS Key Management Service (AWS KMS) ou Amazon DynamoDB. Pour atténuer les problèmes de performances, ajustez la taille du cache et celle time-to-live du en `CachingMostRecentProvider` fonction des caractéristiques de performance que vous observez. Pour de plus amples informations, consultez [Définition d'une time-to-live valeur](#most-recent-provider-ttl).

# Fournisseur de matériaux statique
<a name="static-provider"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Le *fournisseur de matériaux statiques* (Static CMP) est un [fournisseur de matériaux cryptographiques](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) très simple destiné aux tests, aux proof-of-concept démonstrations et à la compatibilité existante.

Pour utiliser le fournisseur CMP statique afin de chiffrer un élément de table, vous fournissez une clé de chiffrement symétrique [AES (Advanced Encryption Standard)](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) et une clé ou paire de clés de signature. Vous devez fournir les mêmes clés pour déchiffrer l'élément chiffré. Le fournisseur CMP statique n'assure aucune opération de chiffrement. Au lieu de cela, il transmet inchangées les clés de chiffrement que vous fournissez au chiffreur d'élément. Le chiffreur d'élément chiffre les éléments directement sous la clé de chiffrement. Puis, il utilise directement la clé de signature pour les signer. 

Comme le fournisseur CMP statique ne génère pas de matériau de chiffrement unique, tous les éléments de table que vous traitez sont chiffrés avec la même clé de chiffrement et signés par la même clé de signature. Lorsque vous utilisez la même clé pour chiffrer les valeurs d'attribut de nombreux éléments, ou que vous utilisez la même clé ou paire de clés pour signer tous les éléments, vous risquez de dépasser les limites de chiffrement des clés. 

**Note**  
Le [fournisseur statique asymétrique](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html) de la bibliothèque Java n'est pas un fournisseur statique. Il fournit juste d'autres constructeurs au [fournisseur CMP encapsulé](wrapped-provider.md). Il est sûr pour une utilisation en production, mais vous devez utiliser directement le CMP encapsulé chaque fois que possible.

Le CMP statique est l'un des nombreux [fournisseurs de matériel cryptographique](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) pris en charge par le client de chiffrement DynamoDB. Pour plus d'informations sur l'autre CMPs, voir[Fournisseur de matériel cryptographique](crypto-materials-providers.md).

**Pour obtenir un exemple de code, consultez :**
+ Java: [SymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java)

**Topics**
+ [Comment l'utiliser](#static-cmp-how-to-use)
+ [Comment ça marche](#static-cmp-how-it-works)

## Comment l'utiliser
<a name="static-cmp-how-to-use"></a>

Pour créer un fournisseur statique, fournissez une clé ou paire de clés de chiffrement, et une clé ou paire de clés de signature. Vous devez fournir le matériau de clé pour chiffrer et déchiffrer les éléments de table.

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

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

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

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

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

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

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

------

## Comment ça marche
<a name="static-cmp-how-it-works"></a>

Le fournisseur statique transmet les clés de chiffrement et de signature que vous fournissez au chiffreur d'élément, où elles sont utilisées directement pour chiffrer et signer vos éléments de table. À moins que vous ne fournissiez différentes clés pour chaque élément, les mêmes clés sont utilisées pour chaque élément.

![\[Entrée, traitement et sortie du fournisseur de matériaux statiques dans le client de chiffrement DynamoDB\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/staticCMP.png)


### Obtention des matériaux de chiffrement
<a name="static-cmp-get-encryption-materials"></a>

Cette section décrit en détail les entrées, les sorties et le traitement du fournisseur CMP statique quand il reçoit une demande de matériaux de chiffrement.

**Entrée** (depuis l'application)
+ Une clé de chiffrement — Il doit s'agir d'une clé symétrique, telle qu'une clé AES ([Advanced Encryption Standard](https://tools.ietf.org/html/rfc3394.html)). 
+ Une clé de signature : il peut s'agir d'une clé symétrique ou d'une paire de clés asymétrique. 

**Entrée** (depuis le chiffreur d'élément)
+ [Contexte de chiffrement DynamoDB](concepts.md#encryption-context)

**Sortie** (vers le chiffreur d'élément)
+ Clé de chiffrement transmise comme entrée.
+ Clé de signature transmise comme entrée.
+ Description de matériau réel : [description de matériau demandé](DDBEC-legacy-concepts.md#legacy-material-description), le cas échéant, inchangé.

### Obtention des matériaux de déchiffrement
<a name="static-cmp-get-decryption-materials"></a>

Cette section décrit en détail les entrées, les sorties et le traitement du fournisseur CMP statique quand il reçoit une demande de matériaux de déchiffrement.

Même s'il comporte des méthodes distinctes pour l'obtention des matériaux de chiffrement et celle des matériaux de déchiffrement, le comportement est le même. 

**Entrée** (depuis l'application)
+ Une clé de chiffrement — Il doit s'agir d'une clé symétrique, telle qu'une clé AES ([Advanced Encryption Standard](https://tools.ietf.org/html/rfc3394.html)). 
+ Une clé de signature : il peut s'agir d'une clé symétrique ou d'une paire de clés asymétrique. 

**Entrée** (depuis le chiffreur d'élément)
+ Contexte de [chiffrement DynamoDB (non utilisé)](concepts.md#encryption-context)

**Sortie** (vers le chiffreur d'élément)
+ Clé de chiffrement transmise comme entrée.
+ Clé de signature transmise comme entrée.

# Langages de programmation disponibles pour le client de chiffrement Amazon DynamoDB
<a name="programming-languages"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Le client de chiffrement Amazon DynamoDB est disponible pour les langages de programmation suivants. Les bibliothèques spécifiques au langage varient, mais les implémentations qui en résultent sont interopérables. Par exemple, vous pouvez chiffrer (et signer) un élément avec le client Java et le déchiffrer avec le client Python.

Pour plus d'informations, consultez la rubrique correspondante.

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

# Client de chiffrement Amazon DynamoDB pour Java
<a name="java"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cette rubrique explique comment installer et utiliser le client de chiffrement Amazon DynamoDB pour Java. [Pour plus de détails sur la programmation avec le client de chiffrement DynamoDB, consultez [les exemples Java, les](java-examples.md) exemples du référentiel GitHub et [le](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) Javadoc pour aws-dynamodb-encryption-java le client de chiffrement DynamoDB.](https://aws.github.io/aws-dynamodb-encryption-java/)

**Note**  
Versions 1. *x.* *x* du client de chiffrement DynamoDB pour Java sont [end-of-support en phase à](what-is-database-encryption-sdk.md#support) compter de juillet 2022. Passez à une version plus récente dès que possible.

**Topics**
+ [Conditions préalables](#java-prerequisites)
+ [Installation](#java-installation)
+ [Utilisation du client de chiffrement DynamoDB pour Java](java-using.md)
+ [Exemples Java](java-examples.md)

## Conditions préalables
<a name="java-prerequisites"></a>

Avant d'installer le client de chiffrement Amazon DynamoDB pour Java, assurez-vous de remplir les conditions préalables suivantes.

**Environnement de développement Java**  
Vous aurez besoin de Java 8 ou version ultérieure. Sur le site web d'Oracle, consultez la page [Téléchargements Java SE](https://www.oracle.com/java/technologies/downloads/), puis téléchargez et installez le kit Java SE Development (JDK).  
Si vous utilisez le kit JDK Oracle, vous devez également télécharger et installer les [fichiers Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy](http://www.oracle.com/java/technologies/javase-jce8-downloads.html).

**AWS SDK pour Java**  
Le client de chiffrement DynamoDB nécessite le module DynamoDB même si votre application n'interagit pas avec DynamoDB. AWS SDK pour Java Vous pouvez installer la totalité du kit SDK ou le seul module. Si vous utilisez Maven, ajoutez `aws-java-sdk-dynamodb` à votre fichier `pom.xml`.   
Pour plus d'informations sur l'installation et la configuration du AWS SDK pour Java, consultez [AWS SDK pour Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/getting-started.html).

## Installation
<a name="java-installation"></a>

Vous pouvez installer le client de chiffrement Amazon DynamoDB pour Java de la manière suivante.

**Manuellement**  
Pour installer le client de chiffrement Amazon DynamoDB pour Java, clonez ou téléchargez le référentiel. [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/) GitHub 

**Utilisation d'Apache Maven**  
Le client de chiffrement Amazon DynamoDB pour Java est disponible [via Apache](https://maven.apache.org/) Maven avec la définition de dépendance suivante.  

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

Après avoir installé le SDK, commencez par consulter l'exemple de code présenté dans ce guide et le Javadoc du client de [chiffrement DynamoDB activé](https://aws.github.io/aws-dynamodb-encryption-java/). GitHub

# Utilisation du client de chiffrement DynamoDB pour Java
<a name="java-using"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cette rubrique décrit certaines fonctionnalités du client de chiffrement DynamoDB en Java qui ne sont peut-être pas disponibles dans d'autres implémentations de langage de programmation. 

[Pour plus de détails sur la programmation avec le client de chiffrement DynamoDB, consultez [les exemples Java, les](java-examples.md) exemples ci-dessous et [le](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) Javadoc pour `aws-dynamodb-encryption-java repository` GitHub le client de chiffrement DynamoDB.](https://aws.github.io/aws-dynamodb-encryption-java/)



**Topics**
+ [Chiffreurs d'éléments](#attribute-encryptor)
+ [Configuration du comportement d'enregistrement](#save-behavior)
+ [Actions d'attribut en Java](#attribute-actions-java)
+ [Remplacer les noms des tables](#override-table-name)

## Crypteurs d'objets : AttributeEncryptor et Dynamo DBEncryptor
<a name="attribute-encryptor"></a>

[Le client de chiffrement DynamoDB en Java possède [deux chiffreurs d'éléments](DDBEC-legacy-concepts.md#item-encryptor) : le Dynamo de niveau inférieur et le. DBEncryptor [AttributeEncryptor](#attribute-encryptor)](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) 

`AttributeEncryptor`Il s'agit d'une classe d'assistance qui vous aide à utiliser le [Dynamo DBMapper](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html) `DynamoDB Encryptor` dans le AWS SDK pour Java client de chiffrement DynamoDB. Lorsque vous utilisez le `AttributeEncryptor` avec le `DynamoDBMapper`, il chiffre et signe vos éléments de manière transparente lorsque vous les enregistrez. Il vérifie et déchiffre également vos éléments de manière transparente lorsque vous les chargez.

## Configuration du comportement d'enregistrement
<a name="save-behavior"></a>

Vous pouvez utiliser le `AttributeEncryptor` et `DynamoDBMapper` pour ajouter ou remplacer des éléments de tableau par des attributs signés uniquement ou chiffrés et signés. Pour ces tâches, nous vous recommandons de le configurer pour utiliser le comportement d'enregistrement `PUT`, comme illustré dans l'exemple suivant. Sinon, il est possible que vous ne puissiez pas déchiffrer vos données. 

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

Si vous utilisez le comportement d'enregistrement par défaut, qui met à jour uniquement les attributs modélisés dans l'élément de table, les attributs non modélisés ne sont pas inclus dans la signature et ne sont pas modifiés par les écritures de table. Par conséquent, lors de lectures ultérieures de tous les attributs, la signature ne sera pas validée, car elle n'inclut pas d'attributs non modélisés.

Vous pouvez également utiliser le comportement de sauvegarde `CLOBBER`. Comportement d'enregistrement est identique au comportement d'enregistrement `PUT`, si ce n'est qu'il désactive le verrouillage optimiste et remplace l'élément dans la table.

Pour éviter les erreurs de signature, le client de chiffrement DynamoDB lance une exception d'exécution si un est utilisé avec `AttributeEncryptor` un qui n'est pas configuré avec `DynamoDBMapper` un comportement d'enregistrement de ou. `CLOBBER` `PUT`

Pour voir ce code utilisé dans un exemple, consultez [Utilisation de la Dynamo DBMapper](java-examples.md#java-example-dynamodb-mapper) l'exemple [AwsKmsEncryptedObject.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java) dans le `aws-dynamodb-encryption-java` référentiel dans GitHub.

## Actions d'attribut en Java
<a name="attribute-actions-java"></a>

Les [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) déterminent les valeurs d'attribut chiffrées et signées, qui sont uniquement signées et qui sont ignorées. La méthode que vous utilisez pour spécifier les actions attributaires varie selon que vous utilisez le Dynamo `DynamoDBMapper` et `AttributeEncryptor` ou le [Dynamo DBEncryptor](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) de niveau inférieur.

**Important**  
Après avoir utilisé vos actions d’attribut pour chiffrer vos éléments de table, l’ajouter ou la suppression d’attributs de votre modèle de données peut provoquer une erreur de validation de signature qui vous empêche de déchiffrer vos données. Pour obtenir une explication détaillée, consultez [Modification de votre modèle de données](data-model.md).

### Actions attributaires pour le Dynamo DBMapper
<a name="attribute-action-java-mapper"></a>

Quand vous utilisez les `DynamoDBMapper` et `AttributeEncryptor`, vous utilisez les annotations pour spécifier les actions d'attribut. Le client de chiffrement DynamoDB utilise les annotations d'attribut [DynamoDB standard qui définissent le type d'attribut](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Annotations.html) afin de déterminer comment protéger un attribut. Par défaut, tous les attributs sont chiffrés et signés à l'exception des clés primaires, qui sont signées, mais pas chiffrées.

**Note**  
Ne chiffrez pas la valeur des attributs avec l'[annotation @Dynamo DBVersion Attribute](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html), bien que vous puissiez (et devriez) les signer. Sinon, les conditions qui utilisent sa valeur auront des effets inattendus.

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

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

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

Pour spécifier des exceptions, utilisez les annotations de chiffrement définies dans le client de chiffrement DynamoDB pour Java. Si vous les spécifiez au niveau classe, elles deviennent la valeur par défaut pour la classe.

```
// Sign only
@DoNotEncrypt

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

Par exemple, ces annotations signent mais ne chiffrent pas l'attribut `PublicationYear`, et ni ne chiffrent ou ne signent la valeur d'attribut `ISBN`.

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

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

### Actions attributaires pour le Dynamo DBEncryptor
<a name="attribute-action-default"></a>

Pour spécifier des actions d'attribut lorsque vous utilisez DBEncryptor directement le [Dynamo](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html), créez un `HashMap` objet dans lequel les paires nom-valeur représentent les noms d'attributs et les actions spécifiées. 

Les valeurs valides des actions d'attribut sont définies dans le type énuméré `EncryptionFlags`. Vous pouvez utiliser `ENCRYPT` et `SIGN` conjointement, utiliser `SIGN` seul, ou omettre les deux. Toutefois, si vous l'utilisez `ENCRYPT` seul, le client de chiffrement DynamoDB génère une erreur. Vous ne pouvez pas chiffrer un attribut que vous ne signez pas.

```
ENCRYPT
SIGN
```

**Avertissement**  
Ne chiffrez pas les attributs de la clé primaire. Ils doivent rester en texte brut pour que DynamoDB puisse trouver l'élément sans exécuter une analyse complète du tableau.

Si vous spécifiez une clé primaire dans le contexte de chiffrement, puis que vous la spécifiez `ENCRYPT` dans l'action d'attribut pour l'un ou l'autre des attributs de clé primaire, le client de chiffrement DynamoDB émet une exception.

Par exemple, le code Java suivant crée un code `actions` HashMap qui chiffre et signe tous les attributs de l'`record`élément. Les exceptions sont les attributs de clé de partition et de clé de tri, qui sont signés mais non chiffrés, et l'attribut `test`, qui n'est ni signé ni chiffré.

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

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

Puis, quand vous appelez la méthode [encryptRecord](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html#encryptRecord-java.util.Map-java.util.Map-com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext-) de `DynamoDBEncryptor`, spécifiez la map comme valeur du paramètre `attributeFlags`. Par exemple, cet appel d'`encryptRecord` utilise la map `actions`.

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

## Remplacer les noms des tables
<a name="override-table-name"></a>

Dans le client de chiffrement DynamoDB, le nom de la table DynamoDB est un élément du contexte de chiffrement [DynamoDB transmis aux méthodes de chiffrement et de déchiffrement](concepts.md#encryption-context). Lorsque vous chiffrez ou signez des éléments de table, le contexte de chiffrement DynamoDB, y compris le nom de la table, est lié cryptographiquement au texte chiffré. Si le contexte de chiffrement DynamoDB transmis à la méthode de déchiffrement ne correspond pas au contexte de chiffrement DynamoDB transmis à la méthode de chiffrement, l'opération de déchiffrement échoue.

Il arrive parfois que le nom d'une table change, par exemple lorsque vous sauvegardez une table ou que vous effectuez une [point-in-time restauration](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery.html). Lorsque vous déchiffrez ou vérifiez la signature de ces éléments, vous devez transmettre le même contexte de chiffrement DynamoDB que celui utilisé pour chiffrer et signer les éléments, y compris le nom de table d'origine. Le nom de la table actuelle n'est pas nécessaire. 

Lorsque vous utilisez le`DynamoDBEncryptor`, vous assemblez le contexte de chiffrement DynamoDB manuellement. Toutefois, si vous utilisez le`DynamoDBMapper`, `AttributeEncryptor` crée le contexte de chiffrement DynamoDB pour vous, y compris le nom de la table actuelle. Pour indiquer à `AttributeEncryptor` de créer un contexte de chiffrement avec un nom de table différent, utilisez le `EncryptionContextOverrideOperator`. 

Par exemple, le code suivant crée des instances du fournisseur de matériaux cryptographiques (CMP) et du `DynamoDBEncryptor`. Ensuite, il appelle la méthode `setEncryptionContextOverrideOperator` de `DynamoDBEncryptor`. Il utilise l'opérateur `overrideEncryptionContextTableName`, qui remplace un nom de table. Lorsqu'il est configuré de cette façon, il `AttributeEncryptor` crée un contexte de chiffrement DynamoDB qui `newTableName` inclut à la place de. `oldTableName` Pour un exemple complet, consultez [EncryptionContextOverridesWithDynamoDBMapper.java.](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java)

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

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

Lorsque vous appelez la méthode de chargement de `DynamoDBMapper`, qui déchiffre et vérifie l'élément, vous spécifiez le nom de la table d'origine.

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

Vous pouvez également utiliser l'opérateur `overrideEncryptionContextTableNameUsingMap`, qui remplace plusieurs noms de table. 

Les opérateurs de remplacement de nom de table sont généralement utilisés lors du déchiffrement des données et de la vérification des signatures. Vous pouvez toutefois les utiliser pour attribuer une valeur différente au nom de la table dans le contexte de chiffrement DynamoDB lors du chiffrement et de la signature.

N'utilisez pas les opérateurs de remplacement de nom de table si vous utilisez le `DynamoDBEncryptor`. Créez plutôt un contexte de chiffrement avec le nom de la table d'origine et soumettez-le à la méthode de déchiffrement.

# Exemple de code pour le client de chiffrement DynamoDB pour Java
<a name="java-examples"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Les exemples suivants montrent comment utiliser le client de chiffrement DynamoDB pour Java afin de protéger les éléments de table DynamoDB dans votre application. Vous pouvez trouver d'autres exemples (et apporter les vôtres) dans le répertoire des [exemples](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) du [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/)référentiel sur GitHub.

**Topics**
+ [Utilisation de la Dynamo DBEncryptor](#java-example-ddb-encryptor)
+ [Utilisation de la Dynamo DBMapper](#java-example-dynamodb-mapper)

## Utilisation de la Dynamo DBEncryptor
<a name="java-example-ddb-encryptor"></a>

Cet exemple montre comment utiliser le [Dynamo](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) de niveau inférieur DBEncryptor avec le fournisseur [Direct KMS](direct-kms-provider.md). Le fournisseur Direct KMS génère et protège son matériel cryptographique sous un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in AWS Key Management Service (AWS KMS) que vous spécifiez.

Vous pouvez utiliser n'importe quel [fournisseur de matériel cryptographique](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) compatible avec le`DynamoDBEncryptor`, et vous pouvez utiliser le fournisseur Direct KMS avec le `DynamoDBMapper` et. [AttributeEncryptor](java-using.md#attribute-encryptor)

**Voir l'exemple de code complet** : [AwsKmsEncryptedItem.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)

Étape 1 : Créer le fournisseur KMS direct  
Créez une instance du AWS KMS client avec la région spécifiée. Utilisez ensuite l'instance client pour créer une instance du fournisseur Direct KMS selon vos préférences AWS KMS key.   
Cet exemple utilise l'Amazon Resource Name (ARN) pour identifier le AWS KMS key, mais vous pouvez utiliser [n'importe quel identifiant de clé valide](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn).   

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

Étape 2 : Créer un élément  
Cet exemple définit un `record` HashMap qui représente un exemple d'élément de table.  

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

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

Étape 3 : Création d'une dynamo DBEncryptor  
Créez une instance de `DynamoDBEncryptor` avec le fournisseur KMS direct.  

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

Étape 4 : Création d'un contexte de chiffrement DynamoDB  
Le contexte de [chiffrement DynamoDB](concepts.md#encryption-context) contient des informations sur la structure de la table et sur la manière dont elle est chiffrée et signée. Si vous utilisez `DynamoDBMapper`, `AttributeEncryptor` crée automatiquement le contexte de chiffrement.  

```
final String tableName = "testTable";

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

Étape 5 : Créer l'objet actions d'attribut  
Les [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) déterminent quels attributs de l'élément sont chiffrés et signés, lesquels sont uniquement signés et lesquels ne sont ni chiffrés ni signés.  
En Java, pour spécifier des actions d'attribut, vous créez des paires HashMap de nom d'attribut et de `EncryptionFlags` valeur.   
Par exemple, le code Java suivant crée un `actions` HashMap qui chiffre et signe tous les attributs de l'`record`élément, à l'exception des attributs de clé de partition et de clé de tri, qui sont signés, mais non chiffrés, et de l'`test`attribut, qui n'est ni signé ni chiffré.  

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

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

Étape 6 : Chiffrer et signer l'élément  
Pour chiffrer et signer l'élément de table, appelez la méthode `encryptRecord` sur l'instance de `DynamoDBEncryptor`. Spécifiez l'élément de table (`record`), les actions d'attribut (`actions`) et le contexte de chiffrement (`encryptionContext`).  

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

Étape 7 : Placer l'élément dans la table DynamoDB  
Enfin, placez l'élément chiffré et signé dans la table DynamoDB.  

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

## Utilisation de la Dynamo DBMapper
<a name="java-example-dynamodb-mapper"></a>

[L'exemple suivant montre comment utiliser la classe d'assistance du mappeur DynamoDB avec le fournisseur Direct KMS.](direct-kms-provider.md) Le fournisseur Direct KMS génère et protège son matériel cryptographique sous un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in AWS Key Management Service (AWS KMS) que vous spécifiez.

Vous pouvez utiliser tout [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) compatible avec `DynamoDBMapper`, et vous pouvez utiliser le fournisseur KMS direct avec le `DynamoDBEncryptor` de bas niveau.

**Voir l'exemple de code complet** : [AwsKmsEncryptedObject.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java)

Étape 1 : Créer le fournisseur KMS direct  
Créez une instance du AWS KMS client avec la région spécifiée. Utilisez ensuite l'instance client pour créer une instance du fournisseur Direct KMS selon vos préférences AWS KMS key.   
Cet exemple utilise l'Amazon Resource Name (ARN) pour identifier le AWS KMS key, mais vous pouvez utiliser [n'importe quel identifiant de clé valide](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id).   

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

Étape 2 : Création du chiffreur DynamoDB et de Dynamo DBMapper  
Utilisez le fournisseur Direct KMS que vous avez créé à l'étape précédente pour créer une instance de [DynamoDB Encryptor](java-using.md#attribute-encryptor). Vous devez instancier le chiffreur DynamoDB de niveau inférieur pour utiliser le mappeur DynamoDB.  
Créez ensuite une instance de votre base de données DynamoDB et une configuration de mappeur, puis utilisez-les pour créer une instance du mappeur DynamoDB.   
Lorsque vous utilisez `DynamoDBMapper` pour ajouter ou modifier des éléments signés (ou chiffrés et signés), configurez-le pour qu'il [utilise un comportement d'enregistrement](java-using.md#save-behavior), par exemple `PUT`, qui inclut tous les attributs, comme illustré dans l'exemple suivant. Sinon, il est possible que vous ne puissiez pas déchiffrer vos données. 

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

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

Étape 3 : définition de votre table DynamoDB  
Définissez ensuite votre table DynamoDB. Utilisez des annotations pour spécifier les [actions d'attribut](java-using.md#attribute-actions-java). Cet exemple crée une table DynamoDB et une classe qui `ExampleTable` représente les éléments `DataPoJo` de la table.   
Dans cet exemple de table, les attributs de la clé primaire seront signés, mais pas chiffrés. Cela s'applique à l'attribut `partition_attribute`, qui est annoté avec `@DynamoDBHashKey`, et l'attribut `sort_attribute`, qui est annoté avec `@DynamoDBRangeKey`.   
Les attributs qui sont annotés avec `@DynamoDBAttribute`, par exemple `some numbers`, seront chiffrés et signés. Les exceptions sont les attributs qui utilisent les annotations de chiffrement `@DoNotEncrypt` (signer uniquement) ou `@DoNotTouch` (ne pas chiffrer ni signer) définies par le client de chiffrement DynamoDB. Par exemple, étant donné que l'attribut `leave me` comporte une annotation `@DoNotTouch`, il ne sera ni chiffré ni signé.  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Étape 4 : Chiffrer et enregistrer un élément de table  
Désormais, lorsque vous créez un élément de table et que vous utilisez le mappeur DynamoDB pour l'enregistrer, l'élément est automatiquement chiffré et signé avant d'être ajouté à la table.  
Cet exemple définit un élément de table appelé `record`. Avant qu'il soit enregistré dans la table, ses attributs sont chiffrées et signés selon les annotations de la classe `DataPoJo`. Dans le cas présent, tous les attributs à l'exception de `PartitionAttribute`, `SortAttribute` et `LeaveMe` sont chiffrés et signés. `PartitionAttribute` et `SortAttributes` sont seulement signés. L'attribut `LeaveMe` n'est ni chiffré ni signé.  
Pour chiffrer et signer l'élément `record`, puis l'ajouter à `ExampleTable`, appelez la méthode `save` de la classe `DynamoDBMapper`. Votre mappeur DynamoDB étant configuré pour utiliser `PUT` le comportement d'enregistrement, l'élément remplace tout élément possédant les mêmes clés primaires, au lieu de le mettre à jour. Cela garantit que les signatures correspondent et que vous pouvez déchiffrer l'élément lorsque vous le récupérez de la table.  

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

mapper.save(record);
```

# Client de chiffrement DynamoDB pour Python
<a name="python"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cette rubrique explique comment installer et utiliser le client de chiffrement DynamoDB pour Python. Vous pouvez trouver le code dans le [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)référentiel sur GitHub, y compris un [exemple de code](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) complet et testé pour vous aider à démarrer.

**Note**  
Versions 1. *x.* *x* et 2. *x.* *x* du client de chiffrement DynamoDB pour Python sont [end-of-support en phase à](what-is-database-encryption-sdk.md#support) compter de juillet 2022. Passez à une version plus récente dès que possible.

**Topics**
+ [Conditions préalables](#python-prerequisites)
+ [Installation](#python-installation)
+ [Utilisation du client de chiffrement DynamoDB pour Python](python-using.md)
+ [Exemples Python](python-examples.md)

## Conditions préalables
<a name="python-prerequisites"></a>

Avant d'installer le client de chiffrement Amazon DynamoDB pour Python, assurez-vous de remplir les conditions préalables suivantes.

**Version prise en charge de Python**  
Python 3.8 ou version ultérieure est requis par le client de chiffrement Amazon DynamoDB pour les versions 3.3.0 et ultérieures de Python. Pour télécharger Python, consultez [Téléchargements Python](https://www.python.org/downloads/).  
Les versions antérieures du client de chiffrement Amazon DynamoDB pour Python prennent en charge Python 2.7, Python 3.4 et versions ultérieures, mais nous vous recommandons d'utiliser la dernière version du client de chiffrement DynamoDB.

**Outil d'installation pip pour Python**  
Python 3.6 et versions ultérieures incluent **pip**, bien que vous souhaitiez peut-être le mettre à niveau. Pour plus d'informations sur la mise à niveau ou l'installation de pip, consultez [Installation](https://pip.pypa.io/en/latest/installation/) dans la documentation **pip**.

## Installation
<a name="python-installation"></a>

Utilisez **pip** pour installer le client de chiffrement Amazon DynamoDB pour Python, comme indiqué dans les exemples suivants.

**Pour installer la dernière version**  

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

Pour plus d'informations sur l'utilisation de **pip** pour installer et mettre à niveau les packages, consultez [Installing Packages](https://packaging.python.org/tutorials/installing-packages/).

Le client de chiffrement DynamoDB nécessite la bibliothèque de chiffrement [sur toutes les plateformes](https://cryptography.io/en/latest/). Toutes les versions de **pip** installent et créent la bibliothèque de **chiffrement** sous Windows. **pip** 8.1 et les versions ultérieures installent et créent la bibliothèque de **chiffrement** sous Linux. Si vous utilisez une version antérieure de **pip** et que votre environnement Linux ne possède pas les outils nécessaires pour générer la bibliothèque de **chiffrement**, vous devez les installer. Pour plus d'informations, consultez [Création du chiffrement sous Linux](https://cryptography.io/en/latest/installation/#building-cryptography-on-linux).

Vous pouvez obtenir la dernière version de développement du client de chiffrement DynamoDB à partir du [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)référentiel. GitHub

Après avoir installé le client de chiffrement DynamoDB, commencez par consulter l'exemple de code Python présenté dans ce guide.

# Utilisation du client de chiffrement DynamoDB pour Python
<a name="python-using"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cette rubrique décrit certaines fonctionnalités du client de chiffrement DynamoDB pour Python qui ne sont peut-être pas disponibles dans d'autres implémentations de langage de programmation. Ces fonctionnalités sont conçues pour faciliter l'utilisation du client de chiffrement DynamoDB de la manière la plus sécurisée qui soit. À moins que vous n'ayez un scénario inhabituel, nous vous recommandons de les utiliser.

Pour plus de détails sur la programmation avec le client de chiffrement DynamoDB, consultez les exemples [Python](python-examples.md) de ce guide, [les exemples du](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) référentiel et aws-dynamodb-encryption-python la documentation GitHub [Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/) du client de chiffrement DynamoDB.

**Topics**
+ [Classes d'annotations clientes](#python-helpers)
+ [TableInfo classe](#table-info)
+ [Actions d'attribut en Python](#python-attribute-actions)

## Classes d'annotations clientes
<a name="python-helpers"></a>

Le client de chiffrement DynamoDB pour Python inclut plusieurs classes d'assistance client qui reflètent les classes Boto 3 pour DynamoDB. Ces classes d'assistance sont conçues pour faciliter l'ajout de chiffrement et de signature à votre application DynamoDB existante et pour éviter les problèmes les plus courants, comme suit :
+ Empêchez-vous de chiffrer la clé primaire de votre élément, soit en ajoutant une action de remplacement pour la clé primaire à l'[AttributeActions](#python-attribute-actions)objet, soit en lançant une exception si votre `AttributeActions` objet demande explicitement au client de chiffrer la clé primaire. Si l'action par défaut de votre objet `AttributeActions` est `DO_NOTHING`, les classes d'annotations clientes utilisent cette action pour la clé primaire. Sinon, elles utilisent `SIGN_ONLY`.
+ Créez un [TableInfo objet](#python-helpers) et renseignez le contexte de [chiffrement DynamoDB](concepts.md#encryption-context) en fonction d'un appel à DynamoDB. Cela permet de garantir que votre contexte de chiffrement DynamoDB est précis et que le client peut identifier la clé primaire.
+ Support des méthodes, telles que `put_item` et`get_item`, qui chiffrent et déchiffrent de manière transparente les éléments de votre table lorsque vous écrivez ou lisez dans une table DynamoDB. Seule la méthode `update_item` n'est pas prise en charge.

Vous pouvez utiliser les classes d'annotations clientes au lieu d'interagir directement avec le [chiffreur d'élément](DDBEC-legacy-concepts.md#item-encryptor) de bas niveau. Utilisez ces classes à moins que vous n'ayez besoin de définir des options avancées dans le chiffreur d'élément.

Les classes d'annotations clientes incluent les éléments suivants :
+ [EncryptedTable](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/table.html#module-dynamodb_encryption_sdk.encrypted.table)pour les applications qui utilisent la ressource [Table](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#table) dans DynamoDB pour traiter une table à la fois.
+ [EncryptedResource](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/resource.html)pour les applications qui utilisent la classe [Service Resource](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#service-resource) dans DynamoDB pour le traitement par lots.
+ [EncryptedClient](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/client.html)pour les applications qui utilisent le [client de niveau inférieur dans DynamoDB](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#client).

Pour utiliser les classes d'assistance client, l'appelant doit être autorisé à appeler l'opération DynamoDB sur la table cible [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html).

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

La [TableInfo](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/tools/structures.html#dynamodb_encryption_sdk.structures.TableInfo)classe est une classe auxiliaire qui représente une table DynamoDB, avec des champs pour sa clé primaire et ses index secondaires. Elle vous permet d'obtenir des informations précises et en temps réel sur la table.

Si vous utilisez une [classe d'annotations clientes](#python-helpers), elle crée et utilise un objet `TableInfo` pour vous. Sinon, vous pouvez en créer un explicitement. Pour obtenir un exemple, consultez [Utilisation du chiffreur d'élément](python-examples.md#python-example-item-encryptor).

Lorsque vous appelez la `refresh_indexed_attributes` méthode sur un `TableInfo` objet, elle renseigne les valeurs des propriétés de l'objet en appelant l'opération DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). L'interrogation de la table est beaucoup plus fiable que le codage en dur des noms d'index. La `TableInfo` classe inclut également une `encryption_context_values` propriété qui fournit les valeurs requises pour le contexte de [chiffrement DynamoDB](concepts.md#encryption-context). 

Pour utiliser la `refresh_indexed_attributes` méthode, l'appelant doit être autorisé à appeler l'opération [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)DynamoDB sur la table cible.

## Actions d'attribut en Python
<a name="python-attribute-actions"></a>

Les [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) informent le chiffreur d'élément des actions à exécuter sur chaque attribut de l'élément. Pour spécifier les actions d'attribut en Python, créez un objet `AttributeActions` avec une action par défaut et les exceptions éventuelles pour des attributs particuliers. Les valeurs valides sont définies dans le type énuméré `CryptoAction`.

**Important**  
Après avoir utilisé vos actions d’attribut pour chiffrer vos éléments de table, l’ajouter ou la suppression d’attributs de votre modèle de données peut provoquer une erreur de validation de signature qui vous empêche de déchiffrer vos données. Pour obtenir une explication détaillée, consultez [Modification de votre modèle de données](data-model.md).

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

Par exemple, l'objet `AttributeActions` établit `ENCRYPT_AND_SIGN` comme valeur par défaut pour tous les attributs, et spécifie les exceptions pour les attributs `ISBN` et `PublicationYear`.

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

Si vous utilisez une [classe d'annotations clientes](#python-helpers), vous n'avez pas besoin de spécifier une action d'attribut pour les attributs de clé primaire. Les classes d'annotations clients vous empêchent de chiffrer votre clé primaire.

Si vous n'utilisez pas une classe d'annotations clientes et que l'action par défaut est `ENCRYPT_AND_SIGN`, vous devez spécifier une action pour la clé primaire. L'action recommandée pour les clés primaires est `SIGN_ONLY`. À des fins de simplification, utilisez la méthode `set_index_keys`, qui utilise SIGN\$1ONLY pour les clés primaires ou DO\$1NOTHING quand il s'agit de l'action par défaut.

**Avertissement**  
Ne chiffrez pas les attributs de la clé primaire. Ils doivent rester en texte brut pour que DynamoDB puisse trouver l'élément sans exécuter une analyse complète du tableau.

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

# Exemple de code pour le client de chiffrement DynamoDB pour Python
<a name="python-examples"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Les exemples suivants montrent comment utiliser le client de chiffrement DynamoDB pour Python afin de protéger les données DynamoDB dans votre application. Vous pouvez trouver d'autres exemples (et apporter les vôtres) dans le répertoire des [exemples](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) du [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)référentiel sur GitHub.

**Topics**
+ [Utiliser la classe d'assistance EncryptedTable client](#python-example-table)
+ [Utilisation du chiffreur d'élément](#python-example-item-encryptor)

## Utiliser la classe d'assistance EncryptedTable client
<a name="python-example-table"></a>

L'exemple suivant montre comment utiliser le [fournisseur KMS direct](direct-kms-provider.md) avec la `EncryptedTable` [classe d'annotations cliente](python-using.md#python-helpers). Cet exemple utilise le même [fournisseur CMP](DDBEC-legacy-concepts.md#concept-material-provider) que l'exemple [Utilisation du chiffreur d'élément](#python-example-item-encryptor) qui suit. Cependant, il utilise la classe `EncryptedTable` au lieu d'interagir directement avec le [chiffreur d'élément](DDBEC-legacy-concepts.md#item-encryptor) de bas niveau.

En comparant ces exemples, vous pouvez voir le travail que la classe d'annotations cliente effectue à votre place. Cela implique de créer le contexte de [chiffrement DynamoDB](concepts.md#encryption-context) et de s'assurer que les attributs de clé primaire sont toujours signés, mais jamais chiffrés. Pour créer le contexte de chiffrement et découvrir la clé primaire, les classes d'assistance client appellent l'opération DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). Pour exécuter ce code, vous devez avoir l'autorisation d'appeler cette opération.

**Consultez l'exemple de code complet** : [aws\$1kms\$1encrypted\$1table.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py)

Étape 1 : Créer la table  
Commencez par créer une instance d'une table DynamoDB standard avec le nom de la table.  

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

Étape 2 : Créer un fournisseur CMP  
Créez une instance du [fournisseur CMP](crypto-materials-providers.md) que vous avez sélectionné.  
Cet exemple utilise le [fournisseur KMS direct](direct-kms-provider.md), mais vous pouvez utiliser n'importe quel fournisseur CMP compatible. Pour créer un fournisseur KMS direct, spécifiez un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys). Cet exemple utilise le Amazon Resource Name (ARN) du AWS KMS key, mais vous pouvez utiliser n'importe quel identifiant de clé valide.  

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

Étape 3 : Créer l'objet actions d'attribut  
Les [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) informent le chiffreur d'élément des actions à exécuter sur chaque attribut de l'élément. L'objet `AttributeActions` de l'exemple chiffre et signe tous les éléments à l'exception de l'attribut `test`, qui est ignoré.  
Ne spécifiez pas d'actions d'attribut pour les attributs de clé primaire quand vous utilisez une classe d'annotations cliente. La classe `EncryptedTable` signe, mais ne chiffre jamais, les attributs de clé primaire.  

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

Étape 4 : Créer la table chiffrée  
Créez la table chiffrée à l'aide de la table standard, du fournisseur KMS direct et des actions d'attribut. Cette étape termine la configuration.   

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

Étape 5 : Placer l'élément en texte brut dans la table  
Lorsque vous appelez la `put_item` méthode sur le`encrypted_table`, les éléments de votre table sont chiffrés, signés et ajoutés de manière transparente à votre table DynamoDB.  
Tout d'abord, définissez l'élément de table.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
Puis, insérez-le dans la table.  

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

Pour obtenir l'élément de la table DynamoDB sous sa forme cryptée, appelez `get_item` la méthode sur l'objet. `table` Pour obtenir l'élément chiffré, appelez la méthode `get_item` sur l'objet `encrypted_table`.

## Utilisation du chiffreur d'élément
<a name="python-example-item-encryptor"></a>

Cet exemple montre comment interagir directement avec le chiffreur d'[éléments dans le client de chiffrement DynamoDB lors du chiffrement d'éléments de table, au lieu d'utiliser les classes d'[assistance du client qui interagissent avec le](python-using.md#python-helpers) crypteur](DDBEC-legacy-concepts.md#item-encryptor) d'éléments à votre place. 

Lorsque vous utilisez cette technique, vous créez le contexte de chiffrement DynamoDB et l'objet `CryptoConfig` de configuration () manuellement. Vous cryptez également les éléments lors d'un appel et vous les placez dans votre table DynamoDB lors d'un appel distinct. Cela vous permet de personnaliser vos `put_item` appels et d'utiliser le client de chiffrement DynamoDB pour chiffrer et signer les données structurées qui ne sont jamais envoyées à DynamoDB.

Cet exemple utilise le [fournisseur KMS direct](direct-kms-provider.md), mais vous pouvez utiliser n'importe quel fournisseur CMP compatible.

**Voir l'exemple de code complet** : [aws\$1kms\$1encrypted\$1item.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

Étape 1 : Créer la table  
Commencez par créer une instance d'une ressource de table DynamoDB standard avec le nom de la table.  

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

Étape 2 : Créer un fournisseur CMP  
Créez une instance du [fournisseur CMP](crypto-materials-providers.md) que vous avez sélectionné.  
Cet exemple utilise le [fournisseur KMS direct](direct-kms-provider.md), mais vous pouvez utiliser n'importe quel fournisseur CMP compatible. Pour créer un fournisseur KMS direct, spécifiez un [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys). Cet exemple utilise le Amazon Resource Name (ARN) du AWS KMS key, mais vous pouvez utiliser n'importe quel identifiant de clé valide.  

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

Étape 3 : Utiliser la classe TableInfo d'assistance  
Pour obtenir des informations sur la table à partir de DynamoDB, créez une instance de [TableInfo](python-using.md#python-helpers)la classe d'assistance. Lorsque vous travaillez directement avec le chiffreur d'élément, vous devez créer une instance `TableInfo` et appeler ses méthodes. Les [classes d'annotation clientes](python-using.md#python-helpers) le font pour vous.  
La `refresh_indexed_attributes` méthode `TableInfo` utilise l'opération [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)DynamoDB pour obtenir des informations précises et en temps réel sur la table. Elles incluent la clé primaire et ses index secondaires locaux et globaux. L'appelant doit avoir l'autorisation d'appeler `DescribeTable`.  

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

Étape 4 : Création du contexte de chiffrement DynamoDB  
Le contexte de [chiffrement DynamoDB](concepts.md#encryption-context) contient des informations sur la structure de la table et sur la manière dont elle est chiffrée et signée. Cet exemple crée un contexte de chiffrement DynamoDB de manière explicite, car il interagit avec le chiffreur d'éléments. Les [classes d'assistance client](python-using.md#python-helpers) créent le contexte de chiffrement DynamoDB pour vous.   
Pour obtenir la clé de partition et la clé de tri, vous pouvez utiliser les propriétés de la classe d'[TableInfo](python-using.md#python-helpers)assistance.   

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

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

Étape 5 : Créer l'objet actions d'attribut  
Les [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) informent le chiffreur d'élément des actions à exécuter sur chaque attribut de l'élément. L'objet `AttributeActions` de l'exemple chiffre et signe tous les éléments à l'exception des attributs de clé primaire, qui sont signés, mais pas chiffrés, et de l'attribut `test`, qui est ignoré.  
Lorsque vous interagissez directement avec le chiffreur d'élément et que votre action par défaut est `ENCRYPT_AND_SIGN`, vous devez spécifier une autre action pour la clé primaire. Vous pouvez utiliser la méthode `set_index_keys`, qui utilise `SIGN_ONLY` pour la clé primaire, ou `DO_NOTHING` s'il s'agit de l'action par défaut.  
Pour spécifier la clé primaire, cet exemple utilise les clés d'index de l'[TableInfo](python-using.md#python-helpers)objet, qui sont renseignées par un appel à DynamoDB. Cette technique est plus sûre que le codage en dur des noms de clé primaire.  

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

Étape 6 : Créer la configuration pour l'élément  
Pour configurer le client de chiffrement DynamoDB, utilisez les objets que vous venez de créer dans [CryptoConfig](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/config.html)une configuration pour l'élément de table. Les classes d'assistance client créent le CryptoConfig pour vous.   

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

Étape 7 : Chiffrer l'élément  
Cette étape chiffre et signe l'élément, mais ne le place pas dans la table DynamoDB.   
Lorsque vous utilisez une classe d'assistance client, vos éléments sont chiffrés et signés de manière transparente, puis ajoutés à votre table DynamoDB lorsque vous appelez la méthode de la `put_item` classe d'assistance. Lorsque vous utilisez le chiffreur d'élément directement, les actions de chiffrage et de placement sont indépendantes.  
Tout d'abord, créez un élément en texte brut.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_key': 55,
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
Puis, chiffrez-le et signez-le. La méthode `encrypt_python_item` requiert l'objet de configuration `CryptoConfig`.  

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

Étape 8 : Placer l'élément dans la table  
Cette étape place l'élément chiffré et signé dans la table DynamoDB.  

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

Pour afficher l'élément chiffré, appelez la méthode `get_item` sur l'objet original `table`, et non sur l'objet `encrypted_table`. Elle obtient l'élément de la table DynamoDB sans le vérifier et le déchiffrer.

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

L'illustration suivante présente une partie d'un exemple d'élément de table chiffré et signé.

Les valeurs des attributs chiffrés sont des données binaires. Les noms et valeurs des attributs de clé primaire (`partition_attribute` et `sort_attribute`) et l'attribut `test` demeurent en texte brut. La sortie affiche aussi l'attribut qui contient la signature (`*amzn-ddb-map-sig*`) et l'[attribut de description des matériaux](DDBEC-legacy-concepts.md#legacy-material-description) (`*amzn-ddb-map-desc*`).

![\[Extrait d'un élément de table chiffré et signé\]](http://docs.aws.amazon.com/fr_fr/database-encryption-sdk/latest/devguide/images/encrypted-item-closeup.png)


# Modification de votre modèle de données
<a name="data-model"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Chaque fois que vous chiffrez ou déchiffrez un élément, vous devez fournir des [actions attributaires](DDBEC-legacy-concepts.md#legacy-attribute-actions) qui indiquent au client de chiffrement DynamoDB les attributs à chiffrer et à signer, les attributs à signer (mais pas à chiffrer) et ceux à ignorer. Les actions d'attribut ne sont pas enregistrées dans l'élément chiffré et le client de chiffrement DynamoDB ne met pas automatiquement à jour vos actions d'attribut.

**Important**  
Le client de chiffrement DynamoDB ne prend pas en charge le chiffrement des données de table DynamoDB existantes non chiffrées.

Chaque fois que vous modifiez votre modèle de données, c'est-à-dire lorsque vous ajoutez ou supprimez des attributs de vos éléments de table, vous risquez une erreur. Si les actions d'attribut que vous spécifiez ne rendent pas compte de tous les attributs de l'élément, l'élément peut ne pas être chiffré et signé comme vous l'escomptiez. Surtout, si les actions d'attribut que vous fournissez lors du déchiffrement d'un élément diffèrent des actions d'attribut que vous avez fournies lors du chiffrement de l'élément, la vérification de la signature peut échouer. 

Par exemple, si les actions d'attribut utilisées pour chiffrer l'élément lui disent de signer l'attribut `test`, la signature de l'élément comportera l'attribut `test`. Cependant, si les actions d'attribut utilisées pour déchiffrer l'élément ne tiennent pas compte de l'attribut `test`, la vérification échouera parce que le client essaiera de vérifier une signature qui n'inclut pas l'attribut `test`. 

Cela pose un problème particulier lorsque plusieurs applications lisent et écrivent les mêmes éléments DynamoDB, car le client de chiffrement DynamoDB doit calculer la même signature pour les éléments de toutes les applications. C'est également un problème pour toute application distribuée car les modifications dans les actions d'attribut doivent se propager à tous les hôtes. Même si un hôte accède à vos tables DynamoDB dans le cadre d'un seul processus, la mise en place d'un processus basé sur les meilleures pratiques permettra d'éviter les erreurs si le projet devient plus complexe.

Pour éviter les erreurs de validation de signature qui vous empêchent de lire les éléments de votre tableau, suivez les instructions suivantes.
+ [Ajout d'un attribut](#add-attribute) : si le nouvel attribut modifie vos actions d'attribut, déployez entièrement la modification d'action d'attribut avant d'inclure le nouvel attribut dans un élément.
+ [Suppression d'un attribut](#remove-attribute) : si vous arrêtez d'utiliser un attribut dans vos articles, ne modifiez pas vos actions d'attribut. 
+ Modification de l'action : une fois que vous avez utilisé une configuration d'actions attributaires pour chiffrer les éléments de votre tableau, vous ne pouvez pas modifier en toute sécurité l'action par défaut ou l'action d'un attribut existant sans rechiffrer chaque élément de votre tableau.

Les erreurs de validation de signature peuvent être extrêmement difficiles à résoudre, de sorte que la meilleure approche consiste à les prévenir. 

**Topics**
+ [Ajout d'un attribut](#add-attribute)
+ [Suppression d'un attribut](#remove-attribute)

## Ajout d'un attribut
<a name="add-attribute"></a>

Lorsque vous ajouterez un nouvel attribut à des éléments de table, vous devrez peut-être modifier vos actions attributaires. Pour éviter les erreurs de validation de signature, nous vous recommandons d'implémenter cette modification en deux étapes. Vérifiez que la première étape est terminée avant de commencer la deuxième étape.

1. Modifiez les actions d'attribut dans toutes les applications qui lisent ou écrivent dans la table. Déployez ces modifications et confirmez que la mise à jour a été propagée à tous les hôtes de destination. 

1. Écrire des valeurs dans le nouvel attribut dans vos éléments de table.

Cette approche en deux étapes garantit que toutes les applications et les hôtes ont les mêmes actions d'attribut et calculera la même signature, avant toute rencontre avec le nouvel attribut. Ceci est important même lorsque l'action de l'attribut est *Ne rien faire* (ne pas chiffrer ou signer), car la valeur par défaut de certains chiffreurs est de chiffrer et de signer.

Les exemples suivants montrent le code de la première étape de ce processus. Ils ajoutent un nouvel attribut d'élément `link`, qui stocke un lien vers un autre élément de table. Étant donné que ce lien doit rester en texte brut, l'exemple lui attribue l'action sign-only. Après avoir entièrement déployé cette modification, puis vérifié que toutes les applications et tous les hôtes possèdent les nouvelles actions attributaires, vous pouvez commencer à utiliser l'attribut `link` dans vos éléments de table.

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

Lors de l'utilisation de `DynamoDB Mapper` et `AttributeEncryptor`, par défaut, tous les attributs sont chiffrés et signés à l'exception des clés primaires, qui sont signées mais pas chiffrées. Pour spécifier une action de signature uniquement, utilisez l'annotation `@DoNotEncrypt`. 

Cet exemple utilise l'annotation `@DoNotEncrypt` du nouvel attribut `link`.

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

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

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

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

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

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

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

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

 Dans le chiffreur DynamoDB de niveau inférieur, vous devez définir des actions pour chaque attribut. Cet exemple utilise une instruction switch où la valeur par défaut est `encryptAndSign` et des exceptions sont spécifiées pour la clé de partition, la clé de tri et le nouvel attribut `link`. Dans cet exemple, si le code d'attribut de lien n'était pas entièrement déployé avant son utilisation, l'attribut de lien serait chiffré et signé par certaines applications, mais seulement signé par d'autres.

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

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

Dans le client de chiffrement DynamoDB pour Python, vous pouvez définir une action par défaut pour tous les attributs, puis spécifier des exceptions. 

Si vous utilisez une [classe d'annotations clientes](python-using.md#python-helpers), vous n'avez pas besoin de spécifier une action d'attribut pour les attributs de clé primaire. Les classes d'annotations clients vous empêchent de chiffrer votre clé primaire. Toutefois, si vous n'utilisez pas de classes d'annotations clientes, vous devez définir l'action SIGN\$1ONLY sur votre clé de partition et la clé de tri. Si vous chiffrez accidentellement votre partition ou votre clé de tri, vous ne pourrez pas récupérer vos données sans une analyse complète de la table.

Cet exemple spécifie une exception pour le nouvel attribut `link`, qui obtient l'action `SIGN_ONLY`.

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

------

## Suppression d'un attribut
<a name="remove-attribute"></a>

Si vous n'avez plus besoin d'un attribut dans les éléments chiffrés avec le client de chiffrement DynamoDB, vous pouvez arrêter de l'utiliser. Toutefois, ne supprimez pas ou ne modifiez pas l'action de cet attribut. Si vous le faites, puis que vous rencontrez un élément avec cet attribut, la signature calculée pour l'élément ne correspondra pas à la signature d'origine et la validation de la signature échouera.

Bien que vous soyez tenté de supprimer toutes les traces de l'attribut de votre code, ajoutez un commentaire indiquant que l'élément n'est plus utilisé au lieu de le supprimer. Même si vous effectuez une analyse complète de table pour supprimer toutes les instances de l'attribut, un élément chiffré avec cet attribut peut être mis en cache ou en cours de traitement quelque part dans votre configuration.

# Résolution des problèmes liés à votre application cliente de chiffrement DynamoDB
<a name="troubleshooting"></a>

**Note**  
Notre bibliothèque de chiffrement côté client a été [renommée AWS Database Encryption SDK](DDBEC-rename.md). La rubrique suivante fournit des informations sur les versions 1. *x* —2. *x* du client de chiffrement DynamoDB pour Java et versions 1. *x* —3. *x* du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section [SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Cette section décrit les problèmes que vous pouvez rencontrer lors de l'utilisation du client de chiffrement DynamoDB et propose des suggestions pour les résoudre.

Pour fournir des commentaires sur le client de chiffrement DynamoDB, signalez un problème dans [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/)le référentiel or. [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/) GitHub 

Pour émettre des commentaires sur cette documentation, utilisez le lien des commentaires sur n'importe quelle page.

**Topics**
+ [Accès refusé](#kms-permissions)
+ [Échec de la vérification de la signature](#change-data-model)
+ [Problèmes liés aux anciennes versions des tables globales](#fix-global-tables)
+ [Mauvaise performance du fournisseur le plus récent](#mrp-ttl-delay)

## Accès refusé
<a name="kms-permissions"></a>

**Problème** : votre application se voit refuser l'accès à une ressource dont elle a besoin.

**Suggestion** : en savoir plus sur les autorisations requises et les ajouter au contexte de sécurité dans lequel votre application s'exécute.

**Détails**

Pour exécuter une application qui utilise la bibliothèque d'un client de chiffrement DynamoDB, l'appelant doit être autorisé à utiliser ses composants. Sinon, l'accès aux éléments requis lui est refusé. 
+ Le client de chiffrement DynamoDB ne nécessite pas de compte Amazon Web Services AWS() et ne dépend d'aucun service. AWS Toutefois, si votre application l'utilise AWS, vous avez besoin [d'un Compte AWS](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) et d'[utilisateurs autorisés](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html) à utiliser le compte.
+ Le client de chiffrement DynamoDB n'a pas besoin d'Amazon DynamoDB. Toutefois, si l'application qui utilise le client crée des tables DynamoDB, place des éléments dans une table ou extrait des éléments d'une table, l'appelant doit être autorisé à utiliser les opérations DynamoDB requises dans votre. Compte AWS Pour plus de détails, consultez les [rubriques relatives au contrôle d'accès](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html) dans le guide du *développeur Amazon DynamoDB*.
+ Si votre application utilise une [classe d'assistance client](python-using.md#python-helpers) dans le client de chiffrement DynamoDB pour Python, l'appelant doit être autorisé à appeler l'opération DynamoDB. [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)
+ Le client de chiffrement DynamoDB n'a pas AWS Key Management Service besoin de ().AWS KMS Toutefois, si votre application utilise un [fournisseur de matériel KMS direct](direct-kms-provider.md), ou si elle utilise un [fournisseur le plus récent](most-recent-provider.md) avec un magasin de fournisseurs qui l'utilise AWS KMS, l'appelant doit être autorisé à utiliser les opérations AWS KMS [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)et à [déchiffrer](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html).

## Échec de la vérification de la signature
<a name="change-data-model"></a>

**Problème** : un élément ne peut pas être déchiffré en raison de l'échec de la vérification de la signature. L'élément peut aussi ne pas avoir été chiffré et signé comme vous l'escomptez.

**Suggestion** : vérifiez que les actions d'attribut que vous fournissez représentent tous les attributs de l'élément. Lors du déchiffrement d'un élément, veillez à fournir les actions d'attribut qui correspondent aux actions utilisées pour chiffrer l'élément.

**Détails**

Les [actions d'attribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) que vous fournissez indiquent au client de chiffrement DynamoDB les attributs à chiffrer et à signer, les attributs à signer (mais pas à chiffrer) et ceux à ignorer. 

Si les actions d'attribut que vous spécifiez ne rendent pas compte de tous les attributs de l'élément, l'élément peut ne pas être chiffré et signé comme vous l'escomptiez. Si les actions d'attribut que vous fournissez lors du déchiffrement d'un élément diffèrent des actions d'attribut que vous avez fournies lors du chiffrement de l'élément, la vérification de la signature peut échouer. Il s'agit d'un problème particulier pour les applications distribuées dans lesquelles les nouvelles actions d'attribut peuvent ne pas avoir été propagées sur tous les hôtes.

Les erreurs de validation de signature sont difficiles à résoudre. Pour vous aider à les prévenir, prenez des précautions supplémentaires lorsque vous modifiez votre modèle de données. Pour en savoir plus, consultez [Modification de votre modèle de données](data-model.md).

## Problèmes liés aux anciennes versions des tables globales
<a name="fix-global-tables"></a>

**Problème** : les éléments d'une ancienne version de la table globale Amazon DynamoDB ne peuvent pas être déchiffrés car la vérification des signatures échoue.

**Suggestion** : définissez des actions d'attribut afin que les champs de réplication réservés ne soient ni chiffrés ni signés.

**Détails**

Vous pouvez utiliser le client de chiffrement DynamoDB avec les tables globales [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html). Nous vous recommandons d'utiliser des tables globales avec une [clé KMS multirégionale et de répliquer la clé](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) KMS dans tous les Régions AWS endroits où la table globale est répliquée.

À partir de la [version 2019.11.21](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html) des tables globales, vous pouvez utiliser des tables globales avec le client de chiffrement DynamoDB sans configuration particulière. Toutefois, si vous utilisez des tables globales [version 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html), vous devez vous assurer que les champs de réplication réservés ne sont ni chiffrés ni signés.

[Si vous utilisez la version 2017.11.29 des tables globales, vous devez définir les actions d'attribut pour les attributs suivants `DO_NOTHING` en [Java ou en `@DoNotTouch` Python](java-using.md#attribute-actions-java).](python-using.md#python-attribute-actions)
+ `aws:rep:deleting`
+ `aws:rep:updatetime`
+ `aws:rep:updateregion`

Si vous utilisez une autre version des tables globales, aucune action n'est requise.

## Mauvaise performance du fournisseur le plus récent
<a name="mrp-ttl-delay"></a>

**Problème** : votre application est moins réactive, en particulier après la mise à jour vers une version plus récente du client de chiffrement DynamoDB.

**Suggestion** : ajustez la time-to-live valeur et la taille du cache.

**Détails**

Le fournisseur le plus récent est conçu pour améliorer les performances des applications qui utilisent le client de chiffrement DynamoDB en autorisant une réutilisation limitée du matériel cryptographique. Lorsque vous configurez le fournisseur le plus récent pour votre application, vous devez trouver un équilibre entre l'amélioration des performances et les problèmes de sécurité liés à la mise en cache et à la réutilisation. 

Dans les nouvelles versions du client de chiffrement DynamoDB, la valeur (TTL) détermine time-to-live la durée pendant laquelle les fournisseurs de matériel cryptographique mis en cache () peuvent être utilisés. CMPs Le TTL détermine également la fréquence à laquelle le fournisseur le plus récent vérifie la présence d'une nouvelle version du CMP. 

Si votre TTL est trop long, votre application peut enfreindre vos règles commerciales ou vos normes de sécurité. Si votre TTL est trop court, des appels fréquents au magasin du fournisseur peuvent entraîner le ralentissement des demandes provenant de votre application et d'autres applications partageant votre compte de service. Pour résoudre ce problème, ajustez le TTL et la taille du cache à une valeur correspondant à vos objectifs de latence et de disponibilité et conforme à vos normes de sécurité. Pour en savoir plus, consultez [Définition d'une time-to-live valeur](most-recent-provider.md#most-recent-provider-ttl).