Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从/dev/uradom转换随机值_Php_Random - Fatal编程技术网

Php 从/dev/uradom转换随机值

Php 从/dev/uradom转换随机值,php,random,Php,Random,正如本文中提到的,它的安全性很弱,我们应该使用/dev/uradom来代替。我的问题是我从Uradom得到一个二进制字符串 如何将此二进制字符串转换为0-9a-zA-Z 看起来base\u convert()在这里不起作用。只需使用base64\u编码($yourbinaryuradomstring) 根据该结果,您可以使用类似于sha1()或md5()的散列函数,应该可以。您甚至不必对“=” 我不太确定散列函数是否可以自己读取二进制字符串,请尝试一下。仅记录完整函数: function ran

正如本文中提到的,它的安全性很弱,我们应该使用/dev/uradom来代替。我的问题是我从Uradom得到一个二进制字符串

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


看起来
base\u convert()
在这里不起作用。

只需使用
base64\u编码($yourbinaryuradomstring)

根据该结果,您可以使用类似于
sha1()
md5()
的散列函数,应该可以。您甚至不必对
“=”


我不太确定散列函数是否可以自己读取二进制字符串,请尝试一下。

仅记录完整函数:

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;
}

使用
/dev/uradom
的一种方法是使用适合您需要的函数

但是,如果需要真正的随机数,最好使用
/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]);
?>

显然这不是生产代码。

您可以用于二进制到字符串的转换。 PHP7增加了DOM查找

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


你能给我们提供更多关于这个问题的背景资料吗。可能有更好的解决方案可以满足您的需要,例如。为什么base64_encode()不起作用?嗯,它确实起作用了!只需要转换一些字符,比如=/但我不能接受你的答案;)好的,给你:)谢谢!Naa,我今天没有哈希函数。刚吃过;)加密安全的PRNG仍然适用于加密。而
/dev/random
是否提供了它的实际熵池在很大程度上取决于操作系统。在FreeBSD中,两者都是相同的,使用Yarrow。是的,我知道第一部分,但我不想对我的答案过于夸张。关于
uniqid()
:“此函数不会创建随机或不可预测的字符串。此功能不得用于安全目的。使用加密安全的随机函数/生成器和加密安全的哈希函数来创建不可预知的安全ID。”(来自PHP文档)
/dev/urandom
rand
mt_rand
不同,它不是伪的。在更坏的情况下,它从一个不断刷新的真正随机的池中创建随机数。大多数情况下,它与
/dev/random
/dev/random更随机,/dev/random和/dev/urandom使用完全相同的CSPRNG一样好。有关详细信息,请参阅: