我们需要生成一个加密随机字符串以用作身份验证令牌,该令牌将绑定到数据库中的会话数据。我们使用的是PHP,它似乎没有内置合适的随机数生成器。我们如何使用php生成N长度的加密安全随机字符串?
另请注意,由于我们的应用程序的性质,shell_exec不在桌面上。
答案 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 /会话的例子。