Hash y Seguridad

Generador de Hash de Contraseña MySQL

Genera un hash PASSWORD() de MySQL 4.1+ para servidores MySQL heredados.

Valora esta herramienta

Cómo usar Generador de Hash de Contraseña MySQL

  1. Escribe o pega la contraseña en el cuadro.
  2. El hash de 41 caracteres aparece mientras escribes, comenzando con un asterisco.
  3. Cópialo directamente en tu fila heredada de mysql.user.

Acerca de Generador de Hash de Contraseña MySQL

Esta es la función PASSWORD() de MySQL tal como ha funcionado desde MySQL 4.1 en adelante. El algoritmo es SHA-1 aplicado dos vecesSHA1(SHA1(contraseña)) sobre los bytes en bruto — con el resultado escrito en hexadecimal mayúsculas tras un asterisco inicial, dando 41 caracteres en total. El asterisco no forma parte del resumen; es un marcador que le indica a MySQL que este es el formato de la era 4.1, en lugar del hash más corto de 16 caracteres que existía antes. Si quieres ver la primitiva subyacente por sí sola, nuestro generador de SHA-1 realiza una sola pasada.

Fíjate en lo que falta: no hay salt. Dos cuentas con la misma contraseña obtienen la misma cadena de 41 caracteres, y SHA-1 es rápido, así que este formato ofrece muy poca resistencia frente a un atacante que tenga tu tabla mysql.user. MySQL lo sabe: PASSWORD() quedó obsoleta en MySQL 5.7 y se eliminó por completo en MySQL 8.0, que usa caching_sha2_password como su complemento de autenticación por defecto.

Así que el caso de uso honesto es el legado: estás trabajando con un servidor antiguo, o necesitas establecer una fila de mysql.user directamente en lugar de pasar por SET PASSWORD, o estás migrando cuentas desde un sistema que aún almacena estos hashes. Todo eso está bien. Lo que no deberías hacer es tomar prestado este formato para las contraseñas de tu propia aplicación: no tiene salt, es rápido y ha sido eliminado por su propio fabricante. Usa bcrypt en su lugar.

Preguntas frecuentes

¿Por qué el hash comienza con un asterisco?

El asterisco marca el formato de MySQL 4.1+ y lo distingue del hash anterior de 16 caracteres previo a la versión 4.1. Es un prefijo, no parte del resumen: el hash en sí son los 40 caracteres hexadecimales que le siguen, para un total de 41.

¿Todavía existe PASSWORD() en MySQL 8?

No. Quedó obsoleta en MySQL 5.7 y se eliminó en MySQL 8.0, que usa caching_sha2_password por defecto. Esta herramienta es para servidores heredados y migraciones.

¿Por qué es un problema que sea sin salt y rápido?

Sin salt, contraseñas idénticas producen hashes idénticos en todas las cuentas, así que una tabla de consulta precalculada ataca toda la tabla a la vez y los duplicados son visibles de un vistazo. SHA-1 también es extremadamente rápido, así que una tabla mysql.user robada puede atacarse a velocidades enormes. Hashear dos veces no ralentiza esto de forma significativa.

¿Puedo usar esto para las contraseñas de usuario de mi aplicación?

Por favor, no. No tiene salt, es rápido y se eliminó de MySQL moderno. Almacena hashes bcrypt o Argon2 en una columna normal en su lugar.

¿Se almacena mi contraseña?

No. Se envía a nuestro servidor para ser hasheada, porque los navegadores no pueden calcular SHA-1 en esta forma exacta de doble pasada, y luego se hashea y se descarta de inmediato: nunca se registra ni se almacena.