Saída Slappasswd randomizada

10

Eu esperava slappasswdproduzir um hash fixo, mas parece que a saída é aleatória, pois nunca recebo a mesma saída para a mesma senha de entrada:

$ slappasswd -s secret
{SSHA}mCXsPZkfgQYZr2mKHpy5Iav+2S2XlVU3
$ slappasswd -s secret
{SSHA}62oXsalJBuopYfHhi6hGp6AESuWNIVnd
$ slappasswd -s secret
{SSHA}0Ulc8+ugMi3NbTtWnclOFW1LKCqRdsT8

Durante a autenticação, como o slapd sabe aleatoriamente o hash da senha fornecida da mesma maneira, para que ela possa corresponder à senha definida em primeiro lugar?

Máx.
fonte

Respostas:

8

Saindo de um membro aqui, mas presumo que o slappasswd esteja usando um hash salgado em vez de um hash simples. Isso significa que ele adiciona um prefixo aleatório à sua senha e salva esse prefixo aleatório como parte da sequência que você vê na saída slappasswd. Quando você digita sua senha, ela adiciona o prefixo, faz o hash do resultado e o compara à string na saída slappasswd. Se corresponder, você está dentro. Caso contrário, sua senha estava errada :)

wzzrd
fonte
3
De fato. Em particular, o método de hash padrão para slappasswdé {SSHA} ou a versão salgada do SHA-1.
precisa saber é o seguinte
Concordo, mas minha pergunta permanece: se o sal acabar como parte do hash, significa que você não poderá extrair o sal da senha do hash. Assim, como o slapd sabe qual sal adicionar ao fazer a verificação da senha? (ele precisa adicionar o mesmo sal para que as senhas com hash sejam iguais).
Max
3
@user: A parte após {SSHA}contém tanto o sal e o hash.
usar o seguinte comando
8

SSHA é um SHA-1 salgado. Por padrão, os últimos 4 bytes são o sal. A saída do slappasswd é

'{<Hash Method>}<base64 converted hash and salt>'

Portanto, para testar se uma senha de texto sem formatação é igual ao SHA salgado, é necessário:

  1. retire o especificador do método hash com, por exemplo, sed.
  2. decodificar a sequência base64
  3. extrair os últimos 4 bytes, este é o sal
  4. concatenar o salt para a senha de texto sem formatação
  5. hash it
  6. comparar

A string decodificada em base64 contém o hash em formato binário e não pode ser impressa; portanto, a converteremos em hexadecimal com od. As três primeiras etapas estão sendo executadas pelo seguinte código:

#!/bin/bash
output=$(slappasswd -h {SSHA} -s password)
hashsalt=$( echo -n $output | sed 's/{SSHA}//' | base64 -d)
salt=${hashsalt:(-1),(-4)}
echo $output
echo $(echo -n $hashsalt | od -A n -t x1)
echo "Salt: $salt"

A saída pode ser:

{SSHA}fDu0PgKDn1Di9W1HMINpPXRqQ9jTYjuH

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8 d3 62 3b 87
<------------------------- Hash --------------------------> <-- Salt-->

Salt: ▒b;▒

Então agora temos que concatenar o sal para a senha de texto sem formatação e hash, desta vez sem sal! O problema que tive foi entender que o sal pode realmente ser qualquer caractere, incluindo caracteres não imprimíveis. Para concatenar esses caracteres não imprimíveis, usaremos printf e suas representações hexadecimais:

slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1

A saída é:

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8

Qual é igual ao hash acima. Agora, verificamos que 'senha' corresponde ao SHA salgado.

Agradecimentos e leituras adicionais: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

mxmlnkn
fonte