Skip to content

Tout pour WordPress, le développement web — et plus encore

🔐 Quel type de hachage WordPress utilise-t-il

🔐 Quel type de hachage WordPress utilise-t-il

Le mot de passe de votre panneau d’administration est la dernière chose qui empêche un pirate de prendre le contrôle total de votre site. Un mot de passe faible ou un mécanisme de stockage obsolète réduisent un hébergement coûteux et un pare-feu payant à de simples décorations.

En plus de vingt ans, WordPress est passé de MD5 au bcrypt de niveau industriel. À partir de la version 6.8, le hachage des mots de passe est devenu moderne dès l’installation, sans extensions ni contournements. Mais chaque propriétaire de site devrait comprendre exactement ce qui arrive à son mot de passe après avoir cliqué sur «Se connecter».

Voici la chaîne complète: de la saisie du mot de passe dans le formulaire de connexion jusqu’à la chaîne de hachage dans la base de données. Avec le code, les filtres et les réglages spécifiques pour ceux qui veulent aller au-delà de ce que le cœur fournit.

💡 Aperçu rapide:

  • WordPress 6.8 et les versions plus récentes hachent les mots de passe avec l’algorithme bcrypt, le même standard utilisé par les banques et les systèmes gouvernementaux
  • Les anciens hachages (MD5, phpass) sont automatiquement mis à niveau vers bcrypt lors de la prochaine connexion de l’utilisateur; la migration est transparente et ne nécessite aucune action manuelle
  • Le filtre wp_hash_password_algorithm vous permet de passer à Argon2 avec une seule ligne de code, sans extension
  • L’extension PHP Native Password Hash reste une option viable pour les versions antérieures à 6.8 et offre une configuration fine des paramètres d’Argon2 via wp-config.php

Ce qu’est le hachage et pourquoi WordPress en a besoin

Le hachage est une transformation cryptographique à sens unique. À partir d’une chaîne de n’importe quelle longueur, vous obtenez une «empreinte» de taille fixe. Inverser un hachage pour retrouver le mot de passe d’origine est mathématiquement impossible; vous pouvez seulement essayer différentes entrées et comparer les hachages obtenus.

Diagramme de hachage de mot de passe dans WordPress

Contrairement au chiffrement, où les données peuvent être récupérées avec une clé, un hachage est un aller simple. Lorsque vous saisissez un mot de passe à la connexion, WordPress le passe dans la même fonction de hachage et compare le résultat avec ce qui est stocké dans la base de données. S’ils correspondent, l’accès est accordé. Sinon, l’accès est refusé.

WordPress stocke les hachages dans la table wp_users, dans le champ user_pass. Si la base de données fuit (et c’est arrivé même à des géants: LinkedIn, Yahoo et Tumblr ont perdu des centaines de millions d’enregistrements), un attaquant obtient non pas des mots de passe lisibles, mais de longues chaînes bcrypt. Retrouver le mot de passe à partir d’une telle chaîne est impossible. Mais le deviner par une attaque par dictionnaire est possible si l’algorithme est faible ou obsolète. C’est exactement pourquoi l’évolution du hachage dans WordPress est si importante.

Comment WordPress hachait les mots de passe auparavant: MD5 et phpass

Avant la version 2.5 (2008), WordPress utilisait MD5 pur. L’algorithme transforme n’importe quel mot de passe en un hachage de 128 bits composé de 32 caractères hexadécimaux. Cela semble sécurisé, mais MD5 est vulnérable aux tables arc-en-ciel (bases de données précalculées de hachages pour des milliards de mots de passe courants). Un pirate ayant accès à la base de données cherche simplement le hachage dans une telle table et récupère instantanément le mot de passe d’origine.

À partir de la version 2.5, WordPress est passé à phpass, une bibliothèque portable basée sur bcrypt (Blowfish). Elle ajoutait un «sel» aléatoire au mot de passe et exécutait le résultat dans la fonction de hachage plusieurs fois (par défaut, 2^8 = 256 itérations). Le sel rendait les tables arc-en-ciel inutiles: deux mots de passe identiques pour des utilisateurs différents produisaient des hachages différents. En même temps, phpass conservait la rétrocompatibilité avec MD5; les anciens mots de passe ne cassaient pas et étaient mis à niveau en douceur vers le nouveau format lors de la connexion.

Cela a été suffisant pendant de nombreuses années. Mais l’industrie a avancé: le matériel moderne (fermes de GPU et ASIC) peut essayer des milliards de hachages par seconde. L’algorithme bcrypt avec un facteur de coût configurable est devenu le standard de l’industrie. Et à partir de WordPress 6.8, le cœur l’utilise nativement.

WordPress 6.8 et bcrypt: ce qui a changé

La version WordPress 6.8 «Cecil» (avril 2025) a apporté une transition complète vers bcrypt. Auparavant, le cœur utilisait sa propre classe PasswordHash de la bibliothèque phpass; désormais, il appelle la fonction PHP native password_hash() avec la constante PASSWORD_BCRYPT.

Sécurité WordPress via le hachage PHP natif

Changements clés dans la fonction wp_hash_password():

  • bcrypt par défaut. Tous les nouveaux mots de passe sont hachés via password_hash() en utilisant l’algorithme bcrypt et le facteur de coût défini par le serveur PHP (généralement 10).
  • Migration automatique des anciens mots de passe. Lorsqu’un utilisateur se connecte, WordPress vérifie via password_needs_rehash() si le hachage a besoin d’être mis à jour. L’ancien format phpass ($P$...) est remplacé de manière transparente par bcrypt.
  • Protection pour les mots de passe longs. bcrypt tronque les mots de passe de plus de 72 octets, ce qui réduit l’entropie. WordPress 6.8 résout ce problème en pré-hachant avec SHA-384 en utilisant la clé de domaine wp-sha384 et en encodant en base64. Un mot de passe de 100 caractères conserve toute sa force.
  • Filtres pour une configuration flexible. De nouveaux hooks sont apparus: wp_hash_password_algorithm (sélection de l’algorithme) et wp_hash_password_options (paramètres: cost, memory_cost, threads).

L’appel à wp_hash_password() dans le cœur de WordPress 6.8 ressemble à ceci:

1function wp_hash_password( $password ) {
2 global $wp_hasher;
3
4 if ( ! empty( $wp_hasher ) ) {
5 return $wp_hasher->HashPassword( trim( $password ) );
6 }
7
8 if ( strlen( $password ) > 4096 ) {
9 return '*';
10 }
11
12 $algorithm = apply_filters( 'wp_hash_password_algorithm', PASSWORD_BCRYPT );
13 $options = apply_filters( 'wp_hash_password_options', array(), $algorithm );
14
15 if ( PASSWORD_BCRYPT !== $algorithm ) {
16 return password_hash( $password, $algorithm, $options );
17 }
18
19 $password_to_hash = base64_encode(
20 hash_hmac( 'sha384', trim( $password ), 'wp-sha384', true )
21 );
22
23 return '$wp' . password_hash( $password_to_hash, $algorithm, $options );
24}

La fonction vérifie d’abord si la logique de hachage a été remplacée par une extension externe (la variable globale $wp_hasher). Elle rejette ensuite les mots de passe de plus de 4096 caractères; ces tentatives de connexion retournent *, rendant l’authentification impossible. Vient ensuite la partie intéressante: le filtre wp_hash_password_algorithm détermine l’algorithme. Si la sélection n’est PAS bcrypt, le mot de passe est haché directement. Si bcrypt est sélectionné, le mot de passe passe d’abord par SHA-384 avec la clé wp-sha384, est encodé en base64, et seulement ensuite est transmis à password_hash(). Le résultat est un hachage avec le préfixe $wp, qui distingue le bcrypt «WordPress» du bcrypt standard. C’est utile pour les audits de base de données ou l’intégration avec des systèmes externes.

Comment renforcer le hachage avec Argon2

bcrypt est une excellente base. L’étape suivante est Argon2, le vainqueur de la Password Hashing Competition de 2015. Argon2 a été spécifiquement conçu pour résister aux attaques par GPU: il est gourmand en mémoire, et les cartes graphiques sont ici le goulot d’étranglement.

Exemple de code pour passer WordPress en Argon2

Option 1: le hook wp_hash_password_algorithm (WordPress 6.8+)

Ajoutez ceci au fichier functions.php de votre thème enfant ou via l’extension Code Snippets:

1add_filter( 'wp_hash_password_algorithm', function() {
2 return PASSWORD_ARGON2ID;
3});

En quelques secondes, WordPress passe à Argon2ID. Les anciens mots de passe sont automatiquement re-hachés lorsque les utilisateurs se connectent. Votre hébergement doit prendre en charge Argon2 dans PHP; vous avez besoin de la version 7.3 ou plus récente pour Argon2ID. Vous pouvez vérifier la disponibilité en appelant password_algos().

Pour un réglage fin des paramètres, utilisez le hook compagnon:

1add_filter( 'wp_hash_password_options', function( $options, $algorithm ) {
2 if ( PASSWORD_ARGON2ID === $algorithm ) {
3 return array(
4 'memory_cost' => 65536, // 64 MB
5 'time_cost' => 4,
6 'threads' => 2,
7 );
8 }
9 return $options;
10}, 10, 2 );

Le paramètre memory_cost détermine la quantité de mémoire que l’algorithme doit utiliser lors du calcul du hachage; plus la valeur est élevée, plus l’attaque par force brute basée sur GPU devient difficile. time_cost définit le nombre d’itérations, et threads définit le nombre de threads.

Option 2: l’extension PHP Native Password Hash

Pour les versions de WordPress antérieures à 6.8, l’extension PHP Native Password Hash remplit la même fonction. Elle remplace toute la logique de hachage par la fonction native password_hash(), prend en charge bcrypt et Argon2, et ne comporte aucune interface: tous les paramètres se configurent via des constantes dans wp-config.php:

1define( 'WP_PASSWORD_HASH_ALGO', PASSWORD_ARGON2ID );
2define( 'WP_PASSWORD_HASH_OPTIONS', [
3 'memory_cost' => 65536,
4 'time_cost' => 4,
5 'threads' => 2,
6] );

L’extension n’a pas été mise à jour depuis plus de deux ans, mais son code est minimal et stable. Avec WordPress 6.8, sa fonctionnalité est intégrée au cœur du CMS, vous pouvez donc la désinstaller et utiliser les filtres natifs à la place.

Générateurs de hachage: ce qui fonctionne aujourd’hui

Il y a des situations où vous devez générer un hachage manuellement: écrire un mot de passe directement dans la base de données via phpMyAdmin ou migrer des utilisateurs depuis un système externe.

Générateur de hachage de mot de passe WordPress via WP-CLI

Le générateur en ligne de passwordtool.hu, très utilisé à l’époque des anciennes versions de WordPress, n’est plus disponible: le site a changé de propriétaire. Voici des alternatives qui fonctionnent aujourd’hui:

  • WP-CLI: la commande wp user update <id> --user_pass="newpassword" fait tout correctement via wp_hash_password(). Rapide, sécurisé et garanti conforme.
  • Un script PHP à la racine du site: créez temporairement un fichier contenant un appel à echo wp_hash_password('password'); et supprimez-le immédiatement après usage.
  • N’importe quel générateur bcrypt en ligne: par exemple, bcrypt.online. Mais attention: WordPress 6.8 ajoute le préfixe $wp et un pré-hachage SHA-384, donc un hachage bcrypt standard ne fonctionnera pas pour une insertion directe en base de données.

En pratique, WP-CLI est l’option la plus fiable.

Comment choisir un mot de passe qui ne sera pas craqué

Même bcrypt ne vous sauvera pas si le mot de passe est admin123. Les pirates commencent leur attaque par une force brute sur dictionnaire.

Interface de vérification de la force du mot de passe WordPress

L’outil zxcvbn de Dropbox, intégré à WordPress pour l’évaluation des mots de passe dans l’administration, rejette les motifs courants: dates de naissance, 123456 et qwerty, noms d’animaux. Il analyse les mots de passe par rapport à des dictionnaires, des dispositions de clavier et des schémas de substitution de caractères. Une évaluation «faible» signifie que le mot de passe peut être deviné en quelques secondes.

Trois règles pratiques:

  • Des mots aléatoires, pas une soupe de caractères. Un mot de passe composé de quatre ou cinq mots anglais sans rapport, avec des séparateurs (par exemple, correct-horse-battery-staple) est plus facile à retenir que Tr0ub4dor&3 et prend bien plus de temps à craquer.
  • La longueur compte plus que la complexité. Seize lettres minuscules aléatoires offrent une entropie supérieure à 8 caractères avec des symboles spéciaux. Et bcrypt dans WordPress 6.8 préserve l’entropie des mots de passe de toute longueur raisonnable grâce au pré-hachage SHA-384.
  • Utilisez un gestionnaire de mots de passe. La mémoire humaine est un piètre outil pour gérer une douzaine de mots de passe uniques. 1Password est la référence payante avec un forfait familial, KeePass est un logiciel libre gratuit avec une base de données locale, Bitwarden est le juste milieu: gratuit, dans le cloud et open source.
Gestionnaire de mots de passe pour stocker les identifiants WordPress

Un gestionnaire de mots de passe génère, stocke et remplit automatiquement les mots de passe. Vous n’avez qu’un seul mot de passe maître à retenir. Et si le site prend en charge l’authentification à deux facteurs, activez-la sans hésiter. Un mot de passe associé à un code à usage unique provenant d’une application rend la connexion pratiquement invulnérable.

Vidéo: comment fonctionne le hachage des mots de passe dans WordPress

Une brève explication du mécanisme de hachage, de la saisie du mot de passe jusqu’à son stockage dans la base de données WordPress:

⁉️🤔 Foire aux questions

Les mots de passe hachés avec l’ancien MD5 fonctionnent-ils encore sous WordPress 6.8+?

Oui. Lorsqu’un utilisateur se connecte, WordPress détecte l’ancien format de hachage, vérifie le mot de passe avec l’algorithme précédent et, si tout est correct, met à niveau le hachage vers bcrypt de manière transparente. Il n’est pas nécessaire de supprimer les anciens utilisateurs ni de forcer une réinitialisation des mots de passe.

Le plugin PHP Native Password Hash est-il nécessaire sur WordPress 6.8 et versions ultérieures?

Non. Tout ce que faisait le plugin (hachage via password_hash() et prise en charge d’Argon2) est désormais disponible via les filtres natifs wp_hash_password_algorithm et wp_hash_password_options. Le plugin ne reste pertinent que pour les versions antérieures à 6.8.

Puis-je revenir d’Argon2 à bcrypt?

Techniquement oui, en changeant l’algorithme dans le filtre. Mais les anciens hachages Argon2 ne seront pas reconnus et les utilisateurs devront réinitialiser leur mot de passe. Si vous testez des algorithmes sur un site en production, faites d’abord une sauvegarde complète de la base de données.

Est-ce que bcrypt protège en cas de fuite de la base de données?

bcrypt rend la force brute sur des hachages divulgués des centaines de milliers de fois plus lente qu’avec MD5. Avec un facteur de coût de 10, un hachage sur un processeur moderne prend environ 0,1 seconde à calculer; un milliard de tentatives prendrait des années. Mais si le mot de passe est password, il sera trouvé dès la première itération d’une attaque par dictionnaire. L’algorithme protège les mots de passe complexes; rien ne peut sauver les mots de passe faibles.

Comment vérifier que mes mots de passe sont bien hachés avec bcrypt?

Consultez la table wp_users via phpMyAdmin. Le champ user_pass pour les nouveaux utilisateurs (et ceux qui se sont connectés après la mise à jour vers 6.8) doit commencer par le préfixe $wp (le marqueur du nouveau format bcrypt de WordPress). Les anciens hachages phpass ressemblent à $P$B.... Pour une vérification en masse, exécutez cette requête SQL: SELECT COUNT(*) FROM wp_users WHERE user_pass NOT LIKE '$wp$%' AND user_pass NOT LIKE '$P$%';. Elle vous indiquera combien de mots de passe sont restés dans un format obsolète, le cas échéant.

Que faire dès maintenant pour le hachage dans WordPress

Si votre site WordPress est en version 6.8 ou ultérieure, vous êtes déjà protégé par bcrypt; vous n’avez rien à faire. Le cœur met automatiquement à niveau les anciens hachages lorsque les utilisateurs se connectent, et la migration est totalement transparente.

Si vous souhaitez utiliser Argon2, ajoutez le filtre wp_hash_password_algorithm avec PASSWORD_ARGON2ID dans votre fichier functions.php. Vérifiez d'abord que votre hébergement prend en charge Argon2: exécutez var_dump(password_algos()); via un script de test. La plupart des hébergeurs modernes le supportent.

Pour les versions antérieures à 6.8, installez l'extension PHP Native Password Hash; elle vous fournira bcrypt ou Argon2 sans avoir à modifier le cœur de WordPress. Profitez-en pour planifier une mise à jour de WordPress: chaque version majeure corrige des dizaines de vulnérabilités, et pas uniquement au niveau du hachage.

Et surtout, remplacez admin123 par quelque chose de convenable. Aucun algorithme ne vous protégera d'une attaque par dictionnaire si votre mot de passe figure dans les cent premières entrées de la liste rockyou.txt.