我正在寻找在PHP中生成UUID(版本4)但是我见过的所有方法都使用mt_rand()
我想避免它,因为如果生成的UUID可以被猜到,它会带来安全隐患。 / p>
我想出了以下内容:
function uuid_v4()
{
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
random_mcrypt(), random_mcrypt(),
// 16 bits for "time_mid"
random_mcrypt(),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
random_mcrypt(0x0fff) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
random_mcrypt(0x3fff) | 0x8000,
// 48 bits for "node"
random_mcrypt(), random_mcrypt(), random_mcrypt()
);
}
function random_mcrypt($max = 0xffff)
{
$int = current(unpack('S', mcrypt_create_iv(2, MCRYPT_DEV_URANDOM)));
$factor = $max / 0xffff;
return round($int * $factor);
}
这是否足以满足我的需求?有什么我应该知道的吗?
编辑:这已被标记为重复,在我的问题中不是因为我说其他答案(包括他被标记为重复的答案)使用我不想用的mt_rand()安全原因。编辑2:要清楚,这不是关于如何生成v4 UUID的问题,但我的方法是否改进了使用mt_rand()
的方法实现的安全性,是否有任何我应该知道的陷阱约。
答案 0 :(得分:1)
是否足以满足您的需求取决于您的威胁模型。你有一群孩子想要惹你,企业间谍恐惧,还是整个Chineese政府试图破坏你的系统?
MCRYPT_DEV_URANDOM
从/ dev / urandom生成熵。这可以避免对/ dev / random进行DOS攻击,在这种情况下,您需要一堆UUID并耗尽系统熵,直到程序阻塞。但是,这也意味着你绝对无法保证你的UUID中实际有多少熵 - 无论如何都没有。
已经编写了一些威胁模型,首先假设您使用大量请求来ping服务器以耗尽/ dev / urandom的熵,然后开始破解urandom密钥。
如果你真的关心安全问题,那么就像Blum Blum Shub一样,有加密的PRNG设计是安全的。