应该构建如何构建重置密码令牌的最佳实践?我在想:

随机17个字符[A-ZA-Z0-9] +全局唯一ID +随机17个字符[A-ZA-Z0-9]。

在重置密码令牌上有更好的解决方案,或行业标准吗?

有帮助吗?

解决方案

有一些重要的要点需要考虑。

  1. 代码应该是真正随机的(从mcrypt_dev_urandom读取),不应该从其他用户相关信息中解冻。
  2. 理想情况下,代码是base62编码(a-z a-z 0-9),以避免URL的问题。
  3. 商店数据库中的令牌的哈希 ,否则具有读取访问数据库的攻击者可以重置任何帐户。
  4. 这导致您在用户点击链接后必须在数据库中找到令牌的散列的问题。存储令牌有两种可能的方法:

    • 您将令牌与哈希算法(如sha512),没有盐。如果令牌非常强(具有0-9a-Z A-Z的最小长度20),则这是安全的。从理论上你必须检查在在数据库中输入之前是否存在这样的哈希,实际上可以忽略不计。我实现了一个密码重置类可以处理这样的令牌。
    • 你用bcrypt和盐哈肯。这允许缩短令牌,但您无法搜索数据库中的散列令牌。相反,您必须在链接中包含一个Row-ID以查找令牌。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top