如何使用PHP生成加密安全随机数?

时间:2009-10-11 15:23:39

标签: php cryptography random

  

可能重复:
  Secure random number generation in PHP

我们需要生成一个加密随机字符串以用作身份验证令牌,该令牌将绑定到数据库中的会话数据。我们使用的是PHP,它似乎没有内置合适的随机数生成器。我们如何使用php生成N长度的加密安全随机字符串?

另请注意,由于我们的应用程序的性质,shell_exec不在桌面上。

3 个答案:

答案 0 :(得分:4)

根据您的平台,您可以使用/ dev / urandom或CAPICOM。这在this comment from Mark Seecof中很好地总结了:

  

“如果你需要一些伪随机位用于安全或加密目的(egg,随机IV用于分组密码,随机盐用于密码散列)mt_rand()是一个很差的来源。在大多数Unix / Linux和/或MS-Windows平台上您可以从操作系统或系统库中获得更好等级的伪随机位,如下所示:

     
<?php
// get 128 pseudorandom bits in a string of 16 bytes

$pr_bits = '';

// Unix/Linux platform?
$fp = @fopen('/dev/urandom','rb');
if ($fp !== FALSE) {
    $pr_bits .= @fread($fp,16);
    @fclose($fp);
}

// MS-Windows platform?
if (@class_exists('COM')) {
    // http://msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx
    try {
        $CAPI_Util = new COM('CAPICOM.Utilities.1');
        $pr_bits .= $CAPI_Util->GetRandom(16,0);

        // if we ask for binary data PHP munges it, so we
        // request base64 return value.  We squeeze out the
        // redundancy and useless ==CRLF by hashing...
        if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); }
    } catch (Exception $ex) {
        // echo 'Exception: ' . $ex->getMessage();
    }
}

if (strlen($pr_bits) < 16) {
    // do something to warn system owner that
    // pseudorandom generator is missing
}
?>
     

注意:保留读取/ dev / urandom的尝试和尝试访问代码中的CAPICOM通常是安全的,尽管每个都会在另一个平台上无声地失败。把它们留在那里,这样你的代码就会更便携。“

答案 1 :(得分:-4)

离开我的头顶:拿微时间,乘以microtime%100,并在收到结果的sha1上做几个randoms。

答案 2 :(得分:-7)

uniqid怎么样? docs有一个如何用于cookie /会话的例子。