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

Ind*_*igo 15 php password-hash php-password-hash argon2-ffi

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

虽然我理解memory_costthreads参数如何影响算法,但我似乎无法绕过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,内存mh通道以及线程的方案t.计算最大t运行时间不超过的最大值x.如果超过x甚至t = 1,减少m相应.

使用刚确定的值,和m,哈希所有密码.ht

讯问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
Run Code Online (Sandbox Code Playgroud)

我仍然没有得到如何time_cost在几秒钟内的时间.

如果它是一个上限(意味着它可以运行的最大时间),那么它甚至没有帮助.例如,t_cost=8并且m_cost=16MB看似合理,因为它需要大约200ms才能运行.但这意味着算法有一天可能需要8秒才能运行?可用性将是灾难性的!


我真的很想做我的研究,我不太愿意要求你理解这一点.

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

感谢您的见解!

小智 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 - 1

  • 但是,PHP文档使它不必要地混淆.当你真正谈论迭代时,为什么要谈论"最长时间"...... (3认同)
  • 仅供参考:欢迎任何人通过[在线文档编辑器](https://edit.php.net/?project=PHP&perm=en/function.password-hash.php)或[pull request]建议对这些文档进行编辑(https://github.com/salathe/phpdoc-en/blob/master/reference/password/functions/password-hash.xml). (2认同)
  • 现在我明白了其背后的原理。然而,我认为 PHP 文档应该更接近规范的呈现方式,即迭代用于独立于分配的内存来调整运行时间。正如您自己所解释的那样,也许会提供一些有关如何找到该数字的指示。 (2认同)