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 mkpasswd
faz parte do pacotequem ée implementado no mkpasswd.c
qual, 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 -R
opção mkpasswd
que 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 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 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.