WEB-d Développement Web

PHP, SQL, HTML5, CSS3, Javascript, Mootools, Référencement, SEO, CMS, e-commerce, Apache, Linux, Ubuntu, ...

Protéger les mots de passe avec PHP

Dans la plupart des applications web, le mot de passe des utilisateurs est stocké dans une base de données, à laquelle un attaquant ne devrait NORMALEMENT jamais avoir accès. Certaines applications se contentent donc de stocker les mots de passe en simple texte. Mais que se passerait-il si l'attaquant parvenait à ses fins? Les résultats seraient dramatiques:

MD5

La première idée pour éviter ce genre de désagréments consiste à utiliser MD5 pour chiffrer les mots de passe. Lors du login, il suffit de vérifier que la version chiffrée du mot de passe fourni par l'utilisateur correspond à la version stockée dans la base de données.

Force brute et rainbow tables

Cette solution n'est cependant pas suffisante car l'algorithme md5 est très rapide à calculer, et il est donc simple pour l'attaquant de réaliser une attaque par force brute (donc en essayant successivement toutes les combinaisons de mot de passe possible). Il existe même des tables pré-calculées, appelées "rainbow table", qui permettent d'accélérer le processus. Cette technique est utilisée par le logiciel John The Ripper, par exemple.

Blowfish

La solution consiste donc à utiliser un algorithme de chiffrement moderne, suffisamment difficile à calculer pour éviter les attaques par force brute, et qui utilise un "sel" (salt) de départ pour éviter les attaques utilisant les rainbow tables. C'est le cas de Blowfish.

En PHP, calculer la version chiffrée d'un mot de passe se fait avec la fonction crypt:


$salt = "mYsaLtof22cHarActerS."; // 22 caractères: a-z A-Z 0-9 . /
$cost = "12";                    // Entre "04" et "21"
$password = "password";
echo crypt($password, '$2a$' . $cost . '$' . $salt . '$');
 

Sur ma machine (un vieux Core 2 Duo il est vrai), calculer un seul mot de passe demande environ 400 ms. Si les mots de passe sont composés de 7 caractères (majuscules, minuscules et chiffres), cela représente plus de 3500 milliards de combinaisons à essayer, soit plus de 150000 années de calcul, contre quelques minutes en utilisant md5...

Et si c'est vraiment nécessaire, le temps de calcul peut encore être allongé en augmentant le paramètres $cost!

Articles similaires