Le module pgcrypto propose des fonctions de cryptographie pour PostgreSQL™.
digest(data text, type text) returns bytea digest(data bytea, type text) returns bytea
Calcule un hachage binaire de data. type est l'algorithme utilis�. Les algorithmes standards sont md5 et sha1. Si pgcrypto a �t� construit avec OpenSSL, d'autres algorithmes sont disponibles comme le d�taille Tableau F.18, � R�sum� de fonctionnalit�s avec et sans OpenSSL �.
Si vous voulez en r�sultat une cha�ne hexad�cimale, utilisez encode() sur le r�sultat. Par exemple :
CREATE OR REPLACE FUNCTION sha1(bytea) returns text AS $$ SELECT encode(digest($1, 'sha1'), 'hex') $$ LANGUAGE SQL STRICT IMMUTABLE;
hmac(data text, key text, type text) returns bytea hmac(data bytea, key text, type text) returns bytea
Calcule un MAC hach� sur data avec la cl� key. type est identique � digest().
C'est similaire � digest() mais le hachage peut �tre recalcul� en connaissant seulement la cl�. Ceci �vite le sc�nario o� quelqu'un modifie les donn�es et le hachage en m�me temps.
Si la cl� est plus grosse que le bloc hach�, il sera tout d'abord hach� puis le r�sultat sera utilis� comme cl�.
Les fonctions crypt() et gen_salt() sont sp�cialement con�ues pour hacher les mots de passe. crypt() s'occupe du hachage et gen_salt() pr�pare les param�tres de l'algorithme pour �a.
Les algorithmes de crypt() diff�rent des algorithmes de hachage habituels comme MD5 ou SHA1 :
Ils sont lents. Comme la quantit� de donn�es est petite, c'est le seul moyen de rendre difficile la d�couverte par la force des mots de passe.
Ils incluent une valeur al�atoire appel�e sel (salt en anglais) avec le r�sultat, pour que les utilisateurs qui ont le m�me mot de passer puissent avoir des mots de passe chiffr�s diff�rents. C'est aussi une d�fense suppl�mentaire comme l'inversion de l'algorithme.
Ils incluent le type de l'algorithme dans le r�sultat pour que les mots de passe hach�s avec diff�rents algorithmes puissent co-exister.
Certains s'adaptent. Cela signifie que, une fois que les ordinateurs iront plus vite, vous pourrez configurer l'algorithme pour qu'il soit plus lent, ceci sans introduire d'incompatibilit� avec les mots de passe existant.
Tableau F.15, � Algorithmes support�s par crypt() � liste les algorithmes support�s par la fonction crypt().
Tableau F.15. Algorithmes support�s par crypt()
Algorithme | Longueur maximum du mot de passe | Adaptif ? | Bits sel | Description |
---|---|---|---|---|
bf | 72 | oui | 128 | Bas� sur Blowfish, variante 2a |
md5 | unlimited | non | 48 | crypt() bas� sur MD5 |
xdes | 8 | oui | 24 | DES �tendu |
des | 8 | non | 12 | crypt original UNIX |
crypt(password text, salt text) returns text
Calcule un hachage de mot de passe (password) d'apr�s crypt(3) UN*X. Lors du stockage d'un nouveau mot de passe, vous devez utiliser la fonction gen_salt() pour g�n�rer un nouveau sel (salt). Lors de la v�rification de mot de passe, passez la valeur hach�e stock�e salt, et testez si le r�sultat correspond � la valeur stock�e.
Exemple d'ajout d'un nouveau mot de passe :
UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
Exemple d'authentification :
SELECT pswhash = crypt('entered password', pswhash) FROM ... ;
Ceci renvoie true si le mot de passe saisi est correct.
gen_salt(type text [, iter_count integer ]) returns text
G�n�re une nouvelle valeur al�atoire sel pour son utilisation avec crypt(). La cha�ne sel indique aussi � crypt() l'algorithme � utiliser.
Le param�tre type pr�cise l'algorithme de hachage. Les types accept�es sont : des, xdes, md5 et bf.
Le param�tre iter_count laisse l'utilisateur indiquer le nombre d'it�ration, pour les algorithmes qui en ont. Plus le nombre est important, plus le hachage du mot de passe prendra du temps, et du coup plus le craquage du mot de passe prendre du temps. Cela �tant dit, un nombre trop important rend pratiquement impossible le calcul du hachage. Si le param�tre iter_count est omis, le nombre d'it�ration par d�faut est utilis�. Les valeurs autoris�es pour iter_count d�pendent de l'algorithme et sont affich�es dans Tableau F.16, � Nombre d'it�ration pour crypt() �.
Tableau F.16. Nombre d'it�ration pour crypt()
Algorithme | Par d�faut | Min | Max |
---|---|---|---|
xdes | 725 | 1 | 16777215 |
bf | 6 | 4 | 31 |
Pour xdes, il existe une limite suppl�mentaire qui fait que ce nombre doit �tre un nombre impair.
Pour utiliser un nombre d'it�ration appropri�, pensez que la fonction crypt DES original a �t� con�u pour avoir la vitesse de quatre hachages par seconde sur le mat�riel de l'�poque. Plus lent que quatre hachages par secondes casserait probablement la facilit� d'utilisation. Plus rapide que cent hachages � la seconde est probablement trop rapide.
Tableau F.17, � Vitesse de l'algorithm de hachage � donne un aper�u de la lenteur relative de diff�rents algorithmes de hachage. La table montre le temps que prendrait le calcul de toutes les combinaisons r�alisables pour un mot de passe sur huit caract�res, en supposant que le mot de passe contient soit que des lettres minuscules, soit des lettres minuscules et majuscules et des chiffres. Dans les entr�es crypt-bf, le nombre apr�s un slash est le param�tre iter_count de gen_salt.
Tableau F.17. Vitesse de l'algorithm de hachage
Algorithme | Hachages/sec | Pour [a-z] | Pour [A-Za-z0-9] |
---|---|---|---|
crypt-bf/8 | 28 | 246 years | 251322 years |
crypt-bf/7 | 57 | 121 ann�es | 123457 ann�es |
crypt-bf/6 | 112 | 62 ann�es | 62831 ann�es |
crypt-bf/5 | 211 | 33 ann�es | 33351 ann�es |
crypt-md5 | 2681 | 2.6 ann�es | 2625 ann�es |
crypt-des | 362837 | 7 jours | 19 ann�es |
sha1 | 590223 | 4 jours | 12 ann�es |
md5 | 2345086 | 1 jour | 3 ann�es |
Notes :
La machine utilis�e est un Pentium 4 � 1,5 GHz.
Les num�ros des algorithmes crypt-des et crypt-md5 sont pris de la sortie du -test de John the Ripper v1.6.38.
Les nombresmd5 font partie de mdcrack 1.2.
Les nombres sha1 font partie de lcrack-20031130-beta.
Les nombres crypt-bf sont pris en utilisant le programme simple qui boucle sur 1000 mots de passe de huit caract�res. De cette fa�on, je peux afficher la vitesse avec les diff�rents nombres de tours. Pour r�f�rence : john -test affiche 213 tours/sec pour crypt-bf/5. (La petite diff�rence dans les r�sultats est d� au fait que l'impl�mentation de crypt-bf dans pgcrypto est la m�me que celle utilis�e dans John the Ripper.)
Notez que � tenter toutes les combinaisons � n'est pas un exercice r�aliste. Habituellement, craquer les mots de passe se fait avec l'aide de dictionnaires contenant les mots standards et diff�rentes variantes. Donc, m�me des mots de passe qui ressemblent vaguement � des mots peuvent �tre craqu�s plus rapidement que les nombres ci-dessus le sugg�rent alors qu'un mot de passe sur six caract�res qui ne ressemble pas � un mot pourrait ne pas �tre craqu�.
Les fonctions impl�mentent la partie chiffrement du standard OpenPGP (RFC 2440). Les chiffrements � cl�s sym�triques et publiques sont support�s.
Un message PGP chiffr� consiste en deux parties ou paquets :
Un paquet contenant la cl� de session -- soit une cl� sym�trique soit une cl� publique chiffr�e.
Paquet contenant les donn�es chiffr�es avec la cl� de session containing data encrypted with the session key.
Lors du chiffrement avec une cl� sym�trique (par exemple, un mot de passe) :
Le mot de passe est hach� en utilisant l'algorithme String2Key (S2K). C'est assez similaire � l'algorithme crypt() -- lenteur voulue et nombre al�atoire pour le sel -- mais il produit une cl� binaire de taille compl�te.
Si une cl� de session s�par�e est demand�e, une nouvelle cl� sera g�n�r�e au hasard. Sinon une cl� S2K sera utilis�e directement en tant que cl� de session.
Si une cl� S2K est � utiliser directement, alors seuls les param�tres S2K sont plac�s dans le paquet de session. Sinon la cl� de session sera chiffr�e avec la cl� S2K et plac�e dans le paquet de session.
Lors du chiffrement avec une cl� publique :
Une nouvelle cl� de session est g�n�r�e au hasard.
Elle est chiffr�e en utilisant la cl� public et plac�e dans le paquet de session.
Dans les deux cas, les donn�es � chiffrer sont trait�es ainsi :
Manipulation optionnelle des donn�es : compression, conversion vers UTF-8, conversion de retours � la ligne.
Les donn�es sont pr�fix�es avec un bloc d'octets pris au hasard. C'est identique � l'utilisation de random IV.
Un hachage SHA1 d'un pr�fixe et de donn�es au hasard est ajout�.
Tout ceci est chiffr� avec la cl� de la session et plac� dans la paquet de donn�es.
pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea
Chiffre data avec une cl� PGP sym�trique psw. Le param�tre options peut contenir des options d�crites ci-dessous.
pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea
D�chiffre un message PGP chiffr� avec une cl� sym�trique.
D�chiffrer des donn�es bytea avec pgp_sym_decrypt est interdit. Ceci a pour but d'�viter la sortie de donn�es de type caract�re invalides. D�chiffrer des donn�es textuelles avec pgp_sym_decrypt_bytea ne pose pas de probl�me.
Le param�tre options peut contenir les param�tres d�crits ci-dessous.
pgp_pub_encrypt(data text, key bytea [, options text ]) returns bytea pgp_pub_encrypt_bytea(data bytea, key bytea [, options text ]) returns bytea
Chiffre data avec la cl� PGP publique key. Avec cette fonction, une cl� priv�e renverra une erreur.
Le param�tre options peut contenir des options d�crites ci-dessous.
pgp_pub_decrypt(msg bytea, key bytea [, psw text [, options text ]]) returns text pgp_pub_decrypt_bytea(msg bytea, key bytea [, psw text [, options text ]]) returns bytea
D�chiffre un message chiffr� avec une cl� publique. key doit �tre la cl� secr�te correspondant � la cl� publique utilis�e pour chiffrer. Si la cl� secr�te est prot�g�e par un mot de passe, vous devez saisir le mot de passe dans psw. S'il n'y a pas de mot de passe mais que vous devez indiquer des options, vous devez saisir un mot de passe vide.
D�chiffrer des donn�es bytea avec pgp_pub_decrypt est interdit. Ceci a pour but d'�viter la sortie de donn�es de type caract�re invalides. D�chiffrer des donn�es textuelles avec pgp_pub_decrypt_bytea ne pose pas de probl�me.
Le param�tre options peut contenir des options d�crites ci-dessous.
pgp_key_id(bytea) returns text
pgp_key_id extrait l'identifiant de la cl� pour une cl� PGP publique ou secr�te. Ou il donne l'identifiant de la cl� utilis� pour chiffrer les donn�es si un message chiffr� est fourni.
Elle peut renvoyer deux identifiants de cl�s sp�ciaux :
SYMKEY
Le message est chiffr� avec une cl� sym�trique.
ANYKEY
La donn�e est chiffr�e avec une cl� publique mais l'identifiant de la cl� est effac�. Cela signifie que vous avez besoin d'essayer toutes les cl�s secr�tes pour voir laquelle la d�chiffre. pgcrypto ne r�alise pas lui-m�me de tels messages.
Notez que des cl�s diff�rentes peuvent avoir le m�me identifiant. C'est rare mais normal. L'application client doit alors essayer de d�chiffer avec chacune d'elle pour voir laquelle correspond -- ce qui revient � la gestion de ANYKEY.
armor(data bytea) returns text dearmor(data text) returns bytea
Ces fonctions enveloppent les donn�es dans une armure ASCII PGP qui est basiquement en Base64 avec CRC et un formatage suppl�mentaire.
Les options sont nomm�es de fa�on similaires � GnuPG. Les valeurs sont fournies apr�s un signe d'�galit� ; les options sont s�par�es par des virgules. Par exemple :
pgp_sym_encrypt(data, psw, 'compress-algo=1, cipher-algo=aes256')
Toutes les options en dehors de convert-crlf s'appliquent seulement aux fonctions de chiffrement. Les fonctions de d�chiffrement obtiennent des param�tres des donn�es PGP.
Les options les plus int�ressantes sont problablement compression-algo et unicode-mode. Le reste doit avoir des valeurs par d�faut raisonnables.
Quel algorithme de chiffrement � utiliser.
Valeurs : bf, aes128, aes192, aes256 (OpenSSL seulement :
3des, cast5)
Par d�faut : aes128
Applique � : pgp_sym_encrypt, pgp_pub_encrypt
Algorithme de compression � utiliser. Seulement disponible si PostgreSQL™ a �t� construit avec zlib.
Valeurs :
0 - sans compression
1 - compression ZIP
2 - compression ZLIB [=ZIP plus meta-data and block-CRC's]
Par d�faut : 0
S'applique � : pgp_sym_encrypt, pgp_pub_encrypt
Niveau de compression. Les grands niveaux compressent mieux mais sont plus lents. 0 d�sactive la compression.
Valeurs : 0, 1-9
Par d�faut : 6
S'applique � : pgp_sym_encrypt, pgp_pub_encrypt
Pr�cise si \n doit �tre converti en \r\n lors du chiffrement et \r\n en \n lors du d�chiffrement. La RFC 4880 sp�cifie que les donn�es texte doivent �tre stock�es en utilisant les retours chariot \r\n. Utilisez cette option pour obtenir un comportement respectant la RFC.
Valeurs : 0, 1
Par d�faut : 0
S'applique � : pgp_sym_encrypt, pgp_pub_encrypt, pgp_sym_decrypt,
pgp_pub_decrypt
Ne prot�ge pas les donn�es avec SHA-1. La seule bonne raison pour utiliser cette option est d'avoir une compatibilit� avec les anciens produits PGP pr�c�dant l'ajout de paquets prot�g�s SHA-1 dans la RFC 4880. Les versions r�centes des logiciels de gnupg.org et pgp.com le supportent.
Valeurs : 0, 1
Par d�faut : 0
S'applique � : pgp_sym_encrypt, pgp_pub_encrypt
Utilise la cl� de session s�par�e. Le chiffrement par cl� publique utilise toujours une cl� de session s�par�e, c'est pour le chiffrement de cl� sym�trique, qui utilise directement par d�faut S2K.
Valeurs : 0, 1
Par d�faut : 0
S'applique � : pgp_sym_encrypt
Algorithme S2K � utiliser.
Valeurs :
0 - Sans sel. Dangereux !
1 - Avec sel mais avec un d�compte fixe des it�rations.
3 - D�compte variables des it�rations.
Par d�faut : 3
S'applique � : pgp_sym_encrypt
Algorithme digest � utiliser dans le calcul S2K.
Valeurs : md5, sha1
Par d�faut : sha1
S'applique � : pgp_sym_encrypt
Chiffrement � utiliser pour le chiffrage de la cl� de session s�par�e.
Valeurs : bf, aes, aes128, aes192, aes256
Par d�faut : use cipher-algo
S'applique � : pgp_sym_encrypt
S�lection de la conversion des donn�es texte � partir de l'encodage interne de la base vers l'UTF-8 et inversement. Si votre base de donn�es est d�j� en UTF-8, aucune conversion ne sera r�alis�e, seules les donn�es seront marqu�es comme �tant en UTF-8. Sans cette option, cela ne se fera pas.
Valeurs : 0, 1
Par d�faut : 0
S'applique � : pgp_sym_encrypt, pgp_pub_encrypt
Pour g�n�rer une nouvelle cl� :
gpg --gen-key
Le type de cl� pr�f�r� est � DSA and Elgamal �.
Pour le chiffrement RSA, vous devez cr�er soit une cl� de signature seulement DSA ou RSA en tant que ma�tre, puis ajouter la sous-cl� de chiffrement RSA avec gpg --edit-key.
Pour lister les cl�s :
gpg --list-secret-keys
Pour exporter une cl� publique dans un format armure ASCII :
gpg -a --export KEYID > public.key
Pour exporter une cl� secr�te dans un format armure ASCII :
gpg -a --export-secret-keys KEYID > secret.key
Vous avez besoin d'utiliser la fonction dearmor() sur ces cl�s avant de les passer aux fonctions PGP. Ou si vous g�rez des donn�es binaires, vous pouvez supprimer l'option -a pour la commande.
Pour plus de d�tails, voir la page de r�f�rence de gpg, le livre � GNU Privacy Handbook � et d'autres documents sur le site gnupg.org.
Pas de support des signatures. Cela signifie aussi qu'on ne peut pas v�rifier si la sous-cl� de chiffrage appartient bien � la cl� ma�tre.
Pas de support de la cl� de chiffrement en tant que cl� ma�tre. Cela ne devrait pas �tre un probl�me �tant donn� que cette pratique n'est pas encourag�e.
Pas de support pour plusieurs sous-cl�s. Ceci peut �tre un probl�me car c'est une pratique courante. D'un autre c�t�, vous ne devez pas utiliser vos cl�s GPG/PGP habituelles avec pgcrypto, mais en cr�er de nouvelles car l'utilisation est assez diff�rente.
Ces fonctions ex�cutent directement un calcul des donn�es ; ils n'ont pas de fonctionnalit�s avanc�es de chiffrement PGP. Du coup, ils ont les probl�mes majeurs suivant :
Elles utilisent directement la cl� de l'utilisateur comme cl� de calcul.
Elles ne fournissent pas une v�rification de l'int�grit� pour savoir si les donn�es chiffr�es ont �t� modifi�es.
Elles s'attendent � ce que les utilisateurs g�rent eux-m�me tous les param�tres du chiffrement, m�me IV.
Elles ne g�rent pas le texte.
Donc, avec l'introduction du chiffrement PGP, l'utilisation des fonctions de chiffrement brut n'est pas encourag�e.
encrypt(data bytea, key bytea, type text) returns bytea decrypt(data bytea, key bytea, type text) returns bytea encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
Chiffrer/d�chiffrer les donn�es en utilisant la m�thode de calcul sp�cifi�e par type. La syntaxe de la cha�ne type est :
algorithm [ - mode ] [ /pad: padding ]
o� algorithm fait partie de :
bf -- Blowfish
aes -- AES (Rijndael-128)
et mode fait partie de :
cbc -- le bloc suivant d�pend du pr�c�dent. (par d�faut)
ecb -- chaque bloc est chiffr� s�par�ment. (seulement pour les tests)
et padding fait partie de :
pkcs -- les donn�es peuvent avoir n'importe quelle longueur (par d�fault)
none -- les donn�es doivent �tre des multiples de la taille du bloc de calcul.
Donc, pour exemple, ces derniers sont �quivalents :
encrypt(data, 'fooz', 'bf') encrypt(data, 'fooz', 'bf-cbc/pad:pkcs')
Dans encrypt_iv et decrypt_iv, le param�tre iv est la valeur initiale pour le mode CBC ; elle est ignor�e pour ECB. Elle est remplie de z�ro pour l'alignement si la taille de donn�es ne correspond � un multiple de la taille du bloc. It defaults to all zeroes in the functions without this parameter.
gen_random_bytes(count integer) returns bytea
Renvoie count) octets pour un chiffrement fort. Il peut y avoir au maximum 1024 octets extrait � un instant t, ceci pour �viter de vider le contenu du g�n�rateur de nombres al�atoires.
pgcrypto se configure lui-m�me suivant les d�couvertes du scrip configure principal de PostgreSQL. Les options qui l'affectent sont --with-zlib et --with-openssl.
Quand il est compil� avec zlib, les fonctions de chiffrement PGP peuvent compresser les donn�es avant chiffrement.
Quand il est compil� avec OpenSSL, plus d'algorithmes seront disponibles. De plus, les fonctions de chiffrement � cl� publique seront plus rapides car OpenSSL a des fonctions BIGNUM plus optimis�es.
Tableau F.18. R�sum� de fonctionnalit�s avec et sans OpenSSL
Fonctionnalit� | Interne | Avec OpenSSL |
---|---|---|
MD5 | oui | oui |
SHA1 | oui | oui |
SHA224/256/384/512 | oui | oui (Note 1) |
D'autres algorithmes digest | non | oui (Note 2) |
Blowfish | oui | oui |
AES | oui | oui (Note 3) |
DES/3DES/CAST5 | non | oui |
Raw encryption | oui | oui |
PGP Symmetric encryption | oui | oui |
PGP Public-Key encryption | oui | oui |
Notes :
Les algorithmes SHA2 ont �t� ajout�s � OpenSSL version 0.9.8. Pour les anciennes versions, pgcrypto utilisera du code interne.
Tout algorithme digest qu'OpenSSL supporte est automatiquement choisi. Ce n'est pas possible avec les chiffreurs qui doivent �tre support�s explicitement.
AES est inclus dans OpenSSL depuis la version 0.9.7. Pour les anciennes versions, pgcrypto utilisera du code interne.
Comme le standard SQL le demande, toutes les fonctions renvoient NULL si un des arguments est NULL. Cela peut permettre une faille de s�curit� si c'est utilis� sans pr�caution.
Toutes les fonctions de pgcrypto sont ex�cut�es au sein du serveur de bases de donn�es. Cela signifie que toutes les donn�es et les mots de passe sont pass�s entre pgcrypto et l'application client en texte clair. Donc, vous devez :
Vous connecter localement ou utiliser des connexions SSL ;
Faire confiance � votre administrateur syst�me et de base de donn�es.
Si vous ne le pouvez pas, alors il est pr�f�rable de chiffrer directement au sein de l'application client.
http://www.gnupg.org/gph/en/manual.html
The GNU Privacy Handbook.
http://www.openwall.com/crypt/
D�crit l'algorithme crypt-blowfish.
http://www.stack.nl/~galactus/remailers/passphrase-faq.html
Comment choisir un bon mot de passe.
http://world.std.com/~reinhold/diceware.html
Id�e int�ressante pour choisir des mots de passe.
http://www.interhack.net/people/cmcurtin/snake-oil-faq.html
D�crit la bonne et la mauvaise cryptographie.
http://www.ietf.org/rfc/rfc4880.txt
Format du message OpenPGP.
http://www.ietf.org/rfc/rfc1321.txt
Algorithme MD5.
http://www.ietf.org/rfc/rfc2104.txt
HMAC: Keyed-Hashing for Message Authentication.
http://www.usenix.org/events/usenix99/provos.html
Comparaison des algorithmes crypt-des, crypt-md5 et bcrypt.
http://csrc.nist.gov/cryptval/des.htm
Standards pour DES, 3DES et AES.
http://en.wikipedia.org/wiki/Fortuna_(PRNG)
Description de Fortuna CSPRNG.
http://jlcooke.ca/random/
Jean-Luc Cooke Fortuna-based /dev/random driver for Linux.
http://research.cyber.ee/~lipmaa/crypto/
Collection de pointeurs sur le chiffrement.
Marko Kreen <markokr@gmail.com>
pgcrypto utilise du code provenant des sources suivantes :
Algorithme | Auteur | Origine du source |
---|---|---|
DES crypt | David Burren and others | FreeBSD libcrypt |
MD5 crypt | Poul-Henning Kamp | FreeBSD libcrypt |
Blowfish crypt | Solar Designer | www.openwall.com |
Blowfish cipher | Simon Tatham | PuTTY |
Rijndael cipher | Brian Gladman | OpenBSD sys/crypto |
MD5 and SHA1 | WIDE Project | KAME kame/sys/crypto |
SHA256/384/512 | Aaron D. Gifford | OpenBSD sys/crypto |
BIGNUM math | Michael J. Fromberger | dartmouth.edu/~sting/sw/imath |