Concepts relatifs au chiffrement AEAD en SQL standard

Cet article explique les concepts relatifs au chiffrement AEAD dans BigQuery. Pour obtenir une description des différentes fonctions de chiffrement AEAD compatibles avec BigQuery, reportez-vous à la page Fonctions de chiffrement AEAD.

Objectif du chiffrement AEAD

BigQuery protège vos données en utilisant le chiffrement au repos. BigQuery accepte également les clés de chiffrement gérées par le client (CMEK), ce qui vous permet de chiffrer des tables à l'aide de clés de chiffrement spécifiques. Toutefois, dans certains cas, le chiffrement de valeurs individuelles dans un tableau est préférable.

Par exemple, vous souhaitez conserver les données de tous vos clients dans une même table et chiffrer chacune des données de vos clients à l'aide d'une clé différente. Vous disposez de données réparties sur plusieurs tables que vous souhaitez pouvoir "crypto-supprimer". La crypto-suppression, ou "crypto-shredding" en anglais, consiste à supprimer une clé de chiffrement afin de rendre illisibles les données chiffrées à l'aide de cette clé.

Les fonctions de chiffrement AEAD vous permettent de créer des collections de clés de chiffrement et de déchiffrement, d'utiliser ces clés pour chiffrer et déchiffrer les valeurs individuelles d'une table, et d'alterner les clés d'une collection de clés.

Collections de clés

Une collection de clés est un ensemble de clés cryptographiques, dont l'une est la clé cryptographique principale et les autres, le cas échéant, sont des clés cryptographiques secondaires. Chaque clé encode un algorithme de chiffrement ou de déchiffrement, l'état de la clé (activée, désactivée ou détruite) et, dans le cas des clés non détruites, les octets de clé eux-mêmes. La clé cryptographique principale détermine comment chiffrer le texte brut d'entrée. Elle ne peut jamais être désactivée. Les clés cryptographiques secondaires ne servent qu'au déchiffrement, et peuvent être activées ou désactivées. Une collection de clés peut être utilisée pour déchiffrer toutes les données qu'elle a chiffrées.

Une collection de clés dans BigQuery se présente sous la forme d'un tampon de protocole google.crypto.tink.Keyset sérialisé en BYTES.

Exemple

Voici un exemple de collection de clés AEAD comprenant trois clés et représentée par une chaîne JSON.

primary_key_id: 569259624
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: ",&\264kh\377\306\217\371\233E<\0350A4\023B-pd\203\277\240\371\212^\210bf\347\256"
    key_material_type: SYMMETRIC
  }
  status: ENABLED
  key_id: 569259624
  output_prefix_type: TINK
}
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: "\374\336+.\333\245k\364\010`\037\267!\376\233\\3\215\020\356B\236\240O\256U\021\266\217\277\217\271"
    key_material_type: SYMMETRIC
  }
  status: DISABLED
  key_id: 852264701
  output_prefix_type: TINK
}
key {
  status: DESTROYED
  key_id: 237910588
  output_prefix_type: TINK
}

Dans l'exemple ci-dessus, la clé cryptographique principale est la première clé répertoriée dans la chaîne JSON. Son ID est 569259624. Il existe deux clés cryptographiques secondaires : l'une est activée et présente l'ID 852264701, tandis que l'autre est détruite et présente l'ID 237910588. Lorsqu'une fonction de chiffrement AEAD utilise cette collection de clés pour le chiffrement, le texte chiffré obtenu encode l'ID de la clé cryptographique principale (569259624).

Lorsqu'une fonction AEAD utilise cette collection de clés pour le déchiffrement, elle choisit la clé appropriée pour le déchiffrement en fonction de l'ID de clé encodé dans le texte chiffré. Dans l'exemple ci-dessus, une tentative de déchiffrement à l'aide des ID de clé 852264701 ou 237910588 entraînerait une erreur, car l'ID 852264701 est désactivé et l'ID 237910588 est détruit. Si l'ID de clé 852264701 était réactivé, il pourrait être déchiffré.

Le type de clé détermine le mode de chiffrement à utiliser avec cette clé.

Le chiffrement répété de texte brut à l'aide de la même collection de clés renvoie généralement différentes valeurs chiffrées en raison de différents vecteurs d'initialisation, sélectionnés à l'aide du générateur de nombres pseudo-aléatoires fourni par OpenSSL.

Norme AES (Advanced Encryption Standard)

Les fonctions de chiffrement AEAD utilisent le chiffrement AES (Advanced Encryption Standard). Son entrée consiste en du texte brut et une clé de chiffrement, et elle renvoie une séquence d'octets chiffrés en sortie. Cette séquence d'octets peut ensuite être déchiffrée à l'aide de la même clé que celle qui a été utilisée pour le chiffrement. AES utilise une taille de bloc de 16 octets, ce qui signifie que le texte brut est traité comme une séquence de blocs de 16 octets. Le texte chiffré contient un préfixe spécifique à Tink indiquant la clé utilisée pour effectuer le chiffrement. Le chiffrement AES accepte plusieurs modes de chiffrement par blocs.

Modes de chiffrement par blocs

Les deux modes de chiffrement par blocs acceptés par les fonctions de chiffrement AEAD sont GCM et CBC.

GCM

Le mode GCM (Galois/Counter Mode) est un mode de chiffrement AES. La fonction numérote les blocs de manière séquentielle, puis associe le numéro de bloc à un vecteur d'initialisation (IV). Un vecteur d'initialisation est une valeur aléatoire ou pseudo-aléatoire qui constitue la base de la randomisation des données en texte brut. La fonction chiffre ensuite le numéro de bloc combiné à l'IV à l’aide de l’AES. Puis, la fonction effectue une opération logique exclusive au bit ou (XOR) sur le résultat du chiffrement et le texte brut pour produire le texte chiffré. Le mode GCM utilise une clé cryptographique de 128 ou 256 bits.

Mode CBC

Le mode CBC "enchaîne" les blocs en effectuant une opération XOR pour chaque bloc de texte brut avec le bloc de texte chiffré précédent avant le chiffrement. Le mode CBC utilise une clé cryptographique de 128, 192 ou 256 bits. Il utilise également un vecteur d'initialisation de 16 octets comme bloc initial et effectue une opération XOR pour ce bloc avec le premier bloc de texte brut.

Données supplémentaires

Les fonctions de chiffrement AEAD acceptent l'utilisation d'un argument additional_data, également appelé données associées (AD) ou données authentifiées supplémentaires. Contrairement à la collection de clés, ces données supplémentaires elles-mêmes ne permettent pas le déchiffrement du texte chiffré obtenu. Elles garantissent l'authenticité et l'intégrité des données chiffrées, mais pas leur confidentialité.

Par exemple, additional_data pourrait constituer la sortie de CAST(customer_id AS STRING) lors du chiffrement des données pour un client particulier. Cela garantit que les données déchiffrées ont été chiffrées à l'aide de l'identifiant customer_id attendu. La même valeur additional_data est requise pour le déchiffrement. Pour en savoir plus, consultez la RFC 5116.

Déchiffrement

La sortie de AEAD.ENCRYPT est une valeur BYTES chiffrée. Les fonctions AEAD.DECRYPT_STRING ou AEAD.DECRYPT_BYTES peuvent déchiffrer ce texte chiffré. Ces fonctions doivent utiliser une collection de clés contenant la clé qui a été utilisée pour le chiffrement, dont l'état doit être 'ENABLED' (activé). Elles doivent également utiliser les mêmes données additional_data que celles utilisées pour le chiffrement.

Lorsque la collection de clés est utilisée pour le déchiffrement, la clé appropriée est choisie en fonction de l'ID de clé encodé dans le texte chiffré.

La sortie de AEAD.DECRYPT_STRING est une valeur STRING en texte brut, tandis que la sortie de AEAD.DECRYPT_BYTES est une valeur BYTES en texte brut. AEAD.DECRYPT_STRING peut déchiffrer le texte chiffré qui encode une valeur STRING, tandis que AEAD.DECRYPT_BYTES peut déchiffrer le texte chiffré qui encode une valeur BYTES. L'utilisation de l'une de ces fonctions pour déchiffrer un texte chiffré qui encode un type de données incorrect, par exemple l'utilisation de AEAD.DECRYPT_STRING pour déchiffrer un texte chiffré qui encode une valeur BYTES, perturbe son comportement et peut entraîner une erreur.

Rotation des clés

La rotation des clés de chiffrement a pour objectif principal de réduire la quantité des données chiffrées à l'aide d'une clé spécifique. Ainsi, une clé potentiellement compromise permettrait à un pirate d'accéder à une quantité de données moindre.

La rotation d'une collection de clés implique les actions suivantes :

  1. Créer une nouvelle clé cryptographique principale dans chaque collection de clés
  2. Déchiffrer toutes les données chiffrées et les chiffrer à nouveau

La fonction KEYS.ROTATE_KEYSET réalise la première étape en ajoutant une nouvelle clé cryptographique principale à une collection de clés et en remplaçant l'ancienne clé cryptographique principale par une clé cryptographique secondaire.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Besoin d'aide ? Consultez notre page d'assistance.