Какие значения я должен использовать для генерации хэшей 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?
От: 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 дает следующую процедуру (перефразированную) для определения параметров, которые вы должны использовать:
- Выясните, сколько потоков вы можете использовать, выберите $ h $ соответственно.
- Выясните, сколько памяти вы можете использовать, выберите $ m $ соответственно.
- Определите максимальное время, которое вы можете потратить на это в размере $ 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 может помочь.
Измените три переменные в порядке, указанном в приведенной выше цитате (под Потоки), поэтому настройте объем памяти, используя большое количество итераций.
Короче говоря, мы не можем дать вам руководство «лучший совет», потому что это зависит от того, какая спецификация. вы собираетесь запустить это на …
Других решений пока нет …