【问题标题】:is mt_rand() more secure than rand() [duplicate]mt_rand() 比 rand() 更安全吗?
【发布时间】:2014-10-07 06:53:29
【问题描述】:

昨天无意中听到一个关于rand()mt_rand()的对话,一位同事说这两个都是可以预测的,你应该使用不同的功能吗?我想知道,我知道rand() 在某种程度上是可以预测的,并且经过一些谷歌搜索。如果我没看错的话,即使mt_rand() 似乎也是可以预见的。

为此,我编写了一小段代码,用于创建图像:

<?php
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
for ($y = 0; $y < 512; $y++) {
    for ($x = 0; $x < 512; $x++) {
        if (rand(0, 1)) {
            imagesetpixel($im, $x, $y, $white);
        }
        else{
            imagesetpixel($im, $x, $y, $black);
        }
    }
}
imagepng($im); imagedestroy($im);

?>

此代码输出此图像,您可以看到它具有某种模式:

mt_rand() 函数给了我这个输出:

现在我的问题是,mt_rand() 真的那么可预测吗,与rand() 函数相比,它对我来说似乎很随机。

【问题讨论】:

  • 在这种情况下,secure 是什么意思?你的意思是说价值无法预测?
  • 这种方法比打印随机数10000次再统计要好得多。
  • randmt_rand 都是 pseudo 随机数生成器,根据它们的定义,它们在某些情况下是可预测的(例如,你得到知道他们的种子或内部状态)。对于真正不可预测的随机数,您需要一个硬件生成器。维护由或多或少随机事件和/或实际硬件 RNG 推动的熵池的操作系统级实现比此类 PRNG 随机得多。

标签: php


【解决方案1】:

直接来自the docs

此函数不会生成加密安全值,不应用于加密目的。如果您需要加密安全值,请考虑改用 openssl_random_pseudo_bytes()。

mt_rand 生成的随机数比rand更好,而且速度更快。但这并不能使它“安全”,因为它应该用于密码学。它对于您的应用程序是否足够安全是非常主观的。

【讨论】:

  • 我正要发布同样的内容。不知道是谁 DV 制作了这个或为什么。
  • “安全”我们不知道用户是否意味着密码学。
  • @SpencerWieczorek 不,我们没有。
  • 假设我使用mt_rand() 生成盐,会不安全吗?
  • @Azrael 这是编写自己的解决方案的糟糕理由。现有/经过验证的解决方案将被修复,并且比您自己编写的任何东西都更难破解。我不想阻止实验,但您真的绝对不得尝试为生产系统编写自己的密码库。这是最难做好的事情之一,赌注最高,现有的经过实战考验的解决方案非常丰富。
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2016-09-29
  • 1970-01-01
相关资源
最近更新 更多