代码之家  ›  专栏  ›  技术社区  ›  Travis

如何使用PHP生成加密安全的随机数?[副本]

  •  6
  • Travis  · 技术社区  · 16 年前

    可能重复:
    Secure random number generation in PHP

    3 回复  |  直到 9 年前
        1
  •  4
  •   Ilmari Karonen hansTheFranz    14 年前

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

    “如果出于安全或加密目的需要一些伪随机位(例如,random IV用于分组密码,random salt用于密码哈希),那么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/uradom的尝试和访问CAPICOM的尝试是安全的,尽管在另一个平台上,这两种尝试都会以静默方式失败。将它们都放在那里,这样您的代码将更便于移植。”

        2
  •  -4
  •   Eimantas    16 年前

    在我的脑海里:取微时间,乘以微时间%100,在收到结果的sha1上做一些随机操作。

        3
  •  -7
  •   SilentGhost    16 年前

    uniqid ? 文档中有一个示例,说明如何将其用于cookie/会话。

    推荐文章