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 !

 

Karine SANCHE

Partager cet article