General

MySql. Cambios en el formato de los hash de contraseña a partir de la versión 4.1.

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 este enlace.

¿Qué te ha parecido este artículo?

¡Espero que te haya gustado! ¿Me permites pedirte un favorcito?

1. Participa con tu comentario

Los comentarios son el alma de este blog. Aquí se premia la participación y la comunidad es lo más. ¡Prueba!

Dejar un comentario

2. ¡No olvides compartirlo!

Se llama generosidad: si algo te gusta y puedes compartirlo, ¿por qué no hacerlo?

¡Millones de gracias! Te lo agradezco un montonazo, de verdad.

Acerca del autor

Víctor Campuzano

Growth Hacker no soy, pero lo vivo. De mi blog no vivo, pero aquí si que soy como soy. Marketing Digital, Creatividad y Blogging con pasión y desenfado.

Hazte notar. ¡Participa!

*

Uso de cookies

Esta web utiliza cookies propias y de terceros, como Google Analytics, para optimizar su navegación y realizar tareas de análisis y las pertenecientes a WordPress. Advierto que si continuas navegando, aceptas su uso. Puede cambiar la configuración, desactivarlas u obtener más información.

ACEPTAR
Aviso de cookies
Víctor Campuzano

¡Muchísimas gracias por comentar!

Has hecho algo muy grande, que lo sepas. Te estoy tan agradecido que me gustaría ofrecerte un regalo: un ebook sobre "Growth Hacking para impulsar rápidamente tu proyecto". Bueno, y algunas cositas extra que descubrirás si te suscribes. ¿Me aceptarías en tu buzón? Porfi, porfi, porfi...

¡Perfecto! Te has suscrito correctamente

Víctor Campuzano

¡Ey que te mola mi blog ¿eh?!

He detectado que has visto más de 3 páginas en esta sesión y, digo yo... ¿Te está molando? Si es así, suscríbete y recibirás cada nuevo post en tu buzón, regalos exclusivos, contenido privado.. ¡Lo más de mi! ¿Quieres? ¿Si? ¡Bien!

¡Perfecto! Te has suscrito correctamente