Saída Slappasswd randomizada

7

Eu esperava que o slappasswd produzisse 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 como randomizar o hash da senha fornecida da mesma forma, de modo que possa corresponder à senha definida em primeiro lugar?

    
por Max 15.04.2011 / 11:05

2 respostas

8

Indo em um membro aqui, mas eu assumo que o slappasswd está 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 string que você vê na saída slappasswd. Quando você digita sua senha, ela adiciona o prefixo a ela, compila o resultado e a compara com a string na saída slappasswd. Se corresponde, você está dentro Se não, sua senha estava errada:)

    
por 15.04.2011 / 11:38
6

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

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

Então, para testar se uma senha de texto simples é igual ao SHA salgado, você precisa:

  1. tira o especificador de método hash com, e. sed.
  2. decodifique a string base64
  3. extrair os últimos 4 bytes, esse é o sal
  4. concatena o sal para a senha de texto simples
  5. hash
  6. compare

A string decodificada em base64 contém o hash em formato binário e não pode ser impresso, por isso vamos convertê-lo em hexadecimal com od. Os primeiros 3 passos estão sendo feitos 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 simples e misturá-lo, desta vez sem salgar! 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 a "senha" corresponde ao SHA salgado.

Obrigado e mais leituras: link

    
por 16.03.2015 / 15:57

Tags