Les données authentifiées supplémentaires (AAD, Additional Authenticated Data) sont des chaînes transmises à Cloud Key Management Service dans le cadre d'une requête de chiffrement ou de déchiffrement. Le contrôle AAD permet de vérifier l'intégrité et de protéger les données contre une attaque de type "confused deputy". La chaîne AAD ne doit pas dépasser 64 Kio.
Cloud KMS ne déchiffrera pas le texte chiffré à moins que la même valeur AAD ne soit utilisée à la fois pour le chiffrement et le déchiffrement.
La chaîne AAD est liée aux données chiffrées : vous ne pouvez pas déchiffrer le texte chiffré à moins de connaître la chaîne AAD. Cependant, celle-ci n'est pas stockée en tant que partie du texte chiffré. La chaîne AAD n'augmente pas non plus l'intensité de chiffrement du texte chiffré. Il s'agit plutôt d'une vérification supplémentaire réalisée par Cloud KMS pour authentifier une requête de déchiffrement.
Dans Cloud KMS, la chaîne AAD est toujours présente lorsque vous effectuez un appel de chiffrement ou de déchiffrement. Si vous n'indiquez pas de valeur AAD, une chaîne vide est utilisée. Si une chaîne vide est utilisée en tant que valeur AAD pour le chiffrement de texte brut, seule une chaîne vide permettra le déchiffrement du texte chiffré.
Les données de la chaîne AAD ne sont pas consignées par Cloud Audit Logging.
Quand utiliser une chaîne AAD ?
Vous pouvez par exemple utiliser une chaîne AAD lorsque votre application sert de proxy d'encapsulation/désencapsulation avec une seule clé et un nombre illimité de clients, chaque client se situant dans des limites de sécurité distinctes. Il peut s'agir d'une application qui permet de gérer un agenda privé. Lorsqu'un utilisateur a besoin d'afficher une entrée d'agenda privé, l'application peut utiliser le nom d'utilisateur unique en tant que chaîne AAD dans la demande de désencapsulation (déchiffrement) afin d'authentifier explicitement l'utilisateur. Dans ce scénario, vous pouvez vous servir d'une clé unique pour plusieurs utilisateurs (nombre illimité). L'avantage principal réside dans le fait que vous n'avez pas besoin de gérer l'état associé aux utilisateurs individuels.
Autre exemple : votre application doit utiliser des jetons de support contenant des informations privées, telles qu'une adresse e-mail. Les entrées correspondent aux données authentifiées utilisées pour obtenir un jeton de support, avec l'adresse e-mail en texte brut. Ces entrées sont chiffrées de sorte que le jeton de support échangé se présente sous la forme de données authentifiées chiffrées supplémentaires (AEAD).
Exemple d'attaque de type "confused deputy"
Cet exemple montre comment une application peut être amenée à déchiffrer un texte chiffré au profit d'un utilisateur malveillant. L'application est considérée comme le "confused deputy" dans cet exemple, parce qu'elle ne sait pas que l'attaquant a abusé de son autorité. Le résultat est que l'utilisateur malveillant est capable d'afficher des données déchiffrées qui étaient à l'origine chiffrées pour un autre destinataire. Notez que dans cette attaque, l'utilisateur malveillant n'a pas besoin de connaître la clé de chiffrement, car il compte sur le "confused deputy" pour effectuer le déchiffrement.
Une application permet aux utilisateurs de gérer un agenda privé. Chaque entrée d'agenda est chiffrée et destinée à être déchiffrée uniquement par l'utilisateur qui l'a créée.
Alice crée une entrée d'agenda. L'application chiffre l'entrée, puis stocke la version chiffrée à un emplacement réservé aux entrées d'agenda appartenant à Alice.
Alice envoie une demande pour afficher son entrée d'agenda. Étant donné que l'entrée d'agenda chiffrée se trouve à un emplacement réservé à Alice, l'application déchiffre les données et les renvoie en tant que réponse à la demande d'Alice. Il s'agit du comportement attendu de l'application.
Paul copie l'entrée d'agenda d'Alice depuis l'emplacement réservé à Alice vers un emplacement lui étant réservé.
Paul envoie une demande pour afficher sa copie de l'entrée d'agenda d'Alice. Étant donné que cette copie se trouve à un emplacement réservé à Paul, l'application déchiffre l'entrée d'agenda et renvoie le texte brut en réponse à la demande de Paul. Ce dernier peut ainsi afficher l'entrée d'agenda d'Alice. Cela ne correspond pas au comportement prévu de l'application.
Pour se protéger contre ce type d'attaque, l'application peut utiliser une chaîne AAD non vide pour le chiffrement et le déchiffrement. Cette chaîne assure une vérification supplémentaire des requêtes de déchiffrement. Lorsque Paul envoie la demande de déchiffrement afin d'afficher sa copie de l'entrée d'agenda d'Alice, sa requête n'aboutit pas, à moins que Paul puisse aussi amener l'application par la ruse à utiliser la chaîne AAD correcte.
Stocker ou reproduire une chaîne AAD
Avant de chiffrer des données avec une chaîne AAD, décidez si vous souhaitez stocker la chaîne aux côtés des données chiffrées ou la reproduire en vue d'un déchiffrement ultérieur.
Le stockage de la chaîne AAD simplifie son utilisation lorsque vous devez déchiffrer le texte chiffré. Par exemple, une ligne de base de données peut contenir à la fois le texte chiffré et la chaîne AAD utilisée lorsque le texte brut a été chiffré. Lorsqu'une demande de déchiffrement est reçue, l'application peut récupérer la chaîne AAD et le texte chiffré à partir de la base de données. L'application peut ensuite utiliser la chaîne AAD lors du processus de déchiffrement du texte chiffré.
La reproduction de la chaîne AAD permet de vérifier toutes les données non privées tout en évitant le stockage de la chaîne. Par exemple, si vous souhaitez vous assurer que le chemin d'accès et le nom d'un fichier chiffré n'ont pas changé, vous pouvez inclure le chemin d'accès et le nom en tant que chaîne AAD lorsque vous chiffrez le fichier. Ensuite, lorsqu'une demande de déchiffrement est envoyée pour le fichier, vous pouvez reproduire la chaîne AAD en examinant le chemin d'accès et le nom de fichier.
Stocker une chaîne AAD
Le stockage d'une chaîne AAD signifie que celle-ci est enregistrée, puis aisément accessible par votre application pour une utilisation future. Par exemple, un tableau de base de données peut contenir une colonne pour le texte chiffré et une colonne pour la chaîne AAD utilisée lors de la création du texte chiffré. Lorsqu'il est temps de déchiffrer le texte chiffré, l'application récupère la chaîne AAD et l'utilise pour le déchiffrement.
Prenons comme exemple une application d'agenda conçue pour afficher une entrée uniquement à l'utilisateur qui l'a créée. Lorsqu'une entrée d'agenda est créée, elle est chiffrée, puis enregistrée dans une base de données, dans la colonne ENCRYPTED_DIARY_ENTRY
. Pour chaque demande d'affichage d'une entrée d'agenda, l'application authentifie l'utilisateur et fournit ensuite l'entrée à l'utilisateur.
Supposons, par exemple, qu'aucune chaîne AAD n'est utilisée (autre que la chaîne vide par défaut) et que Paul a pu copier les données ENCRYPTED_DIARY_ENTRY
d'Alice dans ses données ENCRYPTED_DIARY_ENTRY
. Lorsque Paul envoie une demande de déchiffrement pour ses données ENCRYPTED_DIARY_ENTRY
(qui ont été copiées à partir des données d'Alice), l'application effectue le déchiffrement sans se rendre compte qu'elle a été trompée.
Paul est capable d'afficher l'entrée d'agenda d'Alice en texte brut.
Supposons maintenant que l'adresse e-mail de l'utilisateur sert de chaîne AAD lorsqu'une entrée d'agenda est chiffrée. Quand Alice crée une entrée d'agenda, l'application stocke son adresse e-mail non chiffrée dans la colonne EMAIL
à côté des données ENCRYPTED_DIARY_ENTRY
. Supposons que Paul a pu copier les données ENCRYPTED_DIARY_ENTRY
d'Alice dans ses données ENCRYPTED_DIARY_ENTRY
.
Lorsqu'il envoie une demande de déchiffrement, l'application extrait l'adresse e-mail de Paul de la colonne EMAIL
pour l'utiliser comme chaîne AAD pour la demande de déchiffrement.
L'adresse e-mail de Paul ne fonctionne pas en tant que chaîne AAD pour le déchiffrement, et l'application ne laisse pas Paul afficher l'entrée d'agenda d'Alice en texte brut.
Reproduire une chaîne AAD
La reproduction d'une chaîne AAD signifie que la chaîne n'est pas stockée, mais que vous pouvez la reproduire lors du déchiffrement.
Par exemple, vous pouvez utiliser un chemin d'accès et un nom de fichier en tant que chaîne AAD. Au cours du processus de chiffrement, supposons que le fichier chiffré est enregistré dans MY_PATH\MY_FILE1.enc
. Par conséquent, "MY_PATH\MY_FILE1.enc"
est utilisé comme chaîne AAD. Celle-ci n'est pas stockée. Lorsqu'une demande de déchiffrement est reçue, l'application reproduit la chaîne AAD en examinant le chemin d'accès et le nom du fichier à déchiffrer. Si le fichier chiffré n'a pas été déplacé vers un autre emplacement, "MY_PATH\MY_FILE1.enc"
sera utilisé comme chaîne AAD pour le déchiffrement. Comme il s'agit de la même chaîne que celle utilisée pour le chiffrement, l'opération de déchiffrement peut se poursuivre.
Si le fichier chiffré a été déplacé, par exemple vers SOME_OTHER_PATH\MY_FILE1.enc
, "SOME_OTHER_PATH\MY_FILE1.enc"
sera alors utilisé comme chaîne AAD pour le déchiffrement. Cette valeur AAD ne correspond pas à la valeur AAD utilisée pour le chiffrement. Par conséquent, l'opération de déchiffrement n'aboutit pas.