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:
- tira o especificador de método hash com, e. sed.
- decodifique a string base64
- extrair os últimos 4 bytes, esse é o sal
- concatena o sal para a senha de texto simples
- hash
- 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