Intereting Posts
CakePHP 3 Переключатель источника данных Как получить исходный код с веб-страницы? PHP-скрипт выполняется дважды, когда более 60 секунд Реляционный API: where () не может определить столбец, используя классы с именами Как использовать exec () в php в сочетании с командой ssh ​​'hostname'? Список PHP на основе выбора формы: ошибка MDB2: ошибка синтаксиса Калькулятор Codeigniter, откуда берутся эти ms? Как разделить кеш APC между несколькими процессами PHP при работе в FastCGI? Как вы создаете cakephp на общем хостинге? как передать php-параметр в javascript Почему я не могу создать модель Doctrine под названием «Альбом», Некоторые проблемы с переходом от одной функции к другой в цикле в php PHP MySQL Yii – чтение базы данных не пишет как автоматически копировать весь каталог в виде эскизов, используя phpthumb (или некоторую другую библиотеку) Неизвестно: не удалось открыть окно «0ff» (include_path = '.: / Tmp: / usr / lib / php: / usr / local / lib / php') в Unknown в строке 0

Хранение паролей портативных (PHPass). Должен ли я использовать их?

Я устанавливаю скрипт регистрации пользователя (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.

  1. $final = '$P$'

  2. $final .= encode64_int($rounds) (от конструктора, минимум 5 на PHP 5+, 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