¿Cómo cifra linux las contraseñas?
Recientemente en el artículo donde explicaba los ficheros de usuario principales /etc/passwd y /etc/shadow/ comenté con detalle que significaba cada campo, pero si lo recordáis a la hora de explicar el campo 2 del /etc/shadow sólo puse textualmente:
<password cifrado> Pues eso…
Pero lo bueno se hace esperar y quería dedicar un artículo a completar esa información pues creo que aun no siendo un experimentado en cifrado de contraseñas, hay algunos conceptos que está bien conocer o repasar.
Tomamos como ejemplo este usuario de mi equipo local:
m3t4g4m3:$6$OrqRmooe$2XSkIJNgd3Te/xPUd6S1wdysNgPhFrT7UFHkbhvjECkt/L9Z3rmqBUbRDBcfLf4sz/Z775X.WgJTaijVG7mhn1:15754:0:99999:7::
Esta es mi contraseña cifrada:
$6$OrqRmooe$2XSkIJNgd3Te/xPUd6S1wdysNgPhFrT7UFHkbhvjECkt/L9Z3rmqBUbRDBcfLf4sz/Z775X.WgJTaijVG7mhn1
En términos de cifrado hay varios algoritmos (de cifrado seguro) hash usados. el número destacado en rojo $6$ indica en qué tipo de hash está mi contraseña cifrada, en este caso se trata de SHA-512, (Secure Hash Algorithm) y por lo tanto tiene 86 caracteres en total.
Este es un resumen de los más conocidos cuando os los encontréis en este fichero, dependiendo del primer número entre símbolos $ será una codificación u otra.
$1$=MD5 (22 caracteres) $2$=blowfish $5$=SHA-256 (43 Caracteres) $6$=SHA-512 (86 Caracteres)
Al poner una contraseña a un usuario, una función hash la cifra con el algoritmo determinado según sea el cifrado. Toma un bloque arbitrario de datos y devuelve una cadena con una determinada longitud (valor hash). Los datos para ser codificados son denominados «el mensaje» y el valor hash se le denomina «message digest» o simplemente «digest»
Imagen extraída de es.wikipedia.org
Pero no es todo… pues si dos contraseñas fueran iguales o supieramos el algoritmo usado quizás podríamos descifrarlo sabiendo unas cuantas contraseñas básicas y comparando el digest hasta sacar unas equivalencias.
Para evitar esto y cerrar completamente el cerco de seguridad de la contraseña, se le añaden los bit salt, que son datos al azar añadidos a la contraseña para posteriormente cifrar con el hash. Digamos que lo enmascaramos en más datos y así no sabremos si qué parte es la contraseña real y cuales son los datos sin valor.
Teniendo la contraseña de ejemplo de antes:
$6$OrqRmooe$2XSkIJNgd3Te/xPUd6S1wdysNgPhFrT7UFHkbhvjECkt/L9Z3rmqBUbRDBcfLf4sz/Z775X.WgJTaijVG7mhn1
Todo lo marcado en azul serían los salt bits, desde el segundo «$» hasta el siguiente.
Los cifrado con bits salt se usan en muchos sistemas modernos, desde seguridad de credenciales a Seguridad en Internet. Hacen mucho más lentos los ataque por diccionario y fuerta bruta para el crackeo. Sin estos como introducimos anteriormente un atacante que descifra una contraseña, sólo necesita adivinarla uno vez y con ella tiene la llave para aligerar la velocidad de crackeo de las demás.
En la autenticacion pam se pueden definir el tipo de algoritmo usado en particular para servicios
En Red Hat se define el tipo de cifrado en este fichero como ejemplo:
[root@nexolinux ~]# cat /etc/pam.d/system-auth
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
Deja un comentario