Алгоритм Argon2 в PHP7: понимание параметра time_cost
Я пытаюсь реализовать алгоритм Argon2 в библиотеке аутентификации. Я хочу предоставить пользователям несколько полезных советов по настройке параметров.
Пока понимаю как memory_cost
а также threads
параметры влияют на алгоритм, я не могу обернуть голову вокруг time_cost
параметр.
Что говорит PHP документ:
time_cost (integer) - максимальное количество времени, которое может потребоваться для вычисления хэша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_TIME_COST.
Опрос 1 - значение по умолчанию равно 2. Кажется, оно представляет время, к сожалению, единица кажется отсутствующей. Это в секундах? Миллисекунды?
Этот SO ответ говорит, что по умолчанию 2 секунды.
Что говорит спецификация Argon2:
В главе 3.1 Входы здесь нет упоминания о времени, только о количестве итераций.
Количество итераций
t
(используется для настройки времени выполнения независимо от объема памяти) может быть любым целым числом от 1 до 2^32−1;
Временное значение определено в главе 9 " Рекомендуемые параметры":
Выяснить максимальную сумму
x
времени (в секундах), которое может позволить каждый звонок[...]
Запустите схему типа
y
, объем памятиm
а такжеh
дорожки и потоки, используя разное количество проходовt
, Выяснить максимумt
такой, что время пробега не превышаетx
, Если это превышаетx
даже дляt = 1
, уменьшитьm
соответственно.Хэшируйте все пароли с только что определенными значениями
m
,h
, а такжеt
,
Опрос 2 - Значит ли это, что PHP выставляет количество времени? x
и определить правильное количество итераций t
?
Что говорит PHP RFC:
Стоимость времени, которая определяет время выполнения алгоритма и количество итераций
[...]
Затраты времени представляют количество раз, когда алгоритм хеширования будет запущен.
Допрос 3 - Они говорят как о времени, так и о количестве итераций. Теперь я еще больше запутался. Это время или количество итераций? Если я запускаю хэш с time_cost = 2
это значит, что это займет 2 секунды?
Эталон
Чтобы помочь мне немного понять, я сделал этот небольшой сценарий тестирования. Я получил следующий результат (1 поток):
m_cost (MB) | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256
=====================================================
t_cost=1 | 1 | 2 | 5 | 10 | 24 | 46 | 90 | 188 | 348
t_cost=2 | 2 | 4 | 8 | 18 | 39 | 75 | 145 | 295 | 636
t_cost=3 | 3 | 6 | 12 | 26 | 53 | 102 | 209 | 473 | 926
t_cost=4 | 5 | 9 | 30 | 56 | 78 | 147 | 309 | 567 |1233
t_cost=5 | 4 | 9 | 19 | 40 | 79 | 165 | 359 | 690 |1372
t_cost=6 | 5 | 12 | 23 | 49 | 93 | 198 | 399 | 781 |1777
t_cost=7 | 6 | 14 | 29 | 53 | 118 | 259 | 508 |1036 |2206
t_cost=8 | 8 | 16 | 33 | 82 | 179 | 294 | 528 |1185 |2344
Я до сих пор не понимаю, как time_cost
может быть время в секундах.
Если это верхняя граница (имеется в виду максимальное время, которое он может выполнить), то это даже не полезно. Например, t_cost=8
а также m_cost=16MB
может показаться разумным, поскольку для запуска требуется около 200 мс. Но это означает, что один день может занять до 8 секунд? Юзабилити была бы катастрофической!
Я действительно пытался сделать свое исследование, и мне не очень удобно, что мне нужно попросить, чтобы понять это.
Но это действительно сбивает с толку. Поскольку это связано с безопасностью, я действительно хочу докопаться до сути.
Спасибо за ваши идеи!
1 ответ
Из того, что я могу сказать, это количество итераций в алгоритме ARGON2.
Если вы отследите его через источник PHP, вы получите
https://github.com/php/php-src/blob/master/ext/standard/password.c#L528
какие звонки
https://github.com/P-H-C/phc-winner-argon2/blob/master/src/argon2.c#L67
Так вот, t_cost отображается на количество проходов ^
Также обратите внимание:
См. https://password-hashing.net/submissions/specs/Argon-v3.pdf - 2.1.1 - Входные данные: Число итераций t может быть любым целым числом от 1 до 232 - 1