Argon2i в PHP7 — выбор подходящих опций

Какие значения следует использовать для генерации хэшей Argon2i и как найти подходящие настройки, которые может позволить мое оборудование?

А именно:

memory_cost
time_cost
threads

as:

$options = [
    'memory_cost' => 1<<17,
    'time_cost'   => 4,
    'threads'     => 3,
];

$hash = password_hash('test', PASSWORD_ARGON2I, $options);

В документах PHP есть простой скрипт для поиска соответствующее значение стоимости для хэшей bcrypt. Как это можно приспособить для Argon2?


person Archer Sylus    schedule 18.01.2018    source источник


Ответы (1)


Из: PHP RFC Argon2 password_hash

Факторы стоимости

Из:

Из-за разнообразия платформ, на которых работает PHP, факторы стоимости намеренно установлены низкими, чтобы случайно не исчерпать системные ресурсы в системах с общим доступом или с низким уровнем ресурсов при использовании параметров стоимости по умолчанию. Следовательно, пользователи должны корректировать коэффициенты стоимости в соответствии с системой, над которой они работают. В следующем списке показана производительность хеширования в различных системах с использованием этих значений стоимости по умолчанию.

Common Cloud Server 512 MB, 1 Core: 3-5 ms
Common Cloud Server 2 GB, 2 Core, 1-3 ms
512 MB Raspberry Pi Zero: 75-85ms

Поскольку Argon2 не имеет «плохих» значений, потребление большего количества ресурсов считается лучше, чем потребление меньшего. Пользователям рекомендуется корректировать факторы стоимости для платформы, для которой они разрабатывают.

Потоки

Из: Каково рекомендуемое количество итераций для Argon2< /а>

В документе argon2 описана следующая процедура (перефразированная) для определения параметров, которые следует использовать:

    1. Figure out how many threads you can use, choose $h$ accordingly.
    1. Figure out how much memory you can use, choose $m$ accordingly.
    1. Decide on the maximum time $x$ you can spend on it, choose the largest $t$ such that it takes less than $x$ with your system and other parameter choices.

т.е. они рекомендуют вам запустить его в вашей системе и определить самые большие параметры, которые соответствуют вашим ограничениям на использование памяти и процессорного времени.

Из спецификации Argon 2.

(ссылка здесь)

  • Степень параллелизма p определяет, сколько независимых (но синхронизирующихся) вычислительных цепочек может быть запущено. Может принимать любое целое значение от 1 до 2^24 -1.

  • Размер памяти m может быть любым целым числом килобайт от 8p до 2^32-1. Фактическое количество блоков равно m′, которое округляется до m в меньшую сторону до ближайшего кратного 4p.

  • Количество итераций t (используется для настройки времени работы независимо от объема памяти) может быть любым целым числом от 1 до 2^32 -1

Дополнительная литература

Отсюда

  • Выясните, сколько потоков можно использовать при каждом вызове Argon2 (параллелизм). Они рекомендуют в два раза больше, чем количество ядер, выделенных для хеширования паролей.

  • Выясните, сколько времени может занять каждый звонок. Одна из рекомендаций для одновременных входов пользователей в систему — не превышать 0,5 мс.

  • Измерьте время хэширования, используя выбранные вами параметры. Найдите значение time_cost, которое находится в пределах вашего учетного времени. Если time_cost=1 занимает слишком много времени, уменьшите memory_cost.

Вывод:

Таким образом, из приведенных выше отрывков кажется, что вы хотите стремиться к временному интервалу 0.5ms, измеренному PHP microtime, как в примере с BCrypt. Затем вы можете установить количество потоков, равное удвоенному количеству ядер вашего ЦП, например, 8 для 4-ядерного процессора.

Затем вы сможете запустить серию тестов с этими двумя значениями, чтобы найти допустимое третье значение для memory_cost.

Запустите несколько тестов на своем сервере, чтобы увидеть, с чем сервер может комфортно работать. Узнайте, может ли этот интерфейс командной строки помочь.

Измените три переменные в порядке, указанном в приведенной выше цитате (в разделе Threads), поэтому отрегулируйте память, используя большое количество итераций.

Короче говоря, мы не можем дать вам «лучший совет», потому что это зависит от спецификации. вы собираетесь запустить это на...

person Martin    schedule 18.01.2018