
Relacionado aPor que a senha root no Linux Mint é minha senha de usuário?
Parece que minha caixa Mint 17.3 tem uma senha de root definida: vejo um hash de senha /etc/shadow
(começa com $6$...
). Gostaria de comparar esse hash de senha com minha senha de usuário (conhecida).
Por alguma razão, não confio su -
(na pergunta vinculada) para não usarmeusenha, versus oraizsenha.
Existe uma maneira simples (no bash, por exemplo) de comparar um hash conhecido com uma senha conhecida e ver se elas correspondem?
Responder1
Encontre o sal usado em /etc/shadow
, são os caracteres entre o segundo e o terceiro $
, geralmente serão oito.
Use mkpasswd -m sha-512 -S <salt>
e digite a senha que você acha que deveria ser quando for solicitada. Ele produzirá o hash com $6$<salt>$
prefixo.
Responder2
No final, você precisa chamar a crypt(3)
função do libcrypt
(que em sistemas GNU como Linux Mint vem com o GNU libc) com a senha como primeiro argumento e o hash ( $6$...
) como segundo argumento.
python
é uma ferramenta que expõe essa função, então você pode fazer:
HASH='$6$...' python2 -c 'import crypt, os, getpass
print(crypt.crypt(getpass.getpass(), os.environ["HASH"]))'
E se a saída corresponder ao hash, essa era a senha correta.
$HASH
acima pode ser o hash completo (como $6$rounds=1234$somesalt$6eFBNhSgwEwdfZBHueBedpcqaVKGcV2DJy/tQMFd3JL88hwvgTkISJShnOUrbtP1fRs8I9rGIdsgWCoiujxD2/
) ou apenas a parte dele mais à direita $
, incluindo o salt e a contagem de rodadas opcional ( $6$rounds=1234$somesalt$
).
Ou você pode fazer a verificação em 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"'
(obviamente, $HASH
deve conter o hash completo).
Com python
você também pode chamar funções de bibliotecas arbitrárias usando o ctypes
módulo. Portanto, outra maneira de chamar a crypt()
função do sistema (não que você precise, como crypt
é um dos módulos padrão, só que anteriormente tive a impressão de que o crypt
módulo vinha com sua própria crypt()
implementação separada) é 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"])'
Responder3
ssh root@localhost
vem à mente, embora sua distribuição possa ter desabilitado totalmente o login baseado em senha para root e/ou instalado um par de chaves; ou efetuando login na tela de login gráfica usual como usuário root
. (Mesmo se você tiver o login automático ativado, a caixa de diálogo de desligamento poderá oferecer o login como outro usuário.)