[英]Argon2 Algorithm in PHP7: understanding the time_cost parameter
我正在尝试在验证库中实现Argon2算法。 我希望能够为用户提供一些有用的提示来设置参数。
虽然我理解memory_cost
和threads
参数如何影响算法,但我似乎无法绕过time_cost
参数。
time_cost(整数) - 计算Argon2哈希值所需的最长时间。 默认为PASSWORD_ARGON2_DEFAULT_TIME_COST。
讯问1 -默认值为2.它似乎代表一个时间 ,遗憾的是,单位似乎缺失。 是几秒钟? 毫秒?
这个SO答案说默认是2 秒 。
在第3.1章输入中 ,这里没有提到时间,只有大量的迭代。
迭代次数
t
(用于独立于存储器大小调整运行时间)可以是从1到2 ^ 32-1的任何整数;
与时间相关的值在第9章推荐参数中定义,它说:
计算出每个呼叫可以承受的最大时间量
x
(以秒为单位)[...]
使用不同的传递次数
t
运行y
型,内存m
和h
通道和线程的方案。 计算出最大值t
,使运行时间不超过x
。 如果即使t = 1
也超过x
,则相应地减小m
。使用刚确定的值
m
,h
和t
来散列所有密码。
讯问2 -这是否意味着PHP暴露了时间量x
并确定了正确的迭代量t
?
定义算法执行时间和迭代次数的时间成本
[...]
时间成本表示将运行哈希算法的次数。
讯问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
似乎是合理的,因为它需要大约200ms才能运行。 但这意味着算法有一天可能需要8秒才能运行? 可用性将是灾难性的!
我真的很想做我的研究,我不太愿意要求你理解这一点。
但这真的令人困惑。 由于它与安全性有关,我真的想深究这一点。
感谢您的见解!
据我所知,它是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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.