是mt_rand()比rand()更安全

时间:2014-10-07 06:53:29

标签: php

昨天我无意中听到关于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);

?>

此代码输出此图像,因为您可以看到它具有某种模式: rand() image

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

现在我的问题是,mt_rand()真的是可预测的,与rand()函数相比,它似乎相当随机。

1 个答案:

答案 0 :(得分:7)

直接来自the docs

  

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

mt_rand生成更好的随机数,而不是rand,并且速度更快。但这并没有使它“安全”#34;从某种意义上说,它应该用于加密。它对您的应用程序是否足够安全是非常主观的。