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)
(от конструктора, минимум в PHP 55+, 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