Ответ 1
Задача 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
раз, do$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