我正在尝试在认证库中实现Argon2算法。我希望能够为用户提供一些有用的提示来设置参数。
虽然我理解内存成本和线程参数如何影响算法,但我似乎无法理解时间成本参数。
PHP文档所说:
time_cost(整数)-计算Argon2哈希可能需要的最长时间。默认为PASSWORD_ARGON2_DEFAULT_TIME_COST。
疑问1- 默认值为2。它似乎代表一个时间,遗憾的是,单位似乎缺失。是秒还是毫秒?
这个SO答案说默认值是2 秒。
Argon2规格说明书所说:
在第3.1章输入中,没有提到时间,只涉及迭代次数。
迭代次数t
(用于独立调整运行时间和内存大小)可以是1到2^32-1之间的任何整数;第9章“推荐参数”中定义了一个与时间有关的值,它说:
计算每个调用可以承受的最长时间x
(以秒为单位)
[...]
使用不同数量的传递运行类型、内存和通道和线程的方案。找出最大,使运行时间不超过。如果甚至对于也超过了,则相应减少。
使用刚刚确定的值、和哈希所有密码。
询问2 -这是否意味着PHP公开了时间量并确定了正确的迭代量?
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秒钟来运行?可用性将是灾难性的!
我真的尽力做了研究,但我不太舒服,需要问一下才能理解这个问题。
但这真的很令人困惑。由于它与安全有关,我真的想弄清楚这个问题的底层原因。
感谢您的见解!