Eu esperava slappasswd
produzir 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?
slappasswd
é {SSHA} ou a versão salgada do SHA-1.{SSHA}
contém tanto o sal e o hash.SSHA é um SHA-1 salgado. Por padrão, os últimos 4 bytes são o sal. A saída do slappasswd é
Portanto, para testar se uma senha de texto sem formatação é igual ao SHA salgado, é necessário:
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:
A saída pode ser:
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:
A saída é:
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
fonte