What is Argon2? Is bcrypt bad now?
До PHP 7.2 использовался только алгоритм хеширования password_hash
bcrypt. На момент написания этой статьи bcrypt по-прежнему считается сильным хешем, особенно по сравнению со своими предшественниками md5
и sha1
(оба являются небезопасным, потому что они быстрые). Argon2 - это просто более затратный алгоритм для грубой силы
Argon2i использует доступ к памяти, не зависящий от данных. Он медленнее, потому что делает больше проходов по памяти для защиты от атак компромисса. Настоятельно рекомендуется для хеширования паролей и получения ключей на основе паролей.
Bcrypt по-прежнему является приемлемым хешем для паролей. Нет необходимости переключаться, если вы этого не хотите (начиная с версии 7.2.0). Кроме того, PASSWORD_DEFAULT
следует изменять только (согласно PHP Internals policy) в следующей полной версии (7.3.0 или выше). Если вы хотите, чтобы вы продолжали использовать только bcrypt, вы можете использовать вместо этого PASSWORD_BCRYPT
. Однако в этом нет необходимости, как мы обсудим ниже.
How do you use Argon2?
Сначала мы переключим второй аргумент 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 символов.
What do we change in 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, вы можете сделать это, когда пользователь успешно войдет в систему (и, таким образом, предоставит вам нехешированный пароль). Просто проверьте, начинается ли ваш хеш с $2y$
(маркер bcrypt). Если это так, передайте предоставленный пароль в password_hash
снова, но с аргументами Argon2, и сохраните его в поле пароля вошедшего в систему пользователя.
What is Argon2ID?
Представленный в PHP 7.3, Argon2ID вносит некоторые улучшения по сравнению с Argon2I, как указано в этом Вопрос по Crypto.SE
Лучшая атака компромисса на однопроходный Argon2id - это комбинированная атака с низким объемом памяти (для первой половины памяти) и ранжирующая атака (для второй половины), которые объединяют коэффициент примерно 2,1.
Argon2ID работает с теми же аргументами, с которыми работает Argon2I.
person
Machavity♦
schedule
01.12.2017