Итак, я слышал, что PHP 7.2 представил новый Алгоритм Argon2. Но я запутался в том, как я могу использовать его с моим существующим кодом. Например, у меня есть это
$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]);
Есть ли PASSWORD_DEFAULT
теперь использовать Argon2? Что, если что, мне нужно изменить с password_verify
? Считается ли сейчас bcrypt небезопасным?
До 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.
Других решений пока нет …