当前位置: 首页 > 面试题库 >

在PHP中生成加密安全的随机数

鲁羽
2023-03-14
问题内容

PHP的rand()函数不能提供良好的随机数。因此,我开始使用mt_rand()据说效果更好的产品。但是这些结果有多好?有什么方法可以再次改善它们?

我的点子:

function rand_best($min, $max) {
    $generated = array();
    for ($i = 0; $i < 100; $i++) {
        $generated[] = mt_rand($min, $max);
    }
    shuffle($generated);
    $position = mt_rand(0, 99);
    return $generated[$position];
}

这应该给您“完美的”随机数,不是吗?


问题答案:

伪随机数生成器(PRNG)是非常复杂的野兽。

没有真正的“完美”随机数生成器-实际上,可以通过数学函数完成的最好的操作是伪随机数-对于大多数意图和目的,它们似乎足够随机。

实际上,从PRNG返回的数字中执行任何其他操作并不会真正增加其随机性,并且实际上,数字的随机性会降低。

因此,我最好的建议是,不要弄乱PRNG返回的值。使用足以满足预期用途的PRNG,如果不是,则在必要时找到可以产生更好结果的PRNG。

坦率地说,该mt_rand函数似乎使用了Mersennetwister,它实际上是一个非常不错的PRNG,因此对于大多数临时使用来说可能已经足够好了。

但是, Mersenne Twister并非旨在用于任何安全上下文

编辑

评论中有一个问题,为什么对随机数执行运算可以使随机性降低。例如,某些PRNG可以在比特的不同部分返回更一致,更少的随机数-高端可能比低端更多。

因此,在丢弃高端并返回低端的操作中,该值的随机性可能小于从PRNG返回的原始值。

目前,我找不到很好的解释,但是我基于Java文档中的Random.nextInt(int)方法进行了解释,该方法旨在在指定范围内创建一个相当随机的值。该方法考虑了值各部分的随机性差异,因此与诸如的更幼稚的实现相比,它可以返回更好的随机数rand()% range



 类似资料:
  • 问题内容: 我正在尝试在php中生成一个随机密码。 但是我得到所有的’a’s,返回类型是数组类型,我希望它是一个字符串。有关如何更正代码的任何想法? 谢谢。 问题答案: 安全警告 :不是加密安全的伪随机数生成器。寻找其他地方以在PHP中生成加密安全的伪随机字符串。 试试这个(使用代替,因为在字符串上总是):

  • 问题内容: 用例:“我忘记了密码”按钮。我们找不到用户的原始密码,因为它以散列形式存储,因此唯一要做的就是生成一个新的随机密码,然后通过电子邮件发送给他。这就要求使用密码无法预测的随机数,而mt_rand不够好,因此通常我们不能假定托管服务将提供对操作系统的访问权以安装密码随机数模块等。因此,我在寻找一种方法在PHP本身中生成安全的随机数。 到目前为止,我提出的解决方案包括存储初始种子,然后针对每

  • 问题内容: 所以我正在尝试bcrypt。我有一类(如下所示,该类来自http://www.firedartstudios.com/articles/read/php- security-how-to-safe-store-your- passwords ),其中包含3个功能。第一个是生成随机的Salt,第二个是使用第一个生成的Salt生成哈希,最后一个是通过将提供的密码与哈希密码进行比较来验证所提

  • 我被要求创建一个可证明的公平(确定性 我原以为srand()可以用来播种random_int(),但现在我不确定情况是否如此。CSPRNG甚至可以播种吗?如果可以播种,输出是否具有确定性(相同的随机结果,给定相同的种子)? 这是我的代码: 运行此代码时,每次运行时的绘图($draw_str)应该是相同的,但事实并非如此。 为了证明图纸是公平的,在选择并显示获胜号码之前,会选择一个种子(种子A)。还

  • 问题内容: 我正在用python创建一个项目,我想创建一个加密安全的随机数,我该怎么做?我已经在线阅读了常规随机生成器生成的数字不是密码安全的信息,并且该函数返回的是我的字符串,而不是数字。 问题答案: 您可以通过将函数应用于所返回的字节来获取随机数列表,如下所示 报价文件, 返回 适合加密使用* 的随机字节字符串。 * 该函数从特定于操作系统的随机性源返回随机字节。尽管返回的数据的确切质量取决于

  • 我的任务: 生成1到20之间的随机数,小数点后1位。 然而,我的问题就像mt_rand一样简单。我希望大多数生成的数字较低,大约0.5-4.5,偶尔的数字在4.5-10之间,很少说每12-20小时一次在10-20之间。 我一直在使用以下内容,但不知道从哪里开始。我是一个很基本的自学程序员。 也许如果我简单地解释一下为什么我想要这个,它可能会有帮助… 我拥有一个在线游戏,想要添加3个“银行”与每个银