适用于Windows平台的安全随机数,例如/dev/random中的整数


A safe random number, such as an integer from /dev/random, for Windows platform?

在我的应用程序中,我需要一个函数来生成(不可预测的(随机值,这些值在每次调用时都会有所不同,例如在快速循环中。

在Linux平台上,我将发布我的脚本(其中的脚本将在PHP中的SSL下运行(,我将通过查询/dev/random,可能与OpenSSL的功能相结合,并包括系统特定的值,如上次修改的脚本和创建时间,来组合可能的多个功能,以确保种子或哈希是完全随机的。

我使用这些特定的值,因为即使人A有脚本并知道方法,他们也无法猜测(/dev/random内容、当前内存使用情况、可能的修改时间等(,而且实际上也无法降低用户B运行相同脚本的安全性。

不幸的是,我现在必须在Windows平台上开发(我仍然在Linux上测试,但频率较低(,我需要上面描述的随机值,只是为了提供至少有限的保护,避免预测种子或密钥。

我第一次尝试使用memory_get_usage()(有或没有true参数来表示PHP的"真实"内存使用情况(,即使每次迭代都执行相当多的内存密集计算,这些值似乎仍然非常静态。

使用这种(有点动态的(内存使用作为种子,让PRNG生成更多(快速(的随机数,这可能是明智的吗?或者,记忆的范围如此有限,他们只能创建2^xx个种子,然后粗略地猜测它。我开始模糊现实中的随机性,如果可以猜测我的操作,即使它们"不是"那么随机。

Windows上/dev/random(或通常推荐的/dev/urandom(Unix设备的标准等价物是CryptoAPI中的CryptGenRandom函数。

在PHP中,您应该能够将mcrypt_create_iv()MCRYPT_DEV_URANDOM一起使用,后者在Unix上使用/dev/urandom,在Windows上(显然(使用CryptGenRandom

Mersenne Twister(mt_rand使用的(对于非安全目的来说是一个很好的算法,但它不应该用于安全目的。维基百科:Mersenne Twister:"原生形式的算法不适合密码学……观察足够数量的迭代(MT19937为624次(可以预测未来的所有迭代。">

相反,只需获取计数器的输出,用一些盐将其连接(或XOR(,然后用SHA-2等加密安全的哈希算法对其进行哈希,就可以了。如果没有人知道你的盐,它将是绝对安全的。盐就相当于梅森的种子。

我不是在Windows上从哪里获得好的随机盐的专家,但你总是可以连接(或XOR(系统时间、内存使用情况等,并用SHA-2进行散列。你甚至可以在外面的Random.org这样的地方找到一些真正的随机数(如果你不经常打电话的话(。将随机性源与SHA-2相结合的最佳部分是,每个额外的源只能添加随机性,而不能减去随机性。

为什么不直接使用类似的东西?

mt_rand({min}, {max});

更多信息请点击此处:http://php.net/manual/en/function.mt-rand.php