Passer au nouveau format de mot de passe sous MySQL
Il y a quelques temps, je me suis enfin dĂ©cidĂ©e Ă passer sous WAMP, après plus de 10 ans sous EasyPHP 1.8. OK, j'ai un peu traĂ®nĂ©. Il faut dire que je m'y Ă©tais attachĂ©e, Ă mon EasyPHP… Il fonctionnait très bien (ou je m'Ă©tais habituĂ©e Ă ses bugs, au choix). L'ennui, c'est qu'avec EasyPHP 1.8, je trouvais limitĂ©e Ă php 4. Or dĂ©jĂ php 5.3 n'est plus maintenue depuis le 14 aoĂ»t 2014, alors php 4, vous imaginez… (d'ailleurs si vous ĂŞtes chez OVH, vous avez sans doute reçu un mail dĂ©but mars 2015 vous invitant Ă migrer votre site en php vers des versions plus rĂ©centes).
J'ai donc dĂ©placĂ© les rĂ©pertoires de mes sites et applications php (enfin, la quinzaine dont j'assure encore la maintenance active. Les projets bouclĂ©s, bon, hein…) vers le www/ de Wamp. J'ai crĂ©Ă© les bases correspondantes sous phpMyAdmin. Pour migrer les tables, j'ai simplement dĂ©placĂ© les fichiers correspondant (les .myd .myi et .frm, qu'est ce que c'est pratique, ça) du rĂ©pertoire \EasyPHP1-8\mysql\data\<nom_table> vers \wamp\bin\mysql\mysql5.6.12\data\<nom_table>.
Ensuite, il a fallu activer les short_tags (parce qu'il me reste encore des vieux scripts contenant des balises <? ?>), et nettoyer quelques vieilles fonctions qui n'existent plus (telles session_is_registered, eregi, split).
Tout se passait (plutĂ´t) bien, jusqu'Ă ce que j'essaie de me connecter Ă une base de donnĂ©es hĂ©bergĂ©e sur un serveur distant (un serveur dĂ©diĂ©)…
mysqlnd cannot connect to MySQL 4.1+ using old authentication
Qu'est ce que c'est encore que cette histoire ?
Les mots de passe permettant d'accéder aux bases MySQL sont stockées dans la base mysql, table user. Du temps de MySQL 4, ces mots de passe étaient encodés sur 16 caractères. La nouvelle norme voudraient qu'ils le soient sur 41.
Mon serveur distant dĂ©diĂ© est pourtant en MySQL  5.0.45… Mais visiblement ce n'est pas suffisant (il a Ă©tĂ© mis en service en 2009).
Sur le serveur distant, je me connecte Ă phpMyAdmin.
La requête « show variables » me renvoie tous les paramètres de mon MySQL. Et notamment old_passwords ON
Dans la base mysql, si j'exécute cette requête pour connaitre la longueur des mots de passe
SELECT User, Host, LENGTH(Password) FROM mysql.user
J'ai la valeur 16 pour tous les mots de passe stockés.
Je me mets à la recherche de mon fichier my.cnf afin de modifier ça. Je le trouve dans le répertoire /etc
Il ressemble à ça
[mysqld]
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Je commente la ligne old_passwords=1 en la faisant précéder d'un dièse, je sauvegarde.
Aucun effet. Dans une fenêtre de ligne de commande (Putty), je redémarre le service mysql avec :
service mysqld restart
(mysqld restart tout court me renvoie une erreur)
Le redémarrage est très rapide. Même pas besoin de me ré-authentifier auprès de phpMyAdmin.
Dans phpMyAdmin, un nouveau « show variables » me renvoie old_passwords OFF
Reste dĂ©sormais Ă mettre Ă jour ce fameux mot de passe. Disons que l'utilisateur soit ‘monutilisateur' et que ce mot de passe soit ‘monmotdepasse'
Sous phpMyAdmin, je saisis cette commande dans le champ requĂŞte SQL
UPDATE mysql.user SET Password = PASSWORD('monmotdepasse') WHERE User = 'monutilisateur' limit 1;
Et je conclus par un triomphal
FLUSH PRIVILEGES;
Pour vérifier que cela a fonctionné, je refais
SELECT User, Host, LENGTH(Password) FROM mysql.user
Et là je peux lire 41 au niveau de la ligne qui m'intéressait
Et mon système de connexion à distance refonctionne !