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

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

А именно:

memory_cost
time_cost
threads

как:

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

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

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

3

Решение

От: 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. Выясните, сколько потоков вы можете использовать, выберите $ h $ соответственно.
    1. Выясните, сколько памяти вы можете использовать, выберите $ m $ соответственно.
    1. Определите максимальное время, которое вы можете потратить на это в размере $ x $, выберите самое большое значение $ t $, которое будет меньше, чем $ x $ для вашей системы и других параметров.

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

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

  • Степень параллелизма 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.

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

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

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

2

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

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