Bcrypt en PHP : hacher les mots de passe rapidement et sans erreur

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Bcrypt en PHP : comment hacher les mots de passe correctement et rapidement

\n\n

Si 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\n

Pourquoi 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\n

Qu'est-ce que bcrypt et pourquoi est-il meilleur que MD5 ou SHA1 ?

\n\n

Mettons 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\n

En 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.

\n\n

Comment utiliser bcrypt en PHP : exemple de base

\n\n

Commenç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\n

Et 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\n

Simple, n'est-ce pas ? Mais le diable se cache dans les détails. Penchons-nous sur le cost factor.

\n\n

Réglage du cost factor : équilibre entre sécurité et rapidité

\n\n

Par 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.

\n\n

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.

\n\n

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\n

Sur 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\n

Optimisation des performances de bcrypt en PHP

\n\n

Passons maintenant à la partie la plus intéressante : comment rendre bcrypt plus rapide sans sacrifier la sécurité. Voici plusieurs stratégies éprouvées :

\n\n

1. Mise en cache des résultats

\n

Si 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

Blogs

Book Recommendations