PHP7中的Argon2算法:理解time_cost参数

18

我正在尝试在认证库中实现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秒钟来运行?可用性将是灾难性的!

我真的尽力做了研究,但我不太舒服,需要问一下才能理解这个问题。

但这真的很令人困惑。由于它与安全有关,我真的想弄清楚这个问题的底层原因。

感谢您的见解!


谢谢您的提问。我在查阅了 PHP 文档很长一段时间后,仍然找不到有关 time_cost 单位是什么以及如何指定迭代次数的答案。PHP 的文档严重不足,甚至会引人误解。 - tedtanner
1个回答

6

啊,当然我应该检查源代码!这太傻了。 - Indigo
5
然而,PHP文档使事情变得不必要的混乱。当你实际上只是在谈论迭代时,为什么要谈论“最长时间”呢? - Indigo
2
请注意:任何人都可以通过在线文档编辑器拉取请求向这些文档提出修改建议。 - salathe
我确实可能会这样做。但是,我很想更深入地了解为什么要用那种措辞... - Indigo
1
@Indigo - 在理想情况下,应该测量计算单个哈希所需的时间,并设置迭代次数,使得计算时间与您愿意承担的最大时间相匹配。迭代次数越多越安全,但也更加耗费CPU资源(这取决于服务器)。当然,这可以更清晰地解释。 - martinstoeckli
2
现在我理解了其中的道理。然而,我认为 PHP 文档应该更接近规范的呈现方式,即迭代用于独立调整运行时间而不是内存分配。也许可以提供一些关于如何找到那个数字的指针,就像你自己解释的那样。 - Indigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接