SHA512 pergunta de código hash salgada

7

Estou perplexo com o código hash (ASCII) armazenado no Linux (Ubuntu) / etc / shadow.

Tomando um caso hipotético, deixe a senha ser 'teste' , sal 'Zem197T4' .

Ao executar o seguinte comando,

$ mkpasswd -m SHA-512 test Zem197T4

Uma longa série de caracteres ASCII é gerada (na verdade, é como o Linux armazena no / etc / shadow)

$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0

Ao usar o gerador SHA-512 on-line (por exemplo, link ), o que é gerado é algum código hexadecimal como abaixo:

opção 1) senha + sal

8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2

opção 2) sal + senha

b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2

Eu acredito que este código hexadecimal deve ser a 'mesma coisa' que o código ascii gerado pelo mkpasswd. Mas como eles estão relacionados?

Espero que alguém possa me esclarecer?

    
por A. Au 09.10.2014 / 18:02

1 resposta

5

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.

    
por 05.03.2015 / 16:15