O hash salgado SHA512 do mkpasswd não corresponde a uma versão online

O hash salgado SHA512 do mkpasswd não corresponde a uma versão online

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

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

Executando o seguinte comando,

$ mkpasswd -m SHA-512 test Zem197T4

Uma longa série de caracteres ASCII é gerada (é assim que o Linux armazena no /etc/shadow)

$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0

Ao usar o gerador SHA-512 online (por exemplohttp://www.insidepro.com/hashes.php?lang=eng), o que é gerado é algum código hexadecimal como abaixo:

opção 1) senha+sal

8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2

opção 2) sal+senha

b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2

Acredito que esse 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?

Responder1

No Ubuntu/Debian mkpasswdfaz parte do pacotequem ée implementado no mkpasswd.cqual, na verdade, é apenas um wrapper sofisticado em torno da crypt()função na glibc declarada em unistd.h. crypt() leva dois argumentos: senha e sal. A senha é "test", neste caso, o salt é precedido por "$6$" para o hash SHA-512 (vejaCripta SHA) então "$6$Zem197T4" é passado para crypt().

Talvez você tenha notado a -Ropção mkpasswdque determina o número de rodadas. No documento você encontrará um padrão de 5.000 rodadas. Esta é a primeira dica de porque o resultado nunca seria igual à simples concatenação de salt e senha, não é hash apenas uma vez. Na verdade, se você passar, -R 5000obterá 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 disso.

O que acontece dentro de crypt() é mais complicado do que apenas calcular 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 string hexadecimal típica de um hash SHA-512. O algoritmo é descrito em detalhes no já mencionadoCripta SHAdocumento.

Responder2

A ideia de usar uma senha salgada é que toda vez que você gera um hash para a mesma senha, você obtém um resultado diferente. Isso evita problemas com tabelas arco-íris.

Suponha que um de seus usuários use uma senha fraca, digamos 123456, seu /etc/shadow foi exposto. Agora tudo o que o hacker malvado precisa fazer é usar uma tabela arco-íris para descobrir a senha fraca e usá-la novamente em outros locais.

informação relacionada