Как использовать алгоритм Argon2 с password_hash?

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

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

Есть ли PASSWORD_DEFAULT теперь использовать Argon2? Что, если что, мне нужно изменить с password_verify? Считается ли сейчас bcrypt небезопасным?

14

Решение

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

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

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

Сначала мы переключим второй аргумент password_hash к одному из них постоянным

  • PASSWORD_ARGON2I — PHP 7.2.0+
  • PASSWORD_ARGON2ID — PHP 7.3.0+ (желательно, если доступно, см. Примечания ниже)

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

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

Из руководства мы видим, что делают эти варианты

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

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

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

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

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

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

Введено в PHP 7.3, Argon2ID делает некоторые улучшения по сравнению с Argon2I, как отмечено в этом Crypto.SE вопрос

Лучшая компромиссная атака для 1-проходного Argon2id — это комбинированная атака с малым объемом памяти (для первой половины памяти) и ранжирующая атака (для второй половины), которые объединяют фактор около 2,1.

Argon2ID работает с теми же аргументами, что и Argon2I.

27

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]