Lors de la migration d’une application de MySQL 4 vers MySQL 5, j’ai été confronté à quelques petits problèmes avec la fonction PASWORD().
Je vous en fais donc part afin de vous éviter de perdre du temps…
La fonction PASSWORD() qui encryptait les mots de passe sur 16 bits avec MySQL4.0 les encode maintenant sur 41 bits. Donc si votre application utilise cette fonction, vous aurez des problèmes lors de sa migration. D’ailleur, pour être exact, cette modification est faite avec MySQL 4.1 !
Bon rassurez vous, même si MySQL n’a pas assuré la compatibilité ascendante, il esxiste quelques solutions.
1. Tout d’abord vous pouvez faire démarrer votre serveur avec l’option –old-passwords. Il s’agit juste d’une option a rajouter lors du démarrage de MySQL ; cette option peut être ajoutée directement dans le script de démarrage. Ainsi votre serveur fonctionnera avec l’ancienne fonction PASSWORD();
Personnelement je n’aime pas cette solution, même si elle est très rapide à mettre en oeuvre, car elle oblige à déprécier notre serveur. Tant qu’à faire j’aimerais bien pouvoir utiliser cette nouvelle fonction PASSWORD(). Elle est quand même plus sécurisée.
2. La seconde possibilité se rapproche de la première, puisqu’elle consiste en l’ajout d’une ligne d’option dans le fichier de configuration my.cnf.
old_passwords
Je n’aime pas non plus cette solution pour les mêmes raisons que la précédente.
3. La dernière solution est surement la plus efficace. MySQL a renommé l’ancienne fonction en OLD_PASSWORD();
Vous pouvez donc utiliser cete fonction dans votre code. Il est certain que cette solution n’est as la plus rapide à mettre en place. Mais en réfléchissant un peu, on imagine facilement une petite modification de notre fonction d’authentification qui utiliserait l’ancienne fonction et la nouvelle. Ainsi le passage des mots de passe sur 41 bits se ferait en douceur, et les mots de passe en cours seraient gardés.
La requete pourrait être la suivante :
SELECT ( IF( PASSWORD( text ) = password_column, 1, IF( OLD_PASSWORD( text ) = password_column, 1, 0 ) ) FROM user_table
On pourrait imaginer une méthode d’authentification comme la suivante :
<?php if mon_mot_de_passe < 16_caractères then //J'authentifie avec l'ancienne fonction }else{ //J'authentifie avec la nouvelle fonction } ?>
Et pour vérifier la longeur du champ password :
select LENGTH(password) from user where user="mon_user";
Alors j’espère que cette info vous servira et vous permettra, soit de réfléchir au process avant votre migration, soit de vous dépanner si vous ignoriez ce problème.
Pour finir, sachez aussi que la table mysql.user possède des champs supplémentaires par rapport à la version 4. Ces champs correspondent aux privilèges pour les vues, les procédures ou autres nouveautés.
Donc si vous avez des insertions directes dans cette table, méfiez vous …

Posté dans
Tags: