16

我正在尝试在身份验证库中实现 Argon2 算法。我希望能够为用户设置参数提供一些有用的提示。

虽然我了解参数如何影响算法memory_costthreads但我似乎无法理解time_cost参数。

PHP 文档说什么:

time_cost (integer) - 计算 Argon2 散列可能花费的最长时间。默认为 PASSWORD_ARGON2_DEFAULT_TIME_COST。

询问 1 -默认值为 2。它似乎代表时间,遗憾的是,单位似乎丢失了。是几秒钟吗?毫秒?

这个SO answer说默认是 2 seconds

Argon2 规格说明了什么:

在第 3.1 章Inputs中,这里没有提到时间,只提到了一些迭代。

迭代次数t(用于独立于内存大小调整运行时间)可以是从 1 到 2^32−1 的任何整数;

与时间相关的值在第 9 章推荐参数中定义,它说:

计算出x每次通话可以承受的最长时间(以秒为单位)

[...]

使用不同数量的 pass运行 type y、 memorym和lanes 和 threads 的方案。找出最大使得运行时间不超过。如果超过偶数,则相应减少。httxxt = 1m

使用刚刚确定的值mh和散列所有密码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=8m_cost=16MB似乎是合理的,因为它需要大约 200 毫秒才能运行。但这是否意味着该算法有一天可能需要长达 8 秒才能运行?可用性将是灾难性的!


我真的很努力地做我的研究,我很不舒服,我需要问来理解这一点。

但这确实令人困惑。由于它与安全性有关,我真的很想弄清楚这一点。

感谢您的见解!

4

1 回答 1

5

据我所知,这是 ARGON2 算法中的迭代次数。

如果你通过 PHP 源代码追踪它,你会得到

https://github.com/php/php-src/blob/master/ext/standard/password.c#L528

调用

https://github.com/PHC/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 的任何整数

于 2018-03-21T13:15:39.910 回答