我想为忘记密码生成标识符。我读到我可以通过使用 mt_rand() 的时间戳来做到这一点,但有些人说时间戳可能不是每次都是唯一的。所以我在这里有点困惑。我可以使用时间戳来做到这一点吗?
问题
生成自定义长度的随机/唯一 token 的最佳实践是什么?
我知道这里有很多问题,但在阅读了不同人的不同意见后,我变得更加困惑。
最佳答案
在 PHP 中,使用 random_bytes()
。原因:您正在寻找获取密码提醒 token 的方法,并且,如果它是一次性登录凭据,那么您实际上有一个数据需要保护(即 - 整个用户帐户)
因此,代码如下:
//$length = 78 etc
$token = bin2hex(random_bytes($length));
<小时/>
更新: previous versions这个答案指的是 uniqid()
,如果存在安全问题而不仅仅是唯一性问题,那么这是不正确的。 uniqid()
本质上只是带有一些编码的 microtime()
。有一些简单的方法可以准确预测服务器上的 microtime()
。攻击者可以发出密码重置请求,然后尝试使用几个可能的 token 。如果使用 more_entropy,这也是可能的,因为附加熵同样很弱。感谢@NikiC和 @ScottArciszewski感谢指出这一点。
更多详情请参见
关于php - 为忘记密码生成随机 token 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38015123/