Â
    Recientemente hemos adquirido en mi empresa una aplicación de terceros que trabaja sobre una base de datos cliente-servidor. Bien, resulta que, a pesar de que la aplicación solo dice funcionar sobre Windows, descubrà que el motor de base de datos es MySQL. Entonces, ¿por qué consumir una licencia de Windows Server si, por nada de dinero, podemos tener un servidor consumiendo menos recursos y funcionando de forma más óptima? Me decidà a instalar Linux y optimizarlo con un MySQL y ya está.
    El resultado final es que, con una máquina virtual de 256 MB corriendo un Debian ligero y MySQL, he obtenido mejores resultados que colocando el servidor basado en Windows Server.
    Pero ese no es el tema de este artÃculo. El problema es que la aplicación estaba diseñada para MySql 4.0.15. Esta versión es bastante antigua y claro, de ser posible, ¿por qué no actualizar a la nueva versión?. Asà que puse MySQL 5.0 y empezaron los problemas.
    Lo que realmente me llevó a quebrarme la cabeza fue que, por más que probaba, no conseguÃa hacer que la aplicación accediese a la base de datos. Bueno, miento. Si dejaba la clave del usuario de MySQL en blanco si que accedÃa. ¿Qué esta ocurriendo?. Pues bien, sigue leyendo este artÃculo y descubrirás el por qué de todo esto.
    Primero, un poquito de introducción sobre los usuarios en MySQL.
    Las cuentas de usuario en MySQL se almacenan en la tabla users de la base de datos mysql. Cada cuenta de usuario de MySQL tiene asignada una clave que se almacena encriptdada en la columna Password. Al mecanismo de encriptación de la clave si conoce como Password Hashing Method. Si lo deseas, puedes consultar la documentación oficial de MySQL en el siguiente enlace para obtener información detallada sobre este y otros temas relacionados con la seguridad en MySQL.
    A partir de la versión 4.1 de MySql, fue actualizado el Password Hashing Method con el principal objetivo de mejorar la seguridad reduciendo el riesgo de “adivinar” o interceptar las claves que viajan por la red. Sin embargo, este mecanismo nuevo sólo es entendido por versiones 4.1 y superiores, lo cual puede ocasionar problemas de compatibilidad. Pues ya está, si hay posibilidad de que existan problemas yo fijo que me los encuentro …
    Antes de la versión 4.1, los hashes que MySQL generaba cuando usábamos la función PASSWORD(”) tenÃan una longitud de 16 bytes. A partir de la versión 4.1, la función PASSWORD(”) fue modificada para que generase hashes de 41 bytes. A continuación puedes ver un ejemplo de la tabla user:
    Como podréis comprobar, los hashes de los primeros usuarios difieren de los de los últimos. En efecto, en esta tabla podemos observar passwords con formato nuevo de 41 bytes y passwordos con formato antiguo de 16 bytes. Otra diferencia entre ambos es que los nuevos passwords empiezan siempre por el carácter *, mientras que los antiguos nunca tienen este carácter.
Â
Â
Â
¡¡Ahà está mi problema!! Cuando la aplicación, que está diseñada para acceder a MySQL 4.0.15, intentaba acceder al servidor, le proporcionaba un hash generado en formato 16 bytes. Sin embargo, el servidor tenÃa alojado el formato de 41 bytes. Y claro, nunca iban a coincidir. Nunca nos Ãbamos a autentificar bien.
    Veamos ahora la solución. Sabemos que para conceder permisos a un usuario nuevo, para una base de datos, en MySQL y como administradores deberemos ejecutar la siguiente orden:
GRANT ALL ON basededatos.* TO ‘usuario’@'hots_o_%’ IDENTIFIED BY PASSWORD(‘clave’);
    Esta orden crea el usuario en la tabla user y almacena su hash en formato 41 bytes. Para especificar a MySQL que genere el hash en formato antiguo de 16 bytes deberemos usar la función OLD_PASSWORD(”) en vez de PASSWORD(”):
GRANT ALL ON basededatos.* TO ‘usuario’@'host_o_%’ IDENTIFIED BY OLD_PASSWORD(‘clave’);
    Al realizar esto, podremos comprobar los resultados intentando conectar desde la aplicación antigua.
Â
   Por último, recordad que deberemos ejecutar, desde la lÃnea de comandos, la siguiente sentencia para que MySQL refresque los permisos:
$ mysqladmin -u root -p flush-privileges
Â
   Espero que este artÃculo te ayude. Yo terminé con la cabeza quebrada.
   La documentación oficial sobre este asunto la puedes consultar en el siguiente enlace:
http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html















