¿Cómo se codifica un hash de contraseña en el archivo de contraseña oculta?

11

Estoy aprendiendo sobre la seguridad de la contraseña de Linux (más curiosidad que cualquier cosa útil), y entiendo que la contraseña real está cifrada y almacenada en el archivo de contraseña oculta. Lo que no estoy seguro, y no he podido encontrar en mi breve búsqueda en Google, es qué codificación se utiliza para codificar el valor hash (y el valor de la sal). Obviamente no es hexadecimal, y obviamente es texto, excluyendo el :carácter. ¿Alguien puede decirme qué es esa codificación?

Editar: entiendo el hashing (MD5, SHA-X), la sal y el especificador de hashing. Lo que estoy buscando es el método de convertir los resultados hash (una matriz de bytes (byte [])) a la secuencia de caracteres que veo en el archivo, es decir: la codificación.

Cruzar
fuente
Su pregunta está muy relacionada con esta pregunta.
Broam

Respuestas:

11

En el caso de MD5 crypt (), la sal es solo una cadena aleatoria de hasta 8 caracteres de [a-zA-Z0-9./].

La sal y la contraseña se combinan, pasan a través de una función de fortalecimiento y luego se codifican con una variante en Base64:

  • el estado MD5 (128 bits) se baraja y se divide en 6 grupos, cada uno con 3 bytes (el grupo final incluye 2 bytes de relleno cero)
  • cada grupo de 3 bytes se divide en 4 bloques de 6 bits cada uno
  • finalmente, cada grupo de 6 bits se asigna a un personaje en el rango [a-zA-Z0-9./]
SimonJ
fuente
8

Si solo desea saber cómo se codifica la contraseña, crypt () utiliza un tipo especial de codificación Base64.

La codificación Base64 utiliza el siguiente conjunto de caracteres: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

Mientras que la codificación crypt () usa este juego de caracteres: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Además, a diferencia de Base64, no hay relleno "=".

Por otro lado, las implementaciones crypt () de MD5, SHA-X, etc. hacen más que solo generar una sal aleatoria, ejecutar la función hash y codificarla usando la codificación anterior.

Recomiendo leer estas dos excelentes publicaciones: "Hashing de contraseñas con MD5-crypt en relación con MD5" e "Implementación de SHA512-crypt vs MD5-crypt" , para una explicación más completa.

Marco
fuente
2

¿Estás buscando el algoritmo utilizado?

Tradicionalmente, Unix y las primeras variantes de Linux usaban un DES debilitado basado en un máximo de 8 caracteres de la contraseña. La mayoría de las instalaciones modernas de Linux usan hash MD5 para las contraseñas, y algunas admiten SHA. Además, ha aparecido más soporte modular para algoritmos adicionales, incluido Blowfish. La biblioteca GNU utilizada por la mayoría de los Linux soporta DES, MD5 y SHA, ofreciéndole un par de opciones.

El tipo específico de algoritmo hash utilizado se especifica como el comienzo de la contraseña como $ DIGIT $. Por ejemplo, $ 1 $ es MD5.

Puede obtener detalles más detallados de Wikipedia (consulte la página en Crypt_ (Unix) ) o google para 'crypt unix' o 'crypt linux'.

Christopher Cashell
fuente