Bcrypt en PHP : comment hacher les mots de passe rapidement et sans erreurs
\n\nAvez-vous déjà remarqué que votre site en PHP ralentit lors de l'inscription des utilisateurs ? Ou, pire encore, que des pirates arrivent quand même à voler les mots de passe de votre base de données ? La réponse pourrait résider dans la façon dont vous utilisez bcrypt pour hacher les mots de passe en PHP.
\n\nCette question est l'une des plus populaires sur Stack Overflow (des milliers de vues !). Et ce n'est pas surprenant : la sécurité des mots de passe est un domaine où une seule erreur peut vous coûter votre réputation, et aux utilisateurs leurs données. Mais aujourd'hui, nous n'allons pas seulement voir comment utiliser password_hash avec bcrypt. Nous allons parler d'optimisation et de performances. Car, avouez-le, attendre 5 secondes lors de la connexion, ce n'est pas génial.
Voyons comment rendre le hachage des mots de passe en PHP non seulement sécurisé, mais aussi rapide. C'est parti !
\n\nPourquoi bcrypt ? Et pourquoi pas MD5 ou SHA ?
\n\nDe nombreux débutants (et, hélas, certains « expérimentés ») utilisent encore md5() ou sha1(). C'est comme fermer une porte avec un loquet en plastique — c'est fermé en apparence, mais il suffit de souffler pour l'ouvrir. MD5 et SHA sont des hachages rapides. Trop rapides. Un pirate avec un GPU moderne peut parcourir des milliards de ces hachages par seconde.
Bcrypt est une approche fondamentalement différente. Il est spécialement conçu pour être lent. Il utilise un « sel » (données aléatoires) et un « cost factor » (facteur de coût) qui oblige l'algorithme à s'exécuter plus longtemps. Pendant qu'un pirate calculerait un seul hachage bcrypt, il pourrait parcourir un million de MD5. C'est pourquoi bcrypt est la norme de facto en PHP.
\n\nLes bases : comment utiliser bcrypt en PHP correctement
\n\nDepuis PHP 5.5, nous avons la fonction magique password_hash(). Oubliez l'ajout manuel de sel et l'appel à crypt() — tout est déjà fait pour vous.
Voici à quoi ressemble le hachage correct d'un mot de passe avec bcrypt :
\n\n<?php\n// Hachage du mot de passe\n$password = 'MySuperSecretPassword123!';\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\necho $hash;\n// Sortie : $2y$10$... (chaîne de 60 caractères)\n?>\n\nVoilà ! password_hash génère lui-même un sel aléatoire et choisit un cost factor optimal (10 par défaut). Et comment vérifier le mot de passe lors de la connexion ?
<?php\n// Vérification du mot de passe\n$inputPassword = 'MySuperSecretPassword123!';\n$hashFromDB = '$2y$10$...'; // le même hachage de la base\n\nif (password_verify($inputPassword, $hashFromDB)) {\n echo "Mot de passe correct ! Bienvenue.";\n} else {\n echo "Mot de passe incorrect. Veuillez réessayer.";\n}\n?>\n\nSimple, n'est-ce pas ? Mais le diable, comme toujours, se cache dans les détails. Parlons maintenant du plus important : les performances.
\n\nOptimisation de bcrypt : comment trouver l'équilibre entre sécurité et vitesse
\n\nLe paramètre principal qui influence les performances de bcrypt en PHP est le cost factor (coût). Il est défini comme deuxième argument dans password_hash() sous forme de tableau ['cost' => 12].
Qu'est-ce que le cost ? C'est une échelle logarithmique. Chaque unité multiplie le temps d'exécution par environ 2.
\n\n- \n
- Cost = 10 (par défaut) : ~0,1-0,2 seconde. Rapide, mais pour 2024, c'est déjà un peu faible. \n
- Cost = 12 : ~0,4-0,8 seconde. Un bon équilibre pour la plupart des projets. \n
- Cost = 14 : ~1,5-3 secondes. Très sécurisé, mais les utilisateurs commenceront à s'impatienter. \n
- Cost = 16+ : >5 secondes. Seulement si vous êtes un espion ou que vous stockez des codes nucléaires. \n
Comment choisir le cost idéal ? Il existe une règle simple : sur votre serveur, le hachage d'un seul mot de passe ne doit pas prendre plus de 250 à 500 millisecondes. C'est imperceptible pour l'utilisateur, mais rend une attaque par force brute trop coûteuse pour un pirate.
\n\n