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

时间:2018-03-21 10:09:28

标签: php password-hash php-password-hash argon2-ffi

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

虽然我了解memory_costthreads参数对算法的影响,但我似乎无法绕过time_cost参数。

PHP doc says

  

time_cost(整数) - 计算Argon2哈希值所需的最长时间。默认为PASSWORD_ARGON2_DEFAULT_TIME_COST。

讯问1 - 默认值为2.它似乎代表时间,遗憾的是,该单元似乎缺失。是几秒钟?毫秒?

SO answer表示默认值为2

Argon2 specs says

在第3.1章输入中,这里没有提及时间,只有大量的迭代。

  

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

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

  

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

     

[...]

     

使用不同的传递次数y运行类型m,内存ht通道和线程的方案。计算最大t,使运行时间不超过x。如果即使x超过t = 1,也请相应地减少m

     

使用刚刚确定的值mht散列所有密码。

讯问2 - 这是否意味着PHP会公开时间x并确定正确的迭代量t

PHP RFC说的是什么:

  

定义算法执行时间和迭代次数的时间成本

     

[...]

     

时间成本表示哈希算法运行的次数。

讯问3 - 他们谈论时间和迭代次数。现在我更加困惑。是时间还是多次迭代?如果我使用time_cost = 2运行哈希,这是否意味着需要2秒?

基准

为了帮助我理解一下,我已经做了little benchmark script。 我得到了以下结果(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秒才能运行?可用性将是灾难性的!

我真的试着做我的研究,而且我不太愿意要求理解这一点。

但这真令人困惑。由于它与安全性有关,我真的想深究这一点。

感谢您的见解!

1 个答案:

答案 0 :(得分:5)

据我所知,它是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之间的任何整数