SSHA - это соленая SHA-1. По умолчанию последние 4 байта являются солью. Выходные данные slappasswd
'{<Hash Method>}<base64 converted hash and salt>'
Таким образом, чтобы проверить, равен ли простой текстовый пароль соленому SHA, вам необходимо:
- удалите спецификатор метода хеша с помощью, например, sed.
- декодировать строку base64
- извлечь последние 4 байта, это соль
- конкатенировать соль в простой текстовый пароль
- хэш это
- сравнить
Декодированная base64 строка содержит хеш в двоичном виде и не может быть напечатана, поэтому мы преобразуем ее в шестнадцатеричный формат с помощью od. Первые 3 шага выполняются с помощью следующего кода:
#!/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"
Выход может быть:
{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;▒
Так что теперь мы должны объединить соль с простым текстом и хешировать его, на этот раз без соли! У меня была проблема с пониманием, что солью может быть любой символ, включая непечатные символы. Чтобы объединить эти непечатаемые символы, мы будем использовать printf и их шестнадцатеричные представления:
slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1
Выход:
7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8
Который равен хешу выше. Теперь мы убедились, что «пароль» соответствует соленому SHA.
Спасибо и дальнейшего чтения: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
slappasswd
{SSHA} или соленая версия SHA-1.