Я устанавливаю скрипт регистрации пользователя (Tank Auth) для моего сайта.
В руководстве по установке говорится:
ПРЕДУПРЕЖДЕНИЕ. По умолчанию библиотека генерирует жесткие системные хэши паролей, которые не переносятся. Это означает, что после создания пользовательская база данных не может быть сброшена и экспортирована на другой сервер. Это поведение также можно изменить в файле конфигурации.
Это поставило меня в дилемму. В будущем я могу захотеть сменить серверы, но я тоже не хочу слабых паролей. Являются ли переносные пароли хешей большим риском? И что еще более важно, что они означают с помощью хэшей? Это длина символа?
Задача Auth использует PHPass для хэширования паролей (старая версия, это не очень хороший знак, вы можете обновить ее в своей установке). PHPass имеет два режима: портативный и bcrypt.
В зависимости от версии PHP вам не нужно иметь переносные хеши. На PHP 5.3 и выше PHP поставляет свою собственную реализацию bcrypt, если она недоступна в системе. Если на всех ваших серверах есть PHP 5.3 и выше, я настоятельно рекомендую отключить переносные хеши. PHPass «хэши порталов» существует, потому что, в зависимости от установленной версии PHP, bcrypt может быть недоступен.
Тем не менее, портативные хеш-файлы PHPass хранят соль в своем хеше. Вот почему каждый запуск на одном и том же пароле отличается.
Кроме того, PHPass использует PHP_VERSION
во время генерации этих хэшей *, чтобы проверить, доступна ли функция md5()
с этой версией параметра $rawMode
. Если это не так, pack()
используется для преобразования шестнадцатеричных данных в двоичный файл (обратите внимание, что это значительно медленнее, чем просто $rawMode
, поэтому $rawMode
ветка).
Опять же, если все ваши серверы работают с PHP 5.3 и выше, я настоятельно рекомендую отключить портативный режим и позволить PHPass использовать bcrypt
. Поскольку PHP 5.3+ обеспечивает собственную реализацию, когда система недоступна, ваш хэш будет проверяться в разных ОС. Даже если вы отключите переносной режим, PHPass все равно будет достаточно умным, чтобы проверить ваши старые хэши надлежащим образом.
* Линия 131
EDIT: для более подробного объяснения, как генерируются хеши в переносном режиме (упрощенный, не использует фактические переменные, найденные в 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