PHP7 中的 Argon2 算法:了解 time_cost 参数
Argon2 Algorithm in PHP7: understanding the time_cost parameter
我正在尝试在身份验证库中实现 Argon2 算法。我希望能够为用户设置参数提供一些有用的提示。
虽然我了解 memory_cost
和 threads
参数如何影响算法,但我似乎无法理解 time_cost
参数。
什么 PHP doc says:
time_cost (integer) - Maximum amount of time it may take to compute the Argon2 hash. Defaults to PASSWORD_ARGON2_DEFAULT_TIME_COST.
审讯1 -默认值是2,好像代表一个时间 ,可悲的是,这个单位似乎不见了。是几秒钟吗?毫秒?
这个说默认是2秒。
什么 Argon2 specs says:
第3.1章输入,这里没有提到时间,只讲了迭代次数
Number of iterations t
(used to tune the running time independently of the memory size) can be any integer number from 1 to 2^32−1;
在第9章推荐参数中定义了一个与时间相关的值,它说:
Figure out the maximum amount x
of time (in seconds) that each call can afford
[...]
Run the scheme of type y
, memory m
and h
lanes and threads, using different number of pass t
. Figure out the maximum t
such that the running time does not exceed x
. If it exceeds x
even for t = 1
, reduce m
accordingly.
Hash all the passwords with the just determined values m
, h
, and t
.
审讯2-那么这是否意味着PHP暴露时间x
并确定正确的迭代次数 t
?
PHP RFC 说的是什么:
A time cost that defines the execution time of the algorithm and the number of iterations
[...]
The time cost represents the number of times the hash algorithm will be run.
审问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=8
和 m_cost=16MB
看起来很合理,因为 运行 大约需要 200 毫秒。但这意味着该算法有一天可能需要 8 秒才能达到 运行?可用性将是灾难性的!
我真的很努力地做了我的研究,但我不太愿意问这个问题。
但这确实令人困惑。既然涉及到安全问题,我很想查个水落石出。
感谢您的见解!
据我所知,这是 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
之间的任意整数
我正在尝试在身份验证库中实现 Argon2 算法。我希望能够为用户设置参数提供一些有用的提示。
虽然我了解 memory_cost
和 threads
参数如何影响算法,但我似乎无法理解 time_cost
参数。
什么 PHP doc says:
time_cost (integer) - Maximum amount of time it may take to compute the Argon2 hash. Defaults to PASSWORD_ARGON2_DEFAULT_TIME_COST.
审讯1 -默认值是2,好像代表一个时间 ,可悲的是,这个单位似乎不见了。是几秒钟吗?毫秒?
这个
什么 Argon2 specs says:
第3.1章输入,这里没有提到时间,只讲了迭代次数
Number of iterations
t
(used to tune the running time independently of the memory size) can be any integer number from 1 to 2^32−1;
在第9章推荐参数中定义了一个与时间相关的值,它说:
Figure out the maximum amount
x
of time (in seconds) that each call can afford[...]
Run the scheme of type
y
, memorym
andh
lanes and threads, using different number of passt
. Figure out the maximumt
such that the running time does not exceedx
. If it exceedsx
even fort = 1
, reducem
accordingly.Hash all the passwords with the just determined values
m
,h
, andt
.
审讯2-那么这是否意味着PHP暴露时间x
并确定正确的迭代次数 t
?
PHP RFC 说的是什么:
A time cost that defines the execution time of the algorithm and the number of iterations
[...]
The time cost represents the number of times the hash algorithm will be run.
审问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=8
和 m_cost=16MB
看起来很合理,因为 运行 大约需要 200 毫秒。但这意味着该算法有一天可能需要 8 秒才能达到 运行?可用性将是灾难性的!
我真的很努力地做了我的研究,但我不太愿意问这个问题。
但这确实令人困惑。既然涉及到安全问题,我很想查个水落石出。
感谢您的见解!
据我所知,这是 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
之间的任意整数