Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使mt_rand()尽可能安全_Php_Security_Random_Cryptography - Fatal编程技术网

Php 使mt_rand()尽可能安全

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

我正在写一个抽奖计划,在那里人们有一些票,这些票由1到100之间的自然数标记

我使用
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()
    )或任何涉及浮点的函数
  • 不要使用模运算符将随机整数减少到某个范围。这将导致有偏的概率分布:
  • 好的CSPRNG不会退回到不安全的结果。如果没有合适的CSPRNG可用,不要只使用
    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