View a markdown version of this page

Balises - AWS SDK de chiffrement de base de données

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.

Balises

Notre bibliothèque de chiffrement côté client a été renommée SDK de chiffrement de AWS base de données. Ce guide du développeur fournit toujours des informations sur le client de chiffrement DynamoDB.

Une balise est une balise HMAC ( Hash-Based Message Authentication Code) tronquée qui associe une valeur de champ en texte brut à un identifiant chiffré et consultable stocké à côté des données cryptées de votre base de données. La balise ne modifie pas l'état chiffré du champ. Lorsque vous écrivez une valeur dans un champ configuré pour le chiffrement consultable, le SDK AWS Database Encryption calcule un HMAC sur la valeur en texte brut et déduit la balise dans le contexte d'une partition. Le HMAC complet correspond de manière unique à la valeur en texte brut, mais le SDK tronque intentionnellement la sortie afin que plusieurs valeurs de texte clair distinctes puissent être mappées à la même balise. Ces collisions (faux positifs) limitent la capacité d'un utilisateur non autorisé à déduire des informations distinctives sur le texte en clair sous-jacent.

Note

Un code d'authentification de Hash-based message (HMAC) est une fonction de hachage cryptographique à clé couramment utilisée pour garantir intégrité et authenticité. Dans les systèmes de chiffrement consultables, le HMAC est souvent utilisé pour dériver des balises de manière déterministe à partir de valeurs en texte brut afin de les indexer et de les interroger.

Un HMAC complet est déterministe : pour une clé donnée, la même valeur en texte brut produit toujours la même balise. Ce déterminisme se traduit par un mappage biunivoque entre les valeurs en texte clair et les balises, préservant ainsi la distribution de fréquence d'origine des données. Tous les enregistrements qui partagent la même valeur en texte brut correspondent à la même balise et forment donc une classe d'équivalence. La taille de chaque classe d'équivalence reflète directement la fréquence à laquelle la valeur en texte brut correspondante apparaît dans l'ensemble de données.

Cette préservation des fréquences permet des attaques par analyse de fréquence, dans lesquelles un observateur déduit des valeurs probables en texte clair en corrélant les fréquences des balises observées avec les distributions de données connues ou attendues.

Pour atténuer les attaques par analyse de fréquence, le SDK génère des balises en utilisant la troncature et le partitionnement. La troncation du HMAC introduit des collisions contrôlées, de sorte que tous les enregistrements d'une classe d'équivalence ne partagent pas nécessairement la même valeur de balise. En outre, l'incorporation d'un identifiant de partition dans la dérivation des balises permet de mapper des valeurs identiques en texte brut à différentes balises d'une partition à l'autre. Ensemble, ces techniques favorisent un plus grand caractère aléatoire pour les ensembles de données répartis de manière inégale tout en préservant le comportement correct et efficace des requêtes.

Les balises ne peuvent être créées qu'à partir de champs marqués ou SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT dans ENCRYPT_AND_SIGN le SIGN_ONLY cadre de vos actions cryptographiques. La balise elle-même n'est ni signée ni cryptée. Vous ne pouvez pas créer une balise avec des champs marquésDO_NOTHING.

Après avoir configuré vos balises, vous devez configurer un index secondaire pour chaque balise avant de pouvoir effectuer une recherche dans les champs chiffrés. Pour de plus amples informations, veuillez consulter Configuration des index secondaires avec des balises.

Comprendre la dérivation des balises entre les partitions

Le partitionnement est un élément essentiel de la configuration des balises et s'applique à toutes les balises, y compris celles qui utilisent une seule partition. Ce modèle garantit une dérivation de balises cohérente et compatible avec l'avenir pour toutes les données, et vous permet d'augmenter le nombre de partitions au fil du temps en fonction de l'évolution du volume ou de la distribution des données. Vous pouvez ainsi réduire les fuites de fréquence et renforcer les protections contre les ensembles de données répartis de manière inégale sans réécrire les éléments existants.

Les partitions introduisent un caractère aléatoire contrôlé en répartissant les éléments entre plusieurs groupes logiques. Cela réduit les fuites de fréquence, limite la taille des classes d'équivalence des balises et améliore la sécurité et la confidentialité des attributs dont les distributions sont asymétriques.

Lorsqu'un élément est attribué à une partition, le numéro de partition est intégré à la dérivation des balises. Au sein d'une même partition, des valeurs de texte brut identiques produisent la même balise, préservant ainsi la sémantique de recherche d'égalité. Sur différentes partitions, la même valeur en texte brut produit des valeurs de balise différentes. Cela divise les grandes classes d'équivalence en groupes plus petits par partition et contribue à aplatir la distribution de fréquence globale des balises.

Vous avez un contrôle total sur la manière dont chaque élément de base de données est attribué à une partition. Les éléments peuvent être placés dans des partitions spécifiques de manière déterministe, ou ils peuvent être distribués de manière aléatoire pour atténuer les distributions inégales des données. L'assignation aléatoire est particulièrement utile pour les valeurs à haute fréquence, car elle répartit ces valeurs sur plusieurs partitions et réduit la concentration visible dans chaque partition. L'assignation déterministe peut être utilisée lorsque la connaissance du domaine indique que certaines valeurs doivent être limitées à un plus petit nombre de partitions.

L'identifiant de partition n'est pas exposé dans l'enregistrement crypté. Au lieu de cela, le numéro de partition est intégré au processus de dérivation de la balise, haché avec la valeur en texte clair, de sorte qu'il ne peut pas être déduit en examinant les données cryptées ou la balise elle-même. Cette conception garantit que les assignations de partitions restent confidentielles tout en offrant les avantages de distribution et de confidentialité des balises partitionnées.

Impact du partitionnement sur les requêtes

Le partitionnement influe sur la manière dont Query les opérations sont effectuées. Étant donné que les requêtes DynamoDB nécessitent une correspondance exacte avec la valeur de balise indexée et que les valeurs de balise diffèrent d'une partition à l'autre, l'appelant doit interroger chaque partition indépendamment. Si une table comporte N des partitions :

  • La récupération de tous les éléments correspondants nécessite des requêtes N distinctes.

  • Seul Query est concerné.

  • Scanet les Get opérations se comportent comme avant.

La raison en est structurelle : Scan lit tous les éléments et Get agit sur une clé spécifique ; Query cela dépend uniquement de l'égalité exacte de l'index, qui devient spécifique à la partition.

Note

Fan-out fait référence au nombre de requêtes DynamoDB qui doivent être émises pour satisfaire une seule demande logique lors de l'utilisation de balises partitionnées. Le système fournit un ventilateur limité, ce qui signifie que le nombre maximum de requêtes au niveau des partitions est fixe et prévisible en fonction du nombre de partitions configuré.

Considérations relatives aux performances

L'utilisation de partitions influe sur le nombre de requêtes DynamoDB requises par requête logique. L'impact sur les performances dépend de la taille du résultat attendu :

  • Ensembles de résultats volumineux : lorsque les requêtes renvoient de nombreuses pages, les requêtes supplémentaires au niveau de la partition n'entraînent que peu de frais supplémentaires.

  • Single-item recherches : si une demande renvoie normalement un élément et que cinq partitions sont configurées, cinq requêtes sont émises (quatre ne renvoyant aucun résultat), ce qui entraîne un ralentissement quasi linéaire.

  • Localité réduite : les objets peuvent être répartis entre les partitions, ce qui augmente le temps de récupération.

Comme chaque partition déclenche une requête supplémentaire, le fan-out est un facteur important dans la planification des performances et de la capacité.

Avantages en termes de performances

Malgré la surcharge de requêtes supplémentaire, les partitions peuvent améliorer les performances dans certains scénarios :

  • Réduction des grandes classes d'équivalence : lorsqu'une valeur rare partage une balise tronquée avec une valeur fréquente, les requêtes portant sur la valeur rare doivent traiter de nombreuses correspondances non pertinentes. Le partitionnement limite la taille de chaque classe d'équivalence et réduit cette surcharge.

  • Prise en charge de longueurs de balise plus longues : la configuration d'un plus grand nombre de partitions peut permettre d'utiliser des balises de plus grande longueur, ce qui réduit le taux de faux positifs et le niveau de filtrage requis après le déchiffrement.

Types de balises

Le type de balise que vous configurez détermine le type de requêtes que vous pouvez effectuer. Il existe deux types de balises qui prennent en charge le chiffrement consultable. Les balises standard effectuent des recherches d'égalité. Les balises composées combinent des chaînes de texte en clair littérales et des balises standard pour effectuer des opérations de base de données complexes.

Balises standard

Les balises standard constituent le moyen le plus simple d'implémenter un chiffrement consultable dans votre base de données. Ils ne peuvent effectuer des recherches d'égalité que pour un seul champ crypté ou virtuel. Pour savoir comment configurer les balises standard, consultez la section Configuration des balises standard. Vous pouvez également utiliser des partitions dotées de balises pour favoriser le caractère aléatoire lorsque les données sous-jacentes présentent une distribution inégale.

Les concepts suivants sont importants pour les balises standard.

Source de balise

Le champ à partir duquel une balise standard est construite est appelé source de balise. Il identifie l'emplacement des données que la balise doit cartographier. La source de la balise peut être un champ crypté ou un champ virtuel. La source de balise de chaque balise standard doit être unique. Vous ne pouvez pas configurer deux balises avec la même source de balise.

Les balises standard peuvent être utilisées pour effectuer des recherches d'égalité pour un champ crypté ou virtuel. Ils peuvent également être utilisés pour créer des balises composées afin d'effectuer des opérations de base de données plus complexes. Pour vous aider à organiser et à gérer les balises standard, le SDK AWS de chiffrement de base de données fournit les styles de balises facultatifs suivants qui définissent l'utilisation prévue d'une balise standard. Pour plus d'informations, voir Définition des styles de balises.

Vous pouvez créer une balise standard qui effectue des recherches d'égalité pour un seul champ crypté, ou vous pouvez créer une balise standard qui effectue des recherches d'égalité sur la concaténation de plusieurs SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT champs ENCRYPT_AND_SIGNSIGN_ONLY, et en créant un champ virtuel.

Champs virtuels

Un champ virtuel est un champ conceptuel construit à partir d'un ou de plusieurs champs sources. La création d'un champ virtuel n'entraîne pas l'inscription d'un nouveau champ dans votre enregistrement. Le champ virtuel n'est pas explicitement stocké dans votre base de données. Il est utilisé dans une configuration de balise standard pour donner à la balise des instructions sur la façon d'identifier un segment spécifique d'un champ ou de concaténer plusieurs champs dans un enregistrement pour effectuer une requête spécifique. Un champ virtuel nécessite au moins un champ crypté.

Note

L'exemple suivant montre les types de transformations et de requêtes que vous pouvez effectuer avec un champ virtuel. En application, les champs d'exemple utilisés dans cet exemple peuvent ne pas respecter les recommandations d'unicité de distribution et de corrélation pour les balises.

Par exemple, si vous souhaitez effectuer des recherches d'égalité sur la concaténation de LastName champs FirstName et, vous pouvez créer l'un des champs virtuels suivants.

  • Un NameTag champ virtuel, construit à partir de la première lettre du FirstName champ, suivie du LastName champ, le tout en minuscules. Ce champ virtuel vous permet d'effectuer des requêtesNameTag=mjones.

  • Un LastFirst champ virtuel, qui est construit à partir du LastName champ, suivi du FirstName champ. Ce champ virtuel vous permet d'effectuer des requêtesLastFirst=JonesMary.

Ou, si vous souhaitez effectuer des recherches d'égalité sur un segment spécifique d'un champ chiffré, créez un champ virtuel qui identifie le segment que vous souhaitez interroger.

Par exemple, si vous souhaitez interroger un IPAddress champ chiffré à l'aide des trois premiers segments de l'adresse IP, créez le champ virtuel suivant.

  • Un IPSegment champ virtuel, construit à partir deSegments(‘.’, 0, 3). Ce champ virtuel vous permet d'effectuer des requêtesIPSegment=192.0.2. La requête renvoie tous les enregistrements dont IPAddress la valeur commence par « 192.0.2 ».

Les champs virtuels doivent être uniques. Il est impossible de créer deux champs virtuels à partir des mêmes champs sources.

Pour obtenir de l'aide sur la configuration des champs virtuels et des balises qui les utilisent, consultez la section Création d'un champ virtuel.

Balises composées

Les balises composées créent des index qui améliorent les performances des requêtes et vous permettent d'effectuer des opérations de base de données plus complexes. Vous pouvez utiliser des balises composées pour combiner des chaînes de texte brut littérales et des balises standard pour effectuer des requêtes complexes sur des enregistrements chiffrés, telles que l'interrogation de deux types d'enregistrements différents à partir d'un seul index ou l'interrogation d'une combinaison de champs à l'aide d'une clé de tri. Pour d'autres exemples de solutions de balises composées, voir Choisir un type de balise.

Les balises composées peuvent être construites à partir de balises standard ou d'une combinaison de balises standard et de champs signés. Ils sont construits à partir d'une liste de pièces. Toutes les balises composées doivent inclure une liste de parties cryptées identifiant les ENCRYPT_AND_SIGN champs inclus dans la balise. Chaque ENCRYPT_AND_SIGN champ doit être identifié par une balise standard. Les balises composées plus complexes peuvent également inclure une liste de parties signées identifiant le texte en clair SIGN_ONLY ou SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT les champs inclus dans la balise, et une liste de pièces de constructeur identifiant toutes les manières possibles dont la balise composée peut assembler les champs.

Note

Le SDK AWS Database Encryption prend également en charge les balises signées qui peuvent être entièrement configurées à partir de texte brut SIGN_ONLY et de champs. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT Les balises signées sont un type de balise composée qui indexe et exécute des requêtes complexes sur des champs signés, mais non chiffrés. Pour de plus amples informations, veuillez consulter Création de balises signées.

Pour obtenir de l'aide sur la configuration des balises composées, consultez la section Configuration des balises composées.

La façon dont vous configurez votre balise composée détermine les types de requêtes qu'elle peut effectuer. Par exemple, vous pouvez rendre certaines parties cryptées et signées facultatives pour permettre une plus grande flexibilité dans vos requêtes. Pour plus d'informations sur les types de requêtes que les balises composées peuvent effectuer, consultezInterrogation de balises.