Как использовать алгоритм Argon2 с хэшем паролей?

Итак, я слышал, что PHP 7.2 представил новый алгоритм Argon2. Но я смущен тем, как я могу использовать его с моим существующим кодом. Например, у меня есть это

$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]);

тут PASSWORD_DEFAULT теперь использовать Argon2? Что, если что-нибудь, мне нужно изменить с password_verify? Теперь осуществляется с точки зрения безопасности?

1 ответов


что Argon2? Сейчас осуществляется плохо?

до PHP 7.2, единственный алгоритм хэширования password_hash используется bcrypt. На момент написания этой статьи bcrypt по-прежнему считается сильным хэшем, особенно по сравнению с его предшественниками, md5 и sha1 (оба из которых являются небезопасно, потому что они быстрые). Argon2 составляет просто более дорогостоящий алгоритм для грубой силы

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

Bcrypt по-прежнему является приемлемым хэшем для паролей. Нет необходимости переключаться, если вы не хотите (начиная с версии 7.2.0). Кроме того,PASSWORD_DEFAULT должно изменяться только (per PHP для внутренности политики) при следующем полном выпуске (7.3.0 или выше). Если вы хотите продолжить работу только с bcrypt, вы можете использовать . Однако в этом нет необходимости, о чем мы поговорим ниже.

как вы используете Argon2?

во-первых, мы переключим второй аргумент password_hash до PASSWORD_ARGON2I, а затем нам нужно будет изменить наши варианты. осуществляется использует cost в качестве параметра, сколько раз он повторяет пароль (более высокая стоимость = более длительное время хэширования). Однако существуют различные факторы затрат

password_hash('somepassword', PASSWORD_ARGON2I, ['memory_cost' => 2048, 'time_cost' => 4, 'threads' => 3]);

от руководства мы видим, что эти параметры do

  • memory_cost - максимальная память (в байтах), которая может использоваться для вычисления хэша Argon2 (по умолчанию 1024)
  • time_cost - максимальное количество времени, которое может потребоваться для вычисления хэша Argon2 (по умолчанию 2)
  • threads - количество потоков, используемых для вычисления хэша Argon2 (по умолчанию 2)

поймите, перед тем как идти менять эти, что более высокая стоимость здесь замедлит ваш скрипт. Вы захотите провести тест на вашем сервере, чтобы найти параметр, который лучше работает для вас. Это обычно обходишь несколько итераций заданной стоимости. The PHP руководство дает пример этого если вам нужно.

также обратите внимание, что, хотя bcrypt хранит 60 символов, Argon2 может потребовать больше. В идеале вы должны сделать поле пароля хранилищем 255 символов.

что мы меняем в password_verify?

ответ здесь... ничего. Понимать это password_verify достаточно умен, чтобы выяснить, какой алгоритм был использован и обрабатывать его соответствующим образом. Как упоминалось выше, это означает, что если вы используете PASSWORD_DEFAULT, значение по умолчанию может измениться и не отрицательно повлиять на вас (хотя вам может потребоваться настроить параметры затрат). password_verify просто требуется алгоритм, который он поддерживает. Если вы переключитесь с bcrypt на Argon2, оба будут проверять одинаково, так как все необходимые данные (соль, хэш и стоимость) хранятся для вас.

//Works for both bcrypt and Argon2
if(password_verify($user_password, $stored_hash)) {
    // password validated
}

если вы хотите обновите хэши из bcrypt, вы можете сделать это, когда пользователь успешно входит в систему (и, таким образом, предоставил вам пароль без хэша). Просто проверьте, начинается ли ваш хэш с y$ (маркер bcrypt). Если это так, передайте предоставленный пароль в password_hash снова, но с аргументами Argon2, и сохраните его в поле пароля зарегистрированного пользователя.