Bonjour à tous !
Aujourd'hui un de mes soucis à été de rechercher dans Wordpress la méthode de cryptage des mots de passe, pour pouvoir lier une table contenant des mots de passe existants à une base de données consacrée à Wordpress. Je ne sais pas si ce que j'ai trouvé sera utilisable pour ma problématique, mais vu le temps que j'ai passé dessus, je me demande si ça ne vaudrait pas le coup de l'écrire ici, histoire que Google puisse donner un réponse la prochaine fois qu'on lui posera la question en français.
Donc, j'ai trouvé quelle méthode de cryptage Wordpress utilise pour ses mots de passe, et j'aimerais savoir où je peux poster cette découverte pour qu'elle puisse servir à d'autres.
Pour récupérer la méthode de cryptage de Wordpress :
Aller dans wp-includes, regarder le fichier pluggable.php :
- vers la ligne 1495 vous avez une fonction qui s'appelle wp_hash_password et qui prend pour paramètre le mot de passe en clair.
- vers la ligne 1529, juste en dessous de wp_hash_password, il y a wp_check_password, qui lui s'occupe de vérifier le mot de passe.
Ces deux fonctions utilisent la classe PasswordHash, totalement indépendante et qu'on peut trouver à part sur internet. Cette classe contient deux méthodes qui nous intéressent : HashPassword($password) et CheckPassword($password, $stored_hash).
Aller dans wp-includes, regarder le fichier class-phpass.php :
- HashPassword($password) prend le mot de passe en clair qui lui est donné et le crypte, puis retourne la chaîne cryptée.
- CheckPassword($password, $stored_hash) prend un mot de passe en clair et une chaîne cryptée et compare les deux. Il retourne vrai si le mot de passe en clair correspond au mot de passe crypté et faux sinon.
Les deux fonctions précédentes créent une instance globale (pour avoir un singleton) de PasswordHash avec pour paramètre 8 et true (aucune idée de ce à quoi servent ces arguments), et utilisent ensuite les méthodes de classe HashPassword() et CheckPassword() pour leurs vérifications.
Pour utiliser ça, j'ai fabriqué un petit bout de php test que j'ai mis à part dans un dossier avec le fichier class-phpass.php, je vous donne mon code :
C'est pas forcément très clair, mais il me semble qu'on peut s'en servir comme ça. Wordpress lui vérifie dans wp_check_password si le mot de passe enregistré a été fabriqué via phpass, pour être sûr. Je n'ai pas utilisé la fonction de wordpress pour la vérification, par contre wp_hash_password() de mon fichier est pûrement copiée collée du fichier pluggable.php.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 <?php require_once( './class-phpass.php'); /** * (PHP 4, PHP 5)<br/> * Strip whitespace (or other characters) from the beginning and end of a string * @link http://php.net/manual/en/function.trim.php * @param string $str <p> * The string that will be trimmed. * </p> * @param string $charlist [optional] <p> * Optionally, the stripped characters can also be specified using * the <i>charlist</i> parameter. * Simply list all characters that you want to be stripped. With * .. you can specify a range of characters. * </p> * @return string The trimmed string. */ //function trim ($str, $charlist = " \t\n\r\0\x0B") {} /** * Create a hash (encrypt) of a plain text password. * * For integration with other applications, this function can be overwritten to * instead use the other package password checking algorithm. * * @since 2.5 * @global object $wp_hasher PHPass object * @uses PasswordHash::HashPassword * * @param string $password Plain text user password to hash * @return string The hash string of the password */ function wp_hash_password($password) { global $wp_hasher; if ( empty($wp_hasher) ) { require_once( './class-phpass.php'); // By default, use the portable hash from phpass $wp_hasher = new PasswordHash(8, true); } return $wp_hasher->HashPassword( trim( $password ) ); } $mdp_en_base = "wp"; $mdp_recup_via_form = "wp"; echo "mdp : $mdp_en_base<br><br>"; $crypt = wp_hash_password($mdp_en_base); echo "mdp crypte :".$crypt."<br><br>"; echo "mdp qu'on récupère dans le champ de connexion : $mdp_recup_via_form <br><br>"; $test = $wp_hasher->CheckPassword($mdp_recup_via_form , $crypt); echo "resultat du test :"; var_dump($test);
Voilà, donc si c'est de la redite, désolée, si je n'ai pas posté au bon endroit (ce qui est sûrement le cas), dites-le moi, ou déplacez mon post sans préavisJ'espère que ça sera utile pour vous !
Ci-dessous, la même en anglais :
http://wordpress.stackexchange.com/q...crypt-password
[Edit]
La personne qui en avait besoin m'a dit que ça marche *fière* donc n'hésitez pas à l'utiliser.
Si vous regardez bien, lorsque vous affichez votre $cryp, il change sans que vous changiez le mot de passe : par exemple si vous ouvrez le test.php avec votre navigateur, et que vous actualisez la page, vous verrez la chaîne changer ! Il faut donc bien utiliser le check de la classe PasswordHash pour les vérifications![]()
Partager