【问题标题】:is truncated mt_rand() safer?截断的 mt_rand() 更安全吗?
【发布时间】:2013-04-28 10:37:49
【问题描述】:

我看到了那些文章:

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

【问题讨论】:

  • 关于 rand 函数的精彩解释:stackoverflow.com/questions/12729459/…
  • 顺便说一句,但如果您需要避免此类事情,因为重要的事情取决于它,您希望使用加密安全的 RNG,而不是尝试破解您自己的。跨度>
  • 如果出于安全考虑,请使用加密 PRNG。如mcrypt_create_iv

标签: php c security random


【解决方案1】:

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)生成随机数以唯一标识正确的种子。

【讨论】:

  • 感谢您的回答,非常有帮助。只是为了帮助我更好地理解,这不会返回许多潜在的种子吗?例如,范围是 0,1 比 50% 的断言为 TRUE。这将是很多结果,其中只有一个是正确的?
  • @LukaszKujawa 是要识别种子以预测下一个随机数还是只希望能够预测下一个哈希值是有区别的。 In case of the latter, when mt_rand(0, 1) is chosen, you already have a 50-50 chance to guess the next number correctly.但是,如果将随机数映射到像mt_rand 这样的较小范围内,使用 minmax 进行映射,您将获得多个可能的种子,它们都映射相同。在这种情况下,您需要按顺序排列更多数字才能正确识别最初使用的种子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2021-05-20
  • 2012-04-28
  • 2018-07-03
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多