Переносимые (PHPass) хеши паролей. Должен ли я их использовать?
Я устанавливаю скрипт регистрации пользователя (Tank Auth) для моего сайта.
В руководстве по установке сказано:
ВНИМАНИЕ: по умолчанию библиотека генерирует надежные системные хеши паролей, которые не являются переносимыми. Это означает, что однажды созданная пользовательская база данных не может быть выгружена и экспортирована на другой сервер. Это поведение также может быть изменено в config-файле.
Это поставило меня перед дилеммой. В будущем я, возможно, захочу сменить сервер, но не хочу и слабых паролей. Являются ли переносимые хеши паролями большим риском? И что более важно, что они подразумевают под хешами? Это длина символа?
1 ответ
Task Auth использует PHPass для хеширования паролей (старая версия, это плохой признак; вы можете обновить ее в своей установке). PHPass имеет два режима, портативный и bcrypt.
В зависимости от версии PHP, вам не нужно иметь переносимые хэши. На PHP 5.3 и выше, PHP предоставляет свою собственную реализацию bcrypt, если она недоступна в системе. Если на всех ваших серверах установлен PHP 5.3 и выше, я настоятельно рекомендую отключить переносимые хеши. PHPass "переносимые хэши" существует, потому что, в зависимости от установленной версии PHP, bcrypt может быть недоступен.
Тем не менее, переносимые хеши PHPass хранят соль в своем хеше. Вот почему каждый запуск с одним и тем же паролем отличается.
Также PHPass использует PHP_VERSION
во время генерации этих хэшей *, чтобы проверить, если md5()
функция доступна с этой версией поддерживает $rawMode
параметр. Если это не так, pack()
используется для преобразования шестнадцатеричных данных в двоичные (обратите внимание, что это значительно медленнее, чем просто с помощью $rawMode
Именно поэтому ветка сделана).
Опять же, если все ваши серверы работают под управлением PHP 5.3 и выше, я настоятельно рекомендую отключить портативный режим и позволить PHPass использовать bcrypt
вместо. Поскольку PHP 5.3+ предоставляет собственную реализацию, когда системная не доступна, ваш хэш будет проверяться в разных ОС. Даже если вы отключите портативный режим, PHPass все равно будет достаточно умен, чтобы правильно проверять ваши старые хэши.
* Строка 131
РЕДАКТИРОВАТЬ: Для более подробного объяснения, вот как генерируются хеши в переносном режиме (упрощенно, не использует фактические переменные, найденные в PHPass, но точные). Обратите внимание, что PHPass использует собственную версию кодировки base64.
$final = '$P$'
$final .= encode64_int($rounds)
(от конструктора, минимум 5 на PHP 5+, 3 других)$final .= genSalt()
(Солт 6 байтов... 8 байтов в формате "encode64").$hash = md5($salt . $password)
За
2
$rounds
раз делай$hash = md5($hash . $password)
$final = encode64($hash)
Итак, последний хеш по сути таков:
$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
\ \
\ \ Actual Hash
\
\ $P$ 9 IQRaTwmf
\_/ \ \______/
\ \ \
\ \ \ Salt
\ \
\ \ # Rounds (not decimal representation, 9 is actually 11)
\
\ Hash Header