一尘不染

生成随机令牌以忘记密码的最佳实践

php

我想生成忘记密码的标识符。我读到我可以通过在mt_rand()中使用时间戳来做到这一点,但有人说时间戳记可能并非每次都是唯一的。所以我有点困惑。我可以在此使用时间戳吗?

问题
生成自定义长度的随机/唯一令牌的最佳实践是什么?

我知道这里有很多问题,但是在听取了不同人的不同意见后,我变得更加困惑。


阅读 302

收藏
2020-05-26

共1个答案

一尘不染

在PHP中,使用random_bytes()。原因:您正在寻找一种获取密码提醒令牌的方法,并且,如果它是一次性登录凭据,则实际上您有一个数据需要保护(即-整个用户帐户)

因此,代码将如下所示:

//$length = 78 etc
$token = bin2hex(random_bytes($length));

更新此答案的 _先前版本
所指,uniqid()如果存在安全问题,而不仅仅是唯一性,那是不正确的。uniqid()本质上只是microtime()一些编码。有一些简单的方法可以microtime()对您的服务器进行准确的预测。攻击者可以发出密码重置请求,然后尝试几个可能的令牌。如果使用more_entropy,这也是可能的,因为附加熵同样很弱。

2020-05-26