Pregunta de código de hash salado SHA512

Estoy desconcertado por el código hash (ASCII) almacenado en Linux (Ubuntu) / etc / shadow.

Tomando un caso hipotético, deje que la contraseña sea 'testing' , sal sea 'Zem197T4' .

Al ejecutar el siguiente command,

$ mkpasswd -m SHA-512 test Zem197T4 

Se genera una larga serie de caracteres ASCII (Esta es la forma en que Linux almacena en / etc / shadow)

 $6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0 

Cuando se utiliza el generador en línea SHA-512 (por ejemplo, http://www.insidepro.com/hashes.php?lang=eng ), lo que se genera es un código hexadecimal como el siguiente:

opción 1) contraseña + sal

 8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2 

opción 2) sal + contraseña

 b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2 

Creo que estos códigos hexadecimales deberían ser "lo mismo" que el código ascii generado por mkpasswd. Pero, ¿cómo están relacionados?

Espero que alguien pueda iluminarme?

En Ubuntu / Debian mkpasswd es parte del package whois e implementado en mkpasswd.c que en realidad es solo un contenedor sofisticado alnetworkingedor de la function crypt() en glibc declarada en unistd.h . crypt () toma dos arguments contraseña y sal. La contraseña es "testing" en este caso, la sal viene precedida por "$ 6 $" para el hash SHA-512 (ver SHA-crypt ) por lo que "$ 6 $ Zem197T4" se pasa a crypt ().

Quizás hayas notado la opción -R de mkpasswd que determina el número de rondas. En el documento, encontrará un valor pnetworkingeterminado de 5000 rondas. Este es el primer indicio de por qué el resultado nunca sería igual a la simple concatenación de sal y contraseña, no es hash solo una vez. En realidad, si pasas -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 solo computar un solo hash y el resultado es base64 codificado al final. Es por eso que el resultado que mostró contiene todo tipo de caracteres después del último '$' y no solo [0-9a-f] como en la cadena hexadecimal típica de un hash SHA-512. El algorithm se describe en detalle en el documento SHA-Crypt ya mencionado.