fonctions encrypt() et decrypt()

Les fonctions " encrypt() et " decrypt() cryptent ou décryptent une valeur varchar ou nvarchar à l'aide d'une clé fournie.

Le cryptage est le processus de transformation des données afin de préserver leur caractère secret ; les données ne peuvent être lues (non cryptées) que si le destinataire possède la clé requise. L'implémentation de Netezza Performance Server utilise un cryptage symétrique. Ce type de cryptage est également connu sous le nom de cryptage à clé privée ou secrète, car la même clé secrète est utilisée pour crypter et décrypter les données. Cela signifie que cette clé secrète doit être mise à la disposition de tout serveur qui décrypte des données précédemment cryptées. Vous pouvez choisir l'algorithme de cryptage symétrique utilisé par les fonctions pour crypter et décrypter les données : Advanced Encryption Standard (AES) ou RC4.

Le chiffrement par clé privée est plus sûr que le chiffrement par clé publique, car tous les systèmes de chiffrement par clé publique sont susceptibles de faire l'objet d'attaques de recherche de clés par force brute. Cependant, le chiffrement par clé privée dépend du maintien du secret de la clé. Par conséquent, il convient de modifier périodiquement la clé privée et de prendre des mesures pour s'assurer qu'elle ne peut pas être découverte lors de son utilisation, de son stockage ou de sa distribution. Pour les recommandations de sécurité spécifiques au produit Netezza Performance Server, voir la description de l'argument 'key plus loin dans la rubrique.

Les fonctions " encrypt() et " decrypt() effectuent le cryptage et le décryptage au niveau du champ, et non pas le cryptage et le décryptage de la base de données.

Important : si vous utilisez la fonction " encrypt() pour traiter des valeurs nvarchar en entrée, vous devez transférer vos applications et vos processus de requête pour utiliser les fonctions " encrypt_nvarchar() et " decrypt_nvarchar(). La fonction " encrypt() est conservée pour des raisons de compatibilité avec les versions et les résultats antérieurs, mais les tables et les vues qui stockent les valeurs de la fonction " encrypt('NVARCHAR') peuvent rencontrer des problèmes lors des chargements et des opérations de génération de statistiques.

Syntaxe

La fonction " encrypt() a la syntaxe suivante :
varchar = encrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm 
          [, varchar IV]]);
La fonction " decrypt() a la syntaxe suivante :
varchar = decrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = decrypt(nvarchar text, nvarchar key [, int algorithm
          [, varchar IV]]);

La valeur " text spécifie la valeur à crypter ou à décrypter.

La valeur " key indique la clé à utiliser pour crypter ou décrypter la valeur. Veillez à sécuriser la clé : dans le cas contraire, la sécurité est compromise. Lors de la conception de votre système de sécurité, gardez à l'esprit l'architecture du système Netezza Performance Server
  • Les fonctions SQL sont enregistrées dans le fichier " pg.log sur l'hôte Netezza Performance Server, de sorte que l'exécution d'une fonction " encrypt(secret_column, 'my_secret_key') révèle votre clé à quiconque peut lire le fichier " pg.log ".
  • Les conversations JDBC sont facilement capturées par un grand nombre d'outils de diagnostic ou de piratage. Si vous transmettez votre clé dans le cadre du SQL, la clé peut être compromise au cours de ce processus.
C'est pourquoi il convient de stocker la clé secrète dans un tableau et de la transmettre aux fonctions " encrypt() et " decrypt() par le biais d'une jointure de tableau. Voici un exemple :
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE 
b.key_id = 1;
La valeur " algorithm peut être soit RC4, soit l'une des versions d'AES, comme indiqué dans la liste suivante :
0
RC4. Il s'agit de la valeur par défaut.
1
AES 128.
2
AES 192.
3
AES 256.

RC4, bien qu'il soit l'algorithme de cryptage le plus répandu (utilisé, par exemple, par SSL et WEP), n'est pas sûr sur le plan cryptographique et est vulnérable aux attaques.

L'Advanced Encryption Standard (AES) est la norme de cryptage adoptée par le gouvernement des États-Unis et exigée pour toutes les informations classifiées. Les trois versions de l'AES ne diffèrent que par la conception et la force des longueurs de clés. Bien que les trois longueurs de clé soient suffisantes pour protéger les informations classifiées jusqu'au niveau SECRET, les informations TOP SECRET nécessitent l'utilisation de longueurs de clé de 192 ou 256.

La valeur " IV spécifie le vecteur d'initialisation (IV) utilisé pour crypter ou décrypter la valeur. Vous ne pouvez spécifier l'IV que lorsque vous utilisez les algorithmes AES. (L'algorithme RC4 n'utilise pas la valeur IV) Si vous ne spécifiez pas de valeur " IV, les fonctions " encrypt() et " decrypt() utilisent une valeur " IV constante.

Le cryptage avec le mode de retour de sortie (OFB) nécessite que l'IV et la clé soient de 128 bits. La meilleure pratique consiste à spécifier des valeurs de 128 bits pour la clé et l'IV (le cas échéant) afin que le système utilise vos valeurs d'entrée. Si une valeur est inférieure ou supérieure à 128 bits, le système utilise un mécanisme d'expansion ou de dérivation pour ajuster la valeur comme suit :

  • Pour les clés ou les IV inférieurs à 128 bits, le système duplique la valeur jusqu'à ce que la clé ou l'IV atteigne la longueur correcte.
  • Pour les clés ou les IV de plus de 128 bits, le système crée une valeur de 128 bits en utilisant un OU logique (XOR) des 128 premiers bits de la valeur avec les bits restants de la valeur.
Si vous intégrez ou appelez une fonction " encrypt() dans une fonction " encrypt(), le résultat est une chaîne en clair, comme le montre l'exemple suivant :
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
  encrypt
 ---------
  abcde
 (1 row)

Retours

Les fonctions renvoient une valeur chiffrée ou déchiffrée. La boîte à outils SQL Extensions utilise le mode OFB d'AES pour le cryptage et le décryptage, ce qui transforme un algorithme de chiffrement par bloc en un algorithme de chiffrement par flux synchrone. En tant que système de chiffrement par flux, l'OFB n'a pas besoin de rembourrage et la longueur du texte chiffré de sortie est la même que celle du texte en clair d'entrée.

Exemple

select encrypt('123456',100,0);
 ENCRYPT
---------
 ÉôC¥Ñ
(1 row)

 select encrypt('Netezza Systems','NPS001534',1,'MY_IV is IBM001');
     ENCRYPT
-----------------
 �Ná•▒7Þ¢bhñæ
(1 row)

Génération de clés et d'IV

Vous pouvez utiliser les fonctions " hash() et " rawtohex() pour générer des clés et des IV. La fonction " hash() renvoie un hachage de 128 bits, 160 bits ou 256 bits des données d'entrée, en fonction de l'algorithme utilisé pour la fonction. L'exemple suivant montre comment créer une clé de 256 bits pour le cryptage AES. Dans l'exemple, la sortie MYKEY est intentionnellement tronquée par l'utilisation de caractères ellipses (...) afin que la sortie puisse être affichée dans les limites de la page.

create table impData (cname varchar(35),cid varchar(20));
CREATE TABLE

insert into impData values('Netezza Systems','CNZ0001SYS');
INSERT 0 1

create table securedImpData as select cid, rawtohex(hash(cid,2))
 as mykey, encrypt(cname, rawtohex(hash(cid,2)),2) as ENCRYPTED_CNAME from impData;
INSERT 0 1

select * from securedImpData;
    CID     |                    MYKEY                        | ENCRYPTED_CNAME
------------+-------------------------------------------------+-----------------
 CNZ0001SYS | 8D812C9E8DB362FCB20E...6A00B564175B92762B1A3520 | Ã4W§
      wÂÃð
ŸÃ
(1 row)

create table decryptedData as select CID, decrypt(ENCRYPTED_CNAME,
MYKEY,2) as DECRYPTED_CNAME from securedImpData;
INSERT 0 1

select * from decryptedData;
    CID     | DECRYPTED_CNAME
------------+-----------------
 CNZ0001SYS | Netezza Systems
(1 row)