在我的应用程序中,我需要一个函数来生成(不可预测的)随机值,这些值在每次调用时都会不同,例如在快速循环内。
在作为平台的Linux平台上,我将发布我的脚本(其中的PHP应在SSL下运行)我将通过查询/ dev / random来组合可能的多个工具来确保种子或哈希是完全随机的结合OpenSSL的设施,包括系统特定的值,如上次修改的脚本和创建时间。
我正在使用这些特定的值,因为即使人A有脚本并且知道方法,他们也无法猜测(/ dev / random内容,此刻的内存使用情况,可能的修改时间等)并且实际上不会降低运行相同脚本的用户B的安全性。
在Windows平台上,我不得不暂时开发(我仍然在Linux上测试,但不经常测试)我需要上面描述的随机值,只是为了提供至少有限的保护来预测种子或密钥
我曾尝试使用memory_get_usage()
(有或没有可用的true
参数用于PHP的'true'内存使用)并且似乎即使每次迭代执行时值都保持非常静态相当多的记忆沉重的计算。
使用这种(有些动态的)内存使用作为种子,PRNG生成更多(快速)随机数可能是明智的吗?或者记忆是如此有限的范围,他们可以创建2 ^ xx种子并大致猜测它..我开始模糊现实的随机线,如果甚至可以猜测我的操作,即使他们“不是”真的那么随意。
答案 0 :(得分:5)
Windows上/dev/random
(或generally recommended /dev/urandom
)Unix设备的标准等效项是CryptoAPI的CryptGenRandom
函数。
在PHP中,您应该可以将mcrypt_create_iv()
与MCRYPT_DEV_URANDOM
一起使用,/dev/urandom
在Unix上使用CryptGenRandom
,在Windows上使用(显然){{1}}。
答案 1 :(得分:2)
Mersenne Twister(mt_rand使用的)是一种用于非安全目的的好算法,但它不应该用于安全性。 Wikipedia: Mersenne Twister: “本机形式的算法不适合加密......观察足够数量的迭代(MT19937的情况下为624),可以预测所有未来的迭代。”
相反,只需简单地获取计数器的输出,将其与某些盐连接(或异或),并使用加密安全哈希算法(如SHA-2)对其进行哈希处理。如果没有人知道你的盐,那将是绝对安全的。然后盐就相当于梅森的种子。
我不知道在Windows上哪里可以获得良好的随机盐,但是你总是可以连接(或异或)系统时间,内存使用等等,并使用SHA-2进行散列。您甚至可以到达Random.org之外的地方获取一些真正的随机数(如果您不经常调用它)。将随机源与SHA-2结合起来的最好的部分是每个额外的源只能添加随机性,而不是减去它。
答案 2 :(得分:-1)