gpt4 book ai didi

php - PHP7 中的 Argon2 算法 : understanding the time_cost parameter

转载 作者:IT王子 更新时间:2023-10-28 23:55:28 24 4
gpt4 key购买 nike

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

虽然我了解 memory_costthreads 参数如何影响算法,但我似乎无法理解 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.

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

这个 SO answer表示默认值为 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=8m_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 之间的任意整数

关于php - PHP7 中的 Argon2 算法 : understanding the time_cost parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com