По умолчанию htpasswd использует стандартную функцию crypt , поэтому пароли уже засолены. Обратите внимание, что в этом примере оба пользователя имеют одинаковый пароль, но хэши разные:
simon@diablo:~$ htpasswd -b -c htpasswd simon abcd
Adding password for user simon
simon@diablo:~$ htpasswd -b htpasswd simon2 abcd
Adding password for user simon2
simon@diablo:~$ cat htpasswd
simon:<b>NWvm/LCCxQ64E</b>
simon2:<b>2I.LBzsRqULN6</b>
(примечание: флаг -b
обычно не рекомендуется, поскольку другие пользователи могут видеть ваши аргументы командной строки и, следовательно, пароль)
Первые два символа хэша - это соль;пароли проверяются путем повторного вызова crypt()
.При вводе неверного пароля получается строка, которая не соответствует хешированному паролю:
>>> from crypt import crypt
>>> crypt("wrongpass", "NWvm/LCCxQ64E")
'NWbxQgX1unvso'
, тогда как правильный пароль создает ожидаемый хеш:
>>> crypt("abcd", "NWvm/LCCxQ64E")
'NWvm/LCCxQ64E'
htpasswd -m
использует другой алгоритм MD5на основе и использует более длинную соль:
simon@diablo:~$ htpasswd -m -b -c htpasswd simon abcd
Adding password for user simon
simon@diablo:~$ cat htpasswd
simon:<b>$apr1$mfvnBVmG$iIHIHOaH9vcImG5G.8eVa/</b>
Здесь соль - это 8 символов между вторым и третьим $
.
htpasswd -s
хранит дайджест SHA-1 снет соли;Похоже, что это для совместимости с Netscape / LDIF:
simon@diablo:~$ htpasswd -s -b -c htpasswd simon abcd
Adding password for user simon
simon@diablo:~$ htpasswd -s -b htpasswd simon2 abcd
Adding password for user simon2
simon@diablo:~$ cat htpasswd
simon:{SHA}gf6L/odXbD7LIkJvjleEc4KRes8=
simon2:{SHA}gf6L/odXbD7LIkJvjleEc4KRes8=
Их можно легко перевернуть - преобразовать в шестнадцатеричный дайджест:
>>> "".join("%02x" % ord(c)
... for c in "gf6L/odXbD7LIkJvjleEc4KRes8=".decode("base64"))
'81fe8bfe87576c3ecb22426f8e57847382917acf'
, а затем использовать онлайн-базу хеш-данных.