gpt4 book ai didi

php - 截断的 mt_rand() 更安全吗?

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:27 25 4
gpt4 key购买 nike

我看到了那些文章:

其中展示了如何恢复 mt_rand() 函数的种子。附加代码可以在一分钟内(或更快)从第一个 mt_rand() 中暴力破解种子。事实上,大多数 PHP 应用程序都使用带范围参数的 mt_rand。这会截断结果。我的问题是它是否使破解变得更加困难?首先,我可以想象不能只用一个数字来强行使用它。他需要有一个完整的序列。它会使破解过程显着延长还是无关紧要? mt_rand(from, to) 是否比 mt_rand() 安全得多?

最佳答案

Calling mt_rand($min, $max) is basically equivalent to the following :

$rand_in_range_min_to_max = (int)($min + ($max - $min) * ($rand/mt_getrandmax()));

因此,不是从 0 到 231-1 的理论范围内选择随机数,而是从 $min 中选择随机数至 $max反而。如果$min大于 0$max小于 1<<31-1 ,仅此一项就已经减少了可能的种子值的数量。

现在自 the presented attack是一种蛮力攻击,减少猜测次数确实也减少了完成蛮力过程的时间。

但是,由于蛮力过程的结果值不是实际的随机值,而只是随机值映射到的值,因此攻击者需要检查映射到该蛮力的每个可能的输入值-强制值。该范围可以计算如下:

$rand_min = (int)(($rand_in_range_min_to_max - $min) / ($max - $min) * mt_getrandmax());
$rand_max = (int)($rand_min + mt_getrandmax() / ($max - $min + 1));

// range whose values are mapped onto $rand_in_range_min_to_max
$range = range($rand_min, $rand_max);
foreach ($range as $rand) {
assert($rand_in_range_min_to_max === (int)($min + ($max - $min) * ($rand/mt_getrandmax())));
}

由于范围内的每个数字都被相同地映射,它们都只是用于生成序列中的下一个随机数的潜在数字。为了准确无误地识别出实际数字,攻击者最多需要 mt_getrandmax() / ($max - $min)随后生成随机数。

所以,实际上,使用 mt_rand($min, $max) 确实增加了攻击者找到实际种子的努力,因为他必须为多个随机值暴力破解种子,并且他需要 mt_getrandmax() / ($max - $min)随后生成随机数以唯一标识正确的种子。

关于php - 截断的 mt_rand() 更安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261999/

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