为忘记密码生成随机令牌的最佳做法

2022-08-30 07:38:14

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

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

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


答案 1

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

因此,代码将如下所示:

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

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

有关更多详细信息,请参阅


答案 2

这回答了“最佳随机”请求:

来自Security.StackExchange的Adi的答案1对此有一个解决方案:

确保你有OpenSSL支持,你永远不会出错这个单行

$token = bin2hex(openssl_random_pseudo_bytes(16));

1. Adi,2018 年 11 月 12 日星期一,Celeritas,“为确认电子邮件生成不可猜测的令牌”,2013 年 9 月 20 日 7:06,https://security.stackexchange.com/a/40314/


推荐