Переносимые (PHPass) хеши паролей.Должен ли я их использовать? - PullRequest
21 голосов
/ 17 марта 2011

Я устанавливаю скрипт регистрации пользователя (Tank Auth) для моего сайта.

В руководстве по установке написано:

ВНИМАНИЕ: по умолчанию библиотека генерирует сильную системуспецифичные хеши паролей, которые не переносимы.Это означает, что после создания пользовательская база данных не может быть выгружена и экспортирована на другой сервер.Это поведение также может быть изменено в config-файле.

Это ставит меня перед дилеммой.В будущем я, возможно, захочу сменить сервер, но не хочу и слабых паролей.Являются ли переносимые хеши паролями большим риском?И что более важно, что они имеют в виду под хэшами?Это длина символа?

1 Ответ

93 голосов
/ 17 марта 2011

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.

  1. $final = '$P$'

  2. $final .= encode64_int($rounds) (от конструктора, минимум в PHP 55+, 3 других)

  3. $final .= genSalt() (Солт 6 байтов ... 8 байтов в формате "encode64").

  4. $hash = md5($salt . $password)

  5. Для 2$rounds раз, делайте $hash = md5($hash . $password)

  6. $final = encode64($hash)

Таким образом, окончательный хеш по существу таков:

$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
  \                   \
   \                   \ Actual Hash
    \
     \  $P$   9   IQRaTwmf
        \_/   \   \______/
         \     \      \
          \     \      \ Salt
           \     \ 
            \     \ # Rounds (not decimal representation, 9 is actually 11)
             \
              \ Hash Header
...