是mt_rand()比rand()更安全

Azr*_*ael 5 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);

?>
Run Code Online (Sandbox Code Playgroud)

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

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

现在我的问题是,mt_rand()真的是可预测的,与rand()功能相比,我似乎很随机.

mea*_*gar 7

直接来自文档:

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

mt_rand生成更好的随机数rand,速度更快.但是,这并不意味着它应该用于密码学.它对您的应用是否足够安全是非常主观的.

  • @Azrael这是编写自己的解决方案的可怕理由.现有/经过验证的解决方案将被*固定*,并且比您自己编写的任何内容都难以破解数量级.我不想阻止实验,但你真的绝对*必须*不要尝试为生产系统编写自己的加密库.这是最难实现的事情之一,拥有最高风险,现有经过实战考验的解决方案非常丰富. (4认同)