目前我有以下设置来处理忘记密码的用户。
- 用户输入他/她的电子邮件地址并按下忘记密码按钮。
我查找属于该电子邮件地址的用户,并在数据库中存储了一个新的“忘记密码请求”。忘记密码请求项如下所示:
Guid ForgotPasswordRequestId; Guid UserId; DateTime ValidUntil;我通过将 ForgotPasswordRequest Guid 转换为 Base64 字符串来生成一个令牌来识别忘记密码的请求。Guid 是第 4 版 Guid(随机的,不是基于时间或 MAC 地址的)。检查此MSDN 链接以获取有关实施的说明。
我创建了一个链接
www.example.com/account/ForgotPassword?token=TOKEN,通过电子邮件发送给用户。每当有人在 24 小时内访问该链接时,他/她都可以为该帐户设置新密码。
我认为有人猜测令牌的机会很小,因为 Guid 是 122 位数字(128 位,版本信息减去 6 位)。(2^122 / 2)因此,黑客平均需要在 24 小时内尝试令牌才能成功。如果我的数学是正确的,那就是3 * 10^31每秒令牌,我确定我的服务器无法处理;)。此外,他们需要猜测的令牌与他们希望为其重置密码的用户没有任何关系。
但是,直接从生成的 Guid 生成令牌是否正确?无论如何,使用 Guid 而不是安全的随机数生成器使攻击可行吗?该方案中是否还有其他问题使其不安全?
我已经看到了这个问题,尽管它与它相关,但它并没有解释生成令牌的最佳实践。