Hachage et sel pour mots de passe en PHP : guide de sécurité 2025

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

Mots de passe sous surveillance : pourquoi les anciennes méthodes ne fonctionnent plus

\n

Imaginez : vous êtes un développeur qui écrit un système d'inscription. Quoi de plus simple, semble-t-il ? Vous prenez le mot de passe, vous le passez dans md5, vous le sauvegardez en base de données. Mais en 2025, cette approche est la voie directe vers la vulnérabilité. Les attaques modernes, le brute-force par GPU et les tables arc-en-ciel réduisent les hachages faibles en poussière en quelques secondes. La question de Stack Overflow avec des milliers de vues — « Secure hash and salt for PHP passwords » — reste d'actualité, et nous allons l'aborder une fois pour toutes.

\n

Dans cet article, vous apprendrez à hacher correctement les mots de passe en PHP, en utilisant des algorithmes modernes, des fonctions intégrées et du sel (salt). Nous adaptons les meilleures réponses de la communauté pour un contenu éducatif et montrons comment protéger les utilisateurs même en 2025.

\n\n

Pourquoi md5 et sha1 sont le mal

\n

Si vous utilisez encore md5 ou sha1 pour stocker les mots de passe — arrêtez-vous. Ces algorithmes sont conçus pour la vitesse, pas pour la sécurité. En 2025, un GPU peut générer des milliards de hachages md5 par seconde. L'ajout de sel (une chaîne aléatoire) ne sauve rien : les tables arc-en-ciel sont contournées, mais la vitesse reste fatale.

\n
    \n
  • Md5 : 2^128 possibilités — se cracke en quelques minutes.
  • \n
  • Sha1 : un peu mieux, mais tout aussi obsolète.
  • \n
  • Sel sans ralentissement : si le hachage est rapide, le sel ne fait que retarder l'attaque.
  • \n
\n

Au lieu de cela, il faut des algorithmes avec « ralentissement » — qui nécessitent du temps et de la mémoire. C'est exactement ce qu'utilise password_hash.

\n\n

password_hash et password_verify : la solution intégrée de PHP

\n

Depuis PHP 5.5, deux fonctions résolvent 90 % des problèmes de sécurité des mots de passe : password_hash et password_verify. Elles génèrent automatiquement un sel cryptographiquement sûr et utilisent des algorithmes résistants au brute-force. En 2025, c'est la norme, et pas de bricolage maison !

\n\n

Comment ça marche ?

\n

La fonction password_hash prend un mot de passe et un algorithme (par défaut — bcrypt, mais on peut spécifier argon2). Elle retourne une chaîne qui contient déjà le sel et les paramètres. Vous n'avez pas besoin de stocker le sel séparément — il est à l'intérieur du hachage.

\n
<?php\n// Hachage du mot de passe\n$password = "SuperSecret123!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\n\necho $hash; // $2y$10$... (60 caractères)\n?>\n
\n

Maintenant, vérifions le mot de passe lors de la connexion :

\n
<?php\n$inputPassword = "SuperSecret123!";\n$storedHash = "$2y$10$..."; // depuis la base de données\n\nif (password_verify($inputPassword, $storedHash)) {\n    echo "Mot de passe correct !";\n} else {\n    echo "Mot de passe incorrect.";\n}\n?>\n
\n

Tout est génialement simple. password_verify extrait automatiquement le sel du hachage et vérifie le mot de passe. Aucune action supplémentaire.

\n\n

Choix de l'algorithme : bcrypt vs argon2

\n

En 2025, vous avez deux options principales :

\n
    \n
  • Bcrypt (PASSWORD_BCRYPT) : éprouvé par le temps, utilisé par défaut. Résistant aux attaques, mais nécessite le réglage du cost factor.
  • \n
  • Argon2 (PASSWORD_ARGON2I ou PASSWORD_ARGON2ID) : vainqueur du concours Password Hashing Competition. Plus moderne, nécessite plus de mémoire, ce qui complique les attaques par GPU. Recommandé pour les nouveaux projets.
  • \n
\n

Exemple avec argon2 :

\n
<?php\n$hash = password_hash($password, PASSWORD_ARGON2ID, [\n    'memory_cost' => 1 << 17, // 128 MB\n    'time_cost'   => 4,\n    'threads'     => 2\n]);\n?>\n
\n

Le paramètre memory_cost — la quantité de mémoire en kilooctets. Plus il est élevé, plus c'est sûr, mais plus lent. Pour la production, testez sur votre serveur.

\n\n

Sel (salt) : comment ça marche et pourquoi il n'est pas nécessaire séparément

\n

Beaucoup de débutants demandent : « Comment ajouter le sel manuellement ? ». La réponse : pas du tout. password_hash génère 22 caractères de sel aléatoire (pour bcrypt

Blogs

Book Recommendations