Я ожидал slappasswd
получить фиксированный хеш, но похоже, что выходные данные рандомизированы, так как я никогда не получаю одинаковые выходные данные для одного и того же входного пароля:
$ slappasswd -s secret
{SSHA}mCXsPZkfgQYZr2mKHpy5Iav+2S2XlVU3
$ slappasswd -s secret
{SSHA}62oXsalJBuopYfHhi6hGp6AESuWNIVnd
$ slappasswd -s secret
{SSHA}0Ulc8+ugMi3NbTtWnclOFW1LKCqRdsT8
Как во время аутентификации slapd знает, как таким же образом рандомизировать хеш для предоставленного пароля, чтобы он мог соответствовать паролю, определенному в первую очередь?
slappasswd
{SSHA} или соленая версия SHA-1.{SSHA}
содержит и соль, и хэш.SSHA - это соленая SHA-1. По умолчанию последние 4 байта являются солью. Выходные данные slappasswd
Таким образом, чтобы проверить, равен ли простой текстовый пароль соленому SHA, вам необходимо:
Декодированная base64 строка содержит хеш в двоичном виде и не может быть напечатана, поэтому мы преобразуем ее в шестнадцатеричный формат с помощью od. Первые 3 шага выполняются с помощью следующего кода:
Выход может быть:
Так что теперь мы должны объединить соль с простым текстом и хешировать его, на этот раз без соли! У меня была проблема с пониманием, что солью может быть любой символ, включая непечатные символы. Чтобы объединить эти непечатаемые символы, мы будем использовать printf и их шестнадцатеричные представления:
Выход:
Который равен хешу выше. Теперь мы убедились, что «пароль» соответствует соленому SHA.
Спасибо и дальнейшего чтения: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
источник