Cela fait un moment que je n'ai pas posé cette question, et je connais beaucoup mieux la théorie cryptographique maintenant, alors voici l'approche la plus moderne :
Raisonnement
- N'utilisez pas md5. N'utilisez pas un seul cycle de hachages rapides de la famille sha. Les hachages rapides aident les attaquants, vous ne voulez donc pas cela.
- Utilisez plutôt un hachage gourmand en ressources, comme bcrypt. Bcrypt est testé dans le temps et évolue pour être évolutif.
- Ne vous embêtez pas à rouler votre propre sel, vous risquez de bousiller votre propre sécurité ou votre portabilité, comptez sur gen_salt() pour générer par lui-même ses superbes sels uniques à chaque utilisation.
- En général, ne soyez pas idiot, n'essayez pas d'écrire votre propre crypto maison, utilisez simplement ce que les gens intelligents ont fourni.
Packages d'installation Debian/Ubuntu
sudo apt-get install postgresql // (of course)
sudo apt-get install postgresql-contrib libpq-dev // (gets bcrypt, crypt() and gen_salt())
sudo apt-get install php5-pgsql // (optional if you're using postgresql with php)
Activez crypt() et bcrypt dans postgresql dans votre base de données
// Create your database first, then:
cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts.
echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension
Utilisez crypt() et gen_salt() dans les requêtes
Comparez :passer au hachage existant avec :
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
Créez un hachage de :password avec un grand sel aléatoire :
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
Le hachage bcrypt From-in-Php est légèrement préférable
Il y a password_*
fonctions de php 5.5 et supérieures qui permettent un hachage de mot de passe trivialement simple avec bcrypt (il était temps !), et il existe une bibliothèque de compatibilité descendante pour les versions inférieures. Généralement ce hachage revient de toute façon à envelopper un appel système Linux pour une utilisation moindre du processeur, bien que vous souhaitiez peut-être vous assurer qu'il est installé sur votre serveur. Voir :https://github.com/ircmaxell/password_compat (nécessite php 5.3.7+)
Attention à la journalisation
Notez qu'avec pg_crypto, les mots de passe sont en clair tout au long de la transmission depuis le navigateur, vers php, vers la base de données. Cela signifie qu'ils peuvent être enregistrés en clair des requêtes si vous ne faites pas attention à vos journaux de base de données. par exemple. avoir un journal des requêtes lentes postgresql pourrait intercepter et enregistrer le mot de passe d'une requête de connexion en cours.
En résumé
Utilisez php bcrypt si vous le pouvez, cela réduira le temps pendant lequel le mot de passe reste non haché. Essayez de vous assurer que votre système Linux a installé bcrypt dans son crypt()
donc c'est performant. La mise à niveau vers au moins php 5.3.7+ est fortement recommandée car l'implémentation de php est légèrement boguée de php 5.3.0 à 5.3.6.9, et retombe de manière inappropriée sur le DES
cassé sans avertissement en php 5.2.9 et inférieur.
Si vous voulez/avez besoin d'un hachage postgres, l'installation de bcrypt est la solution, car les hachages installés par défaut sont anciens et cassés (md5, etc.).
Voici des références pour en savoir plus sur le sujet :
- http://codahale.com/how-to-safely-store-a-password/
- http://www.postgresql.org/docs/9.2/static/pgcrypto.html
- https://github.com/ircmaxell/password_compat