1

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

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

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

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

我第一次尝试使用memory_get_usage()(使用或不true使用 PHP 的“真实”内存使用的可用参数),即使每次迭代执行大量内存计算,这些值似乎仍然非常静态。

使用这种(有点动态的)内存使用作为种子,让 PRNG 生成更多(快速)随机数是否明智?或者内存是一个如此有限的范围,他们可以创建 2^xx 种子并粗略猜测它。我开始模糊实际随机的界限,如果甚至可以猜测我的操作,即使他们“不是”真的那么随机。

4

3 回答 3

5

/dev/randomWindows 上(或通常推荐 /dev/urandom的)Unix 设备的标准等价物是CryptGenRandomCryptoAPI 中的函数。

在 PHP 中,您应该能够使用mcrypt_create_iv()with MCRYPT_DEV_URANDOM,它/dev/urandom在 Unix 和(显然)CryptGenRandom在 Windows 上使用。

于 2011-11-05T01:03:49.860 回答
2

Mersenne Twister(mt_rand 使用的)是用于非安全目的的良好算法,但不应用于安全。维基百科:Mersenne Twister:“本机形式的算法不适合密码学......观察足够数量的迭代(在 MT19937 的情况下为 624)允许人们预测所有未来的迭代。”

相反,只需获取计数器的输出,将其与一些盐连接(或 XOR),然后使用 SHA-2 之类的加密安全哈希算法对其进行哈希处理,这同样简单。如果没有人知道你的盐,那将是绝对安全的。盐就相当于梅森的种子。

我不是在 Windows 上从哪里获得好的随机盐的专家,但是您始终可以连接(或 XOR)诸如系统时间、内存使用等之类的东西,并使用 SHA-2 对其进行哈希处理。您甚至可以到Random.org之类的地方获取一些真正的随机数(如果您不经常调用它)。将随机源与 SHA-2 相结合的最佳部分是每个额外的源只能增加随机性,而不是减去它。

于 2011-11-04T20:36:53.753 回答
-1

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

mt_rand({min}, {max});

更多信息在这里: http: //php.net/manual/en/function.mt-rand.php

于 2011-04-25T02:13:20.447 回答