【发布时间】:2015-08-11 16:01:39
【问题描述】:
tl:dr 版本:
- 第一个代码是否足够安全,可以在实际网站上使用?
- 如何实现 RandomLib?请为初学者提供清晰的说明。
感谢之前有人问过这个问题,但似乎没有关于如何使用推荐方法的明确答案和指导。
我需要在用户忘记密码的情况下创建随机重置代码。然后将此重置代码添加到通过电子邮件发送给他们的 URL。当他们点击 URL 时,重置代码和电子邮件将与数据库中的代码和电子邮件进行比较,如果匹配,则会提供重置表单。
我第一次尝试创建代码很简单,但它足够安全吗?破解有多容易?我将要求人们在网站上注册,因此我需要确保系统安全。
<php?
$bytes = openssl_random_pseudo-bytes(3);
$reset_code = bin2hex($bytes);
我在这个网站和其他网站上看到了很多关于 RandomLib https://github.com/ircmaxell/RandomLib 的建议,但我不知道如何使用它,而且我看到其他人在没有指导的情况下苦苦挣扎。我已下载 zip 并添加到我的网站文档中。我收到错误消息“致命错误:找不到类 'RandomLib\Factory'”,或者当我使用“require_once("RandomLib\factory.php");”链接到 factory.php 文件时我收到错误“致命错误:require_once(): 无法打开所需的 'RandomLibactory.php' (include_path='.;C:\php\pear')”
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
【问题讨论】:
-
看看这个问题:stackoverflow.com/questions/6585649/…。这是另一种非常安全的方法。
-
我写了一个小的php class 来帮助生成和处理这样的随机令牌。
bin2hex()函数会使你的令牌比需要的更长,base62 编码更紧凑。