Php 使mt_rand()尽可能安全
我正在写一个抽奖计划,在那里人们有一些票,这些票由1到100之间的自然数标记 我使用Php 使mt_rand()尽可能安全,php,security,random,cryptography,Php,Security,Random,Cryptography,我正在写一个抽奖计划,在那里人们有一些票,这些票由1到100之间的自然数标记 我使用mt_rand(1100)生成中奖彩票的编号,然后将其输出到站点,以便每个人都能看到 现在我做了一些研究,从Merseene维基的文章中发现: 观察足够数量的迭代(在MT19937的情况下为624,因为这是产生未来迭代的状态向量的大小)允许预测所有未来迭代 mt_rand()MT19937是否使用当前版本 如果是这样,我该怎么做才能使生成的数字更安全 提前感谢:-)mt_rand它的名字就是Mersenne Tw
mt_rand(1100)
生成中奖彩票的编号,然后将其输出到站点,以便每个人都能看到
现在我做了一些研究,从Merseene维基的文章中发现:
观察足够数量的迭代(在MT19937的情况下为624,因为这是产生未来迭代的状态向量的大小)允许预测所有未来迭代
mt_rand()MT19937是否使用当前版本
如果是这样,我该怎么做才能使生成的数字更安全
提前感谢:-)
mt_rand
它的名字就是Mersenne Twister,一种不安全的随机数生成器。此外,它通常只是以毫秒为单位的特定时间的种子,攻击者可以简单地猜测或瞄准
你不能保证梅森缠绕机的安全。所以,如果可能的话,你应该使用一个由熵源播种的安全随机数生成器。这个熵源通常是从操作系统获得的。最好是基于OpenSSL的
你完全没有理由会被MT困住。PRNG只是算法而已。有很多库包含安全的PRNG。简单回答:
如果是这样,我该怎么做才能使生成的数字更安全
您只需使用适合此任务的随机数生成器而不是mt_rand()
当PHP7问世时,您可以在项目中使用加密安全的随机数生成器
“好的,很好,但是PHP7还没有发布。我今天要做什么?”
嗯,你很幸运,你有两个很好的选择
使用。或
我一直致力于将PHP7的CSPRNG函数向后移植到PHP5项目中。它生活在Github上
“我不想使用图书馆;我如何安全地使用自己的图书馆?”
当涉及到密码学时,滚动您自己的实现通常是一个糟糕的决定。“不是在这里发明的”通常是件好事。但是,如果您执意要编写自己的PHP库,那么有几件事需要记住:
/dev/uradom
应该是您的首选,然后是使用mcrypt\u dev\u uradom
阅读CAPICOM
(仅限Windows),最后是openssl\u random\u pseudo\u bytes()
/dev/uradom
读取时,缓存文件描述符以减少每次函数调用的开销/dev/uradom
读取数据时,PHP将始终缓冲8192字节的数据(很可能您不会使用这些数据)。确保关闭读取缓冲(即stream\u set\u read\u buffer($fileHandle,0);
)log()
)或任何涉及浮点的函数mt_rand()
;相反,抛出未捕获的异常或发出致命错误。立即引起开发人员的注意抱歉,Mersenne Twister不是为满足加密要求而设计的。不,您不能也不应该尝试修复它,因为通常当非专家试图改进加密功能时,他们只会让事情变得更糟 Php长期以来一直存在用于加密目的的随机性问题。我将指出一些关于轻松阅读的参考资料:
据我所知,在PhP应用程序中生成安全(伪)随机数的最佳选择是使用。不要尝试抛光turd,使用安全rng而不是
mt_rand
。Lol,“不要尝试抛光turd”。另外,我觉得值得一提。抱歉,没有魔法精灵粉尘可以洒在RNG上以确保加密安全。不要切换到任何一个。我建议使用。我真的希望这是来自密码背景的讽刺,你写的下面这句话在我脑海中敲响了警钟:“截至本文撰写之时,它还没有被允许稳定发布,但它已经通过了我向其展示的所有安全专家的审查。”告诉我们这些所谓的专家是谁怎么样?当然可以。CodesInChaos(BLAKE2作者之一)、SammyK和Leigh(参与PHP7CSPRNG功能的两位作者)、Taylor Hornby(解除安全)、Padraic Brady、Chris Cornutt和sarnold in#crypto。我也向安东尼·费拉拉(ircmaxell)展示了它,但我不知道他对它的研究有多深入。实际的评论者和贡献者名单要长得多。有关详细信息,请参阅和自述文件。@TheGreatContini如果您不满意,请自行查看代码,并告诉我库是否可以做得更好。:)“我把openssl_random_pseudo_bytes()作为第一或第二选择。”我不确定我是否完全同意你的最后一句话。。。“你可以自己编写代码”-我认为这应该是一个很大的警告。写一个正确的PRNG很难,你可能会把它搞砸。@SvenSlootweg Maarten是我期望能够写一个而不把它搞砸的少数人之一,但尽管如此,我同意这对普通公众来说是个坏建议。是的,如果这不清楚,我用的是“你”这个词,一般意义上是对公众的建议,不是在个人意义上对马腾:)@Sco