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