Catégories :

Fonctions de chiffrement

ENCRYPT

Chiffre une valeur VARCHAR ou BINARY à l’aide d’une phrase secrète VARCHAR.

Voir aussi :

ENCRYPT_RAW , DECRYPT

Syntaxe

ENCRYPT( <value_to_encrypt> , <passphrase> ,
         [ [ <additional_authenticated_data> , ] <encryption_method> ]
       )

Arguments

Obligatoire :

valeur_à_chiffrer

La valeur VARCHAR ou BINARY à chiffrer.

phrase_secrète

La phrase secrète à utiliser pour chiffrer/déchiffrer les données. La phrase secrète est toujours une VARCHAR, que la valeur_à_chiffrer soit une VARCHAR ou BINARY.

Facultatif :

données_authentifiées_supplémentaires

Les données authentifiées supplémentaires (AAD) sont des données supplémentaires dont la confidentialité et l’authenticité sont assurées pendant le processus de déchiffrement. Cependant, cet AAD n’est pas chiffré et n’est pas inclus en tant que champ dans la valeur renvoyée par la fonction ENCRYPT ou ENCRYPT_RAW.

Si AAD est transmis à la fonction de chiffrement (ENCRYPT ou ENCRYPT_RAW), alors le même AAD doit être transmis à la fonction de déchiffrement (DECRYPT ou DECRYPT_RAW). Si l’AAD transmis à la fonction de déchiffrement ne correspond pas à l’AAD transmis à la fonction de chiffrement, le déchiffrement échoue.

La différence entre l’AAD et la phrase_secrète est que la phrase secrète est destinée à être gardée secrète (sinon, le chiffrement est essentiellement sans valeur) tandis que l’AAD peut être laissé public. L’AAD permet d’authentifier qu’une information publique et une valeur chiffrée sont associées l’une à l’autre. La section d’exemples de la fonction ENCRYPT inclut un exemple montrant le comportement lorsque l’AAD correspond et le comportement lorsqu’il ne correspond pas.

Pour ENCRYPT_RAW et DECRYPT_RAW, le type de données d’AAD doit être BINARY. Pour ENCRYPT et DECRYPT, le type de données d’AAD peut être VARCHAR ou BINARY, et n’a pas besoin de correspondre au type de données de la valeur qui a été chiffrée.

AAD est pris en charge uniquement par les modes de chiffrement activés par AEAD comme GCM (par défaut).

méthode_chiffrement

Cette chaîne spécifie la méthode à utiliser pour chiffrer/déchiffrer les données. Cette chaîne contient des sous-champs :

<algorithm>-<mode> [ /pad: <padding> ]

L” algorithm est actuellement limité à :

  • 'AES' : lorsqu’une phrase secrète est transmise (par exemple à ENCRYPT), la fonction utilise le chiffrement AES-256 (256 bits). Lorsqu’une clé est transmise (par exemple à ENCRYPT_RAW), la fonction utilise un chiffrement de 128, 192 ou 256 bits, en fonction de la longueur de la clé.

L” algorithm est insensible à la casse.

The mode specifies which block cipher mode should be used to encrypt messages. The following table shows which modes are supported, and which of those modes support padding:

Mode

Padding

Description

'ECB'

Yes

Chiffrez chaque bloc individuellement avec la clé. Ce mode est généralement déconseillé et n’est inclus que pour des raisons de compatibilité avec les implémentations externes.

'CBC'

Yes

Le bloc chiffré est XORed avec le bloc précédent.

'GCM'

No

Le mode Galois/compteur est un mode de chiffrement hautes performances activé par AEAD. AEAD assure en outre l’authenticité et la confidentialité des données chiffrées en générant une balise AEAD. De plus, AEAD prend en charge AAD (données authentifiées supplémentaires).

'CTR'

No

Mode compteur.

'OFB'

No

Retour de sortie. Le texte chiffré est XORed avec le texte brut d’un bloc.

'CFB'

No

Le retour de chiffrement est une combinaison de OFB et CBC.

Le mode est insensible à la casse.

Le padding spécifie comment remplir les messages dont la longueur n’est pas un multiple de la taille du bloc. Le remplissage est applicable uniquement pour les modes ECB et CBC ; le remplissage est ignoré pour les autres modes. Les valeurs possibles pour le remplissage sont les suivantes :

  • 'PKCS' : utilise PKCS5 pour le remplissage de bloc.

  • 'NONE' : pas de remplissage. L’utilisateur doit prendre soin du remplissage lors de l’utilisation du mode ECB ou CBC.

Le padding est insensible à la casse.

Paramètre par défaut : 'AES-GCM'.

Si le mode n’est pas spécifié, GCM est utilisé.

Si le padding n’est pas spécifié, PKCS est utilisé.

Renvoie

Le type de données de la valeur renvoyée est BINARY.

Bien qu’une seule valeur soit renvoyée, cette valeur contient deux ou trois champs concaténés :

  • Le premier champ est un vecteur d’initialisation (IV). Le IV est généré de manière aléatoire à l’aide d’un générateur de nombres aléatoires CTR-DRBG. Le chiffrement et le déchiffrement utilisent le IV.

  • Le deuxième champ est le texte chiffré (valeur chiffrée) de la valeur_à_chiffrer.

  • Si le mode de chiffrement est compatible avec AEAD, la valeur renvoyée contient également un troisième champ, qui est la balise AEAD.

Le IV et la taille de la balise dépendent du mode de chiffrement.

Notes sur l’utilisation

  • Pour déchiffrer les données chiffrées par ENCRYPT(), utilisez DECRYPT(). N’utilisez pas DECRYPT_RAW().

  • Pour déchiffrer les données chiffrées par ENCRYPT_RAW(), utilisez DECRYPT_RAW(). N’utilisez pas DECRYPT().

  • Les paramètres de la fonction sont masqués pour des raisons de sécurité. Les informations sensibles telles que les suivantes ne sont pas visibles dans le journal des requêtes et ne sont pas visibles par Snowflake :

    • Chaîne ou valeur binaire à chiffrer ou à déchiffrer.

    • La phrase secrète ou la clé.

  • Les fonctions utilisent une bibliothèque cryptographique compatible FIPS pour effectuer efficacement le chiffrement et le déchiffrement.

  • La phrase secrète ou la clé utilisée pour déchiffrer une donnée doit être la même que la phrase secrète ou la clé utilisée pour chiffrer ces données.

  • La phrase secrète peut être de longueur arbitraire, même 0 (la chaîne vide). Cependant, Snowflake recommande fortement d’utiliser une phrase secrète d’au moins 8 octets.

  • Snowflake recommande que la phrase secrète respecte les meilleures pratiques générales pour les mots de passe, comme l’utilisation d’un mélange de lettres majuscules, de lettres minuscules, de chiffres et de caractères de ponctuation.

  • La phrase secrète n’est pas utilisée directement pour chiffrer/déchiffrer l’entrée. Au lieu de cela, la phrase secrète est utilisée pour dériver une clé de chiffrement/déchiffrement, qui est toujours la même pour la même phrase secrète. Snowflake utilise la fonction de dérivation de clé PBKDF2 https://en.wikipedia.org/wiki/ avec un seed interne de Snowflake pour calculer la clé de chiffrement/déchiffrement à partir de la phrase secrète donnée.

    En raison de cette dérivation de clé, la fonction de chiffrement/déchiffrement ne peut pas être utilisée pour :

    • Déchiffrer les données chiffrées en externe.

    • Chiffrer les données qui seront déchiffrées en externe.

    Pour effectuer l’une ou l’autre de ces actions, utilisez ENCRYPT_RAW ou DECRYPT_RAW.

  • Étant donné que le vecteur d’initialisation est toujours régénéré de manière aléatoire, l’appel de ENCRYPT() avec les mêmes valeur_à_chiffrer et phrase secrète ne renvoie pas le même résultat à chaque fois. Si vous devez générer la même sortie pour les mêmes valeur_à_chiffrer et phrase secrète, pensez à utiliser ENCRYPT_RAW et à spécifier le vecteur d’initialisation.

Exemples

Cet exemple chiffre un VARCHAR avec une phrase secrète simple.

SELECT encrypt('Secret!', 'SamplePassphrase');

Le résultat est un texte qui n’est pas facile à lire pour les humains.

Le code ci-dessous montre un exemple simple de chiffrement et de déchiffrement :

SET passphrase='poiuqewjlkfsd';
SELECT
    TO_VARCHAR(
        DECRYPT(
            ENCRYPT('Patient tested positive for COVID-19', $passphrase),
            $passphrase),
        'utf-8')
        AS dcrypt
    ;
+--------------------------------------+
| DCRYPT                               |
|--------------------------------------|
| Patient tested positive for COVID-19 |
+--------------------------------------+

Cet exemple utilise une valeur BINARY pour la valeur_à_chiffrer et pour les données authentifiées.

SELECT encrypt(to_binary(hex_encode('Secret!')), 'SamplePassphrase', to_binary(hex_encode('Authenticated Data')));

La sortie est :

6E1361E297C22969345F978A45205E3E98EB872844E3A0F151713894C273FAEF50C365S

Cet exemple montre comment utiliser un mode alternatif (CBC) dans le cadre du spécificateur pour la méthode de chiffrement. Cette méthode de chiffrement spécifie également une règle de remplissage (PKCS). Dans cet exemple, le paramètre AAD est NULL.

SELECT encrypt(to_binary(hex_encode('secret!')), 'sample_passphrase', NULL, 'aes-cbc/pad:pkcs') as encrypted_data;

Cet exemple montre comment utiliser AAD :

SELECT
    TO_VARCHAR(
        DECRYPT(
            ENCRYPT('penicillin', $passphrase, 'John Dough AAD', 'aes-gcm'),
            $passphrase, 'John Dough AAD', 'aes-gcm'),
        'utf-8')
        AS medicine
    ;
+------------+
| MEDICINE   |
|------------|
| penicillin |
+------------+

Si vous transmettez le mauvais AAD, le déchiffrement échoue :

SELECT
    DECRYPT(
        ENCRYPT('penicillin', $passphrase, 'John Dough AAD', 'aes-gcm'),
        $passphrase, 'wrong patient AAD', 'aes-gcm') AS medicine
    ;
100311 (22023): Decryption failed. Check encrypted data, key, AAD, or AEAD tag.