在PHP中安全UUID v4生成 - 没有mt_rand()

时间:2013-06-03 15:25:17

标签: php security random uuid mcrypt

我正在寻找在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()的方法实现的安全性,是否有任何我应该知道的陷阱约。

1 个答案:

答案 0 :(得分:1)

是否足以满足您的需求取决于您的威胁模型。你有一群孩子想要惹你,企业间谍恐惧,还是整个Chineese政府试图破坏你的系统?

MCRYPT_DEV_URANDOM从/ dev / urandom生成熵。这可以避免对/ dev / random进行DOS攻击,在这种情况下,您需要一堆UUID并耗尽系统熵,直到程序阻塞。但是,这也意味着你绝对无法保证你的UUID中实际有多少熵 - 无论如何都没有。

已经编写了一些威胁模型,首先假设您使用大量请求来ping服务器以耗尽/ dev / urandom的熵,然后开始破解urandom密钥。

如果你真的关心安全问题,那么就像Blum Blum Shub一样,有加密的PRNG设计是安全的。