
Relacionado con¿Por qué la contraseña de root en Linux Mint es mi contraseña de usuario?
Parece que mi caja Mint 17.3 tiene una contraseña de root configurada: veo un hash de contraseña /etc/shadow
(comienza con $6$...
). Me gustaría comparar este hash de contraseña con mi contraseña de usuario (conocida).
Por alguna razón, no confío su -
(en la pregunta vinculada) en no usarmicontraseña, frente a laraízcontraseña.
¿Existe una forma sencilla (en bash, por ejemplo) de comparar un hash conocido con una contraseña conocida y ver si coinciden?
Respuesta1
Encuentra la sal utilizada /etc/shadow
, son los caracteres entre el segundo y el tercero $
, normalmente habrá ocho.
Utilice mkpasswd -m sha-512 -S <salt>
e introduzca la contraseña que cree que debe ser cuando se le solicite. Generará el hash con $6$<salt>$
prefijo.
Respuesta2
Al final, debe llamar a la crypt(3)
función desde libcrypt
(que en sistemas GNU como Linux Mint viene con GNU libc) con la contraseña como primer argumento y el hash ( $6$...
) como segundo argumento.
python
es una de esas herramientas que expone esa función, por lo que puedes hacer:
HASH='$6$...' python2 -c 'import crypt, os, getpass
print(crypt.crypt(getpass.getpass(), os.environ["HASH"]))'
Y si el resultado coincide con el hash, esa era la contraseña correcta.
$HASH
arriba puede ser el hash completo (como $6$rounds=1234$somesalt$6eFBNhSgwEwdfZBHueBedpcqaVKGcV2DJy/tQMFd3JL88hwvgTkISJShnOUrbtP1fRs8I9rGIdsgWCoiujxD2/
) o solo la parte que está más a la derecha $
, es decir, incluyendo la sal y el recuento de rondas opcional ( $6$rounds=1234$somesalt$
).
O puedes hacer la verificación en python
:
HASH='$6$...' python2 -c '
import crypt, os, getpass
hash = os.environ["HASH"]
if crypt.crypt(getpass.getpass(), hash) == hash:
print "OK"
else:
print "Wrong password"'
(entonces, obviamente, $HASH
debe contener el hash completo).
Con python
, también puedes llamar funciones desde bibliotecas arbitrarias usando el ctypes
módulo. Entonces, otra forma de llamar a la función del sistema crypt()
(no es que sea necesario, ya que crypt
es uno de los módulos estándar, es solo que antes tenía la impresión de que el crypt
módulo venía con su propia crypt()
implementación separada) es con algo como:
HASH='$6$...' python2 -c '
from ctypes import *
import os, getpass
l = CDLL("libcrypt.so.1")
l.crypt.restype = c_char_p
print l.crypt(getpass.getpass(), os.environ["HASH"])'
Respuesta3
ssh root@localhost
me viene a la mente, aunque es posible que su distribución haya deshabilitado por completo el inicio de sesión basado en contraseña para root y/o haya instalado un par de claves; o iniciar sesión en su pantalla gráfica habitual de inicio de sesión como usuario root
. (Incluso si tiene habilitado el inicio de sesión automático, el cuadro de diálogo de apagado puede ofrecerle iniciar sesión como otro usuario).