PHP生成安全的随机重置代码($ bytes和RandomLib)

时间:2015-08-11 16:01:39

标签: php passwords reset

tl:dr version:

  • 第一个代码是否足够安全,可以在实际网站上使用?
  • 如何实现RandomLib?请为初学者提供明确的说明。

我很感激之前已经提出这个问题,但似乎没有关于如何使用推荐方法的明确答案和指导。

我需要创建用户忘记密码的随机重置代码。然后将此重置代码添加到通过电子邮件发送给他们的URL。当他们点击URL时,重置代码和电子邮件将与数据库中的代码和电子邮件进行比较,如果匹配,则会提供重置表单。

我创建代码的第一次尝试很简单,但它足够安全吗?破解有多容易?我将要求人们在网站上注册,因此我需要使系统安全。

<php?
$bytes = openssl_random_pseudo-bytes(3);
$reset_code = bin2hex($bytes);

我已经在本网站和其他人看到过很多关于RandomLib https://github.com/ircmaxell/RandomLib的建议,但我无法弄清楚如何使用这个,我看到其他人在没有指导的情况下挣扎。我已经下载了zip并添加到我的网站文档中。我收到一条错误消息&#34;致命错误:Class&#39; RandomLib \ Factory&#39;找不到&#34;或者当我用&#34; require_once(&#34; RandomLib \ factory.php&#34;);&#34;链接到factory.php文件时我收到错误&#34;致命错误:require_once():无法打开所需的&#39; RandomLibactory.php&#39; (包含路径=&#39; C:\ PHP中\梨&#39;)&#34;

require_once("RandomLib\factory.php");
$factory = new RandomLib\Factory;
$generator = $factory->getMediumStrengthGenerator(8, alphabet);

简而言之,如果RandomLib是最好的选择,那么如果有人可以为类似于我自己的位置的初学者提供如何使用它的指导将会很有帮助。或者如果第一个选项足够安全,我会保持原样。

更新:

正如下面的Narf所指出的,创建随机字符串的功能缺少第二个参数,它确保生成的字符串是安全的。

openssl_random_pseudo-bytes(3);

应该是:

openssl_random_pseudo-bytes( 3 , $cstrong );

第二个参数$ cstrong返回一个布尔值,如果是安全的则为true,否则为false。 http://php.net/manual/en/function.openssl-random-pseudo-bytes.php

1 个答案:

答案 0 :(得分:2)

首先,术语&#34; hack&#34;有点不合适。我知道这听起来很挑剔,但这对于理解这个问题非常重要。当您生成伪随机字符串时,您需要它们不可预测 - 这是&#34; secure&#34;之间的区别。随机字符串和一个看似随机的字符串(即时间戳的哈希值不可预测)。

话虽如此,您已经开始非常好了 - openssl_random_pseudo_bytes()是适合您目标的工具。 ,视环境而定,可能还不够(这就是为什么你没有找到明确的答案)。

问题是多方面的......

  • 该函数有第二个参数,允许您检查其输出是否真的&#34;安全&#34;,并且您没有检查它。
  • 由于OpenSSL实施细节,大多数安全专家认为其他可能的随机性来源(即mcrypt_create_iv()或直接从/ dev / urandom读取,但后者很棘手)。
  • 因为它取决于环境(操作系统级资源),所以不能保证它在生产服务器上的安全性与在开发机器上的安全它&#如果你将应用程序移到另一台主机上,很容易忘记检查。

RandomLib的存在主要是由于上面列出的原因 - 它将为您的环境选择最合适的随机源,执行所有必要的检查并在没有&#34; secure&#34;随机源可用。 RandomLib的问题是......我无法帮助你,抱歉。我自己还没有使用它,但无论如何 - 您发布的错误消息都清楚地表明您只是将错误的文件路径传递给require()。如果您将其作为单独的问题发布 - 它将被关闭,因为它被认为是StackOverflow上的偏离主题;你只需要自己搞定那个。

然而,PHP7(截至本文发布之时尚未发布)现在具有random_bytes()功能,它为您提取所有这些问题那个项目提供该功能的用户空间反向端口。它仍然是测试版(再次,当我写这篇文章时),但你应该非常地遵循它并在1.0版本发布后使用它。这里:https://github.com/paragonie/random_compat