No Ubuntu / Debian mkpasswd
é parte do pacote whois e implementado em mkpasswd.c
, que na verdade é apenas um wrapper sofisticado em torno da função crypt()
em glibc declarada em unistd.h
. crypt () recebe dois argumentos password e salt. A senha é "teste" neste caso, o sal é prefixado por "$ 6 $" para o hash SHA-512 (consulte SHA -crypt ) então "$ 6 $ Zem197T4" é passado para crypt ().
Talvez você tenha percebido a opção -R
de mkpasswd
, que determina o número de rodadas. No documento, você encontrará um padrão de 5000 rodadas. Esta é a primeira dica porque o resultado nunca seria igual à simples concatenação de salt e password, não é hash apenas uma vez. Na verdade, se você passar -R 5000
, obterá o mesmo resultado. Neste caso, "$ 6 $ rounds = 5000 $ Zem197T4" é passado para crypt () e a implementação em glibc (que é a libc do Debian / Ubuntu) extrai o método e o número de rodadas a partir disso.
O que acontece dentro de crypt () é mais complicado do que apenas computar um único hash e o resultado é codificado em base64 no final. É por isso que o resultado que você mostrou contém todos os tipos de caracteres após o último '$' e não apenas [0-9a-f] como na sequência hexadecimal típica de um hash SHA-512. O algoritmo é descrito em detalhes no documento SHA-Crypt já mencionado.