>我正在尝试在身份验证库中实现Argon2算法。我希望能够为用户提供一些有用的提示来设置参数。
虽然我了解memory_cost
参数和threads
参数如何影响算法,但我似乎无法理解time_cost
参数。
PHP文档怎么说:
time_cost(整数)- 计算 Argon2 哈希可能需要的最长时间。默认值为PASSWORD_ARGON2_DEFAULT_TIME_COST。
询问 1 - 默认值为 2。它似乎代表了一个时间,可悲的是,该单位似乎失踪了。是在几秒钟内吗?毫秒?
这个 SO 答案说默认值为 2秒。
Argon2规格说:
在第 3.1 章输入中,这里没有提到时间,只是关于多次迭代。
迭代次数
t
(用于独立于内存大小调整运行时间)可以是 1 到 2^32−1 之间的任何整数;
第9章推荐参数中定义了一个与时间相关的值,它说:
计算出每个呼叫可以承受的最大时间
x
(以秒为单位)[...]
运行类型为
y
、内存m
的方案,并使用不同数量的传递t
h
通道和线程。计算出最大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 秒才能运行?可用性将是灾难性的!
我真的试图做我的研究,我不太舒服,我需要问才能理解这一点。
但这确实令人困惑。由于它与安全性有关,因此我真的很想深入了解这一点。
感谢您的见解!
据我所知,这是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 之间的任何整数