gpt4 book ai didi

php - 使 mt_rand() 尽可能安全

转载 作者:可可西里 更新时间:2023-11-01 13:39:57 25 4
gpt4 key购买 nike

我正在编写一个抽奖程序,其中人们有一些票,这些票由 1 到 100 之间的自然数标记。

我用mt_rand(1,100)生成中奖号码,然后输出到网站上,让大家看到。

现在我做了一些研究,并从 Merseene wiki 文章中发现:

观察足够数量的迭代(在 MT19937 的情况下为 624,因为这是生成 future 迭代的状态向量的大小)允许预测所有 future 迭代。

mt_rand() MT19937使用的是当前版本吗?

如果是这样,我可以做些什么来使我生成的数字在密码学上更加安全?

提前致谢:-)

最佳答案

简短的回答:

If so, what can I do to make my generated numbers more cryptographically secure?

您可以简单地使用适合此任务的随机数生成器而不是mt_rand()

等PHP 7出来了,就可以用random_int()了当您的项目需要加密安全随机数生成器时。

“好的,很好,但是 PHP 7 还没有出来。今天我要做什么?”

好吧,你很幸运,你有两个不错的选择。

使用RandomLib .或者

我一直致力于将 PHP 7 的 CSPRNG 函数向后移植到 PHP 5 项目中。它位于 paragonie/random_compat 下的 Github 上。 .

“我不想使用库;我如何安全地使用自己的库?”

在涉及密码学时,滚动自己的实现通常是一个糟糕的决定。 “不是这里发明的”通常是一件好事。但是,如果您执意要将自己的 PHP 库写入 securely generate random integers or strings , 有几点需要注意:

  1. 使用可靠的随机源。在 order of preference ,从/dev/urandom读取应该是你的首选,其次是mcrypt_create_iv()MCRYPT_DEV_URANDOM,然后是从CAPICOM读取(仅限 Windows),最后是 openssl_random_pseudo_bytes()
  2. /dev/urandom 读取时,缓存您的文件描述符以减少每次函数调用的开销。
  3. /dev/urandom 读取时,PHP 将始终缓冲 8192 字节的数据(您可能不会使用)。请务必关闭读取缓冲(即 stream_set_read_buffer($fileHandle, 0);)。
  4. 避免任何可能泄露计时信息的功能或操作。这意味着,通常,您希望使用按位运算符而不是数学函数(例如 log())或任何涉及 float 的东西。
  5. 不要使用模运算符将随机整数缩小到一个范围内。这将导致有偏的概率分布: Biased distribution proof-of-concept
  6. 好的 CSPRNG 不会退回到不安全的结果。如果没有合适的 CSPRNG 可用,不要默默地使用 mt_rand();相反,抛出未捕获的异常或发出 fatal error 。立即引起开发人员的注意。

关于php - 使 mt_rand() 尽可能安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31365318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com