从/ dev / urandom转换随机值

时间:2011-12-08 10:47:10

标签: php random

comments of mt_rand()中所述,它在安全方面很弱,我们应该使用/ dev / urandom。我的问题是,从urandom我得到一个二进制字符串。

如何将此二进制字符串转换为0-9a-zA-Z?

看起来base_convert()在这里不起作用。

4 个答案:

答案 0 :(得分:3)

仅为记录完整功能:

function randomFromDev($len)
{
    $fp = @fopen('/dev/urandom','rb');
    $result = '';
    if ($fp !== FALSE) {
        $result .= @fread($fp, $len);
        @fclose($fp);
    }
    else
    {
        trigger_error('Can not open /dev/urandom.');
    }
    // convert from binary to string
    $result = base64_encode($result);
    // remove none url chars
    $result = strtr($result, '+/', '-_');
    // Remove = from the end
    $result = str_replace('=', ' ', $result);
    return $result;
}

答案 1 :(得分:2)

您可以使用bin2hex进行二进制到字符串转换。 PHP 7 random_bytes添加了随机查找。

<?php
$bytes = random_bytes(5);
$str = bin2hex($bytes);
var_dump($str);
// string(10) "385e33f741" 
?>

答案 2 :(得分:1)

只需使用base64_encode($yourbinaryurandomstring)

有了这个结果,你可以例如使用像sha1()md5()这样的哈希函数,应该没问题。您甚至没有对"="

进行任何转换

我不太确定哈希函数是否可以为自己读取二进制字符串,只需试一试。

答案 3 :(得分:1)

使用/dev/urandom的一种方法是功能uiniqid,它应该符合您的需求。

但是,如果您需要真随机数,最好使用/dev/random,因为/dev/urandom仍然是伪随机数生成器,它使用/dev/random作为种子值

访问随机数流并不难。

<?php
$r = unpack('v*', fread(fopen('/dev/random', 'r'),16));
$uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    $r[1], $r[2], $r[3], $r[4] & 0x0fff | 0x4000, 
    $r[5] & 0x3fff | 0x8000, $r[6], $r[7], $r[8]);
?>

显然这不是生产代码。