Bcrypt en PHP : comment hacher les mots de passe correctement et rapidement
\n\nSi vous vous êtes déjà demandé "How do you use bcrypt for hashing passwords in PHP?", sachez que vous n'êtes pas seul. Cette question sur Stack Overflow a recueilli des milliers de vues — et pour cause. Le hachage des mots de passe est le fondement de la sécurité de toute application web, et bcrypt reste l'un des algorithmes les plus fiables et populaires. Dans cet article, nous allons voir comment utiliser bcrypt en PHP, comment le configurer pour des performances optimales et éviter les pièges courants.
\n\nPourquoi bcrypt ? Parce qu'il résiste aux attaques par force brute grâce à un "sel" intégré et une complexité ajustable. Mais comment faire en sorte que votre site ne ralentisse pas à chaque connexion ? C'est ce que nous allons aborder.
\n\nQu'est-ce que bcrypt et pourquoi est-il meilleur que MD5 ou SHA1 ?
\n\nMettons les choses au clair tout de suite : n'utilisez jamais MD5 ou SHA1 pour hacher des mots de passe. Ces algorithmes sont conçus pour être rapides, pas pour la sécurité. Bcrypt, au contraire, est délibérément lent. Il utilise un cost factor (facteur de coût) qui détermine le nombre d'itérations de hachage. Plus le cost factor est élevé, plus le hachage est long à calculer — et plus il est difficile pour un attaquant de deviner le mot de passe.
\n\nEn PHP, le travail avec bcrypt est grandement simplifié grâce aux fonctions password_hash() et password_verify(). Elles sont apparues dans PHP 5.5 et sont depuis devenues le standard de facto.
Comment utiliser bcrypt en PHP : exemple de base
\n\nCommençons par le plus simple. Voici comment enregistrer un utilisateur et stocker son mot de passe :
\n\n<?php\n// Inscription d'un utilisateur\n$password = "MySuperP@ss123";\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\n// On sauvegarde $hash dans la base de données (par exemple, dans le champ password_hash)\necho $hash; // Affiche quelque chose comme $2y$10$...\n?>\n\nEt voici comment vérifier le mot de passe lors de la connexion :
\n\n<?php\n// Connexion d'un utilisateur\n$loginPassword = "MySuperP@ss123";\n$storedHash = "$2y$10$..."; // depuis la base de données\n\nif (password_verify($loginPassword, $storedHash)) {\n echo "Mot de passe correct !";\n} else {\n echo "Mot de passe incorrect.";\n}\n?>\n\nSimple, n'est-ce pas ? Mais le diable se cache dans les détails. Penchons-nous sur le cost factor.
\n\nRéglage du cost factor : équilibre entre sécurité et rapidité
\n\nPar défaut, PASSWORD_BCRYPT utilise un cost factor de 10. Cela représente 2^10 = 1024 itérations. Sur un serveur moderne, cela prend environ 0,1 à 0,2 seconde. Cela semble peu, mais si vous avez 1000 connexions simultanées, le temps commence à s'accumuler.
Comment choisir le cost factor optimal ? Il existe une règle simple : il doit être tel que le hachage d'un seul mot de passe prenne au maximum 0,5 seconde sur votre serveur. Vous pouvez le tester avec la fonction password_hash() en utilisant différentes valeurs.
Voici un exemple de test de performance :
\n\n<?php\n$password = "test_password";\n$times = [];\n\nfor ($cost = 8; $cost <= 14; $cost++) {\n $start = microtime(true);\n password_hash($password, PASSWORD_BCRYPT, ['cost' => $cost]);\n $times[$cost] = microtime(true) - $start;\n}\n\nprint_r($times);\n?>\n\nSur un hébergement mutualisé typique, un cost factor de 10 à 12 sera optimal. Si vous avez un serveur puissant, vous pouvez monter jusqu'à 13 ou 14. Mais n'exagérez pas : un cost factor trop élevé pourrait faire consommer toutes les ressources de votre serveur en cas d'attaque.
\n\nOptimisation des performances de bcrypt en PHP
\n\nPassons maintenant à la partie la plus intéressante : comment rendre bcrypt plus rapide sans sacrifier la sécurité. Voici plusieurs stratégies éprouvées :
\n\n1. Mise en cache des résultats
\nSi un utilisateur saisit un mot de passe correct, pourquoi le hacher à nouveau à chaque requête ? Vous pouvez mettre en cache le résultat pendant une courte durée (par exemple, 5 minutes) avec Redis ou Memcached. C'est particulièrement