Estoy desconcertado por el código hash (ASCII) almacenado en Linux (Ubuntu) /etc/shadow.
Tomando un caso hipotético, sea la contraseña'prueba', sal sea'Zem197T4'.
Al ejecutar el siguiente comando,
$ mkpasswd -m SHA-512 test Zem197T4
Se genera una larga serie de caracteres ASCII (así es como Linux almacena en /etc/shadow)
$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0
Cuando se utiliza el generador SHA-512 en línea (p. ej.http://www.insidepro.com/hashes.php?lang=eng), lo que se genera es un código hexadecimal como se muestra a continuación:
opción 1) contraseña+sal
8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2
opción 2) sal+contraseña
b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2
Creo que este código hexadecimal debería ser "lo mismo" que el código ascii generado por mkpasswd. ¿Pero cómo se relacionan?
¿Espero que alguien pueda iluminarme?
Respuesta1
En Ubuntu/Debian mkpasswd
es parte del paquetequién ese implementado en mkpasswd.c
el cual, en realidad, es solo un contenedor sofisticado alrededor de la crypt()
función en glibc declarada en unistd.h
. crypt() toma dos argumentos contraseña y sal. La contraseña es "prueba" en este caso, salt se antepone "$6$" para el hash SHA-512 (consulteCripta SHA) por lo que "$6$Zem197T4" se pasa a crypt().
Quizás hayas notado la -R
opción mkpasswd
que determina el número de rondas. En el documento encontrarás un valor predeterminado de 5000 rondas. Esta es la primera pista de por qué el resultado nunca sería igual a la simple concatenación de salt y contraseña, no se aplica hash solo una vez. En realidad, si apruebas -R 5000
obtienes el mismo resultado. En este caso, "$6$rounds=5000$Zem197T4" se pasa a crypt() y la implementación en glibc (que es la libc de Debian/Ubuntu) extrae el método y el número de rondas de esto.
Lo que sucede dentro de crypt() es más complicado que simplemente calcular un único hash y el resultado al final está codificado en base64. Es por eso que el resultado que mostraste contiene todo tipo de caracteres después del último '$' y no solo [0-9a-f] como en la típica cadena hexadecimal de un hash SHA-512. El algoritmo se describe en detalle en el ya mencionado.Cripta SHAdocumento.
Respuesta2
La idea de usar una contraseña salada es que cada vez que generas un hash para la misma contraseña obtienes un resultado diferente. Esto es para evitar problemas con las mesas arcoíris.
Supongamos que uno de sus usuarios usa una contraseña débil, digamos 123456, su /etc/shadow quedó expuesto. Ahora todo lo que el malvado hacker tiene que hacer es usar una tabla de arcoíris para descubrir la contraseña débil y usarla nuevamente en otros lugares.