26

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

随机 17 个字符 [a-zA-Z0-9] + 全局唯一 id + 随机 17 个字符 [a-zA-Z0-9]。

是否有更好的解决方案或重置密码令牌的行业标准?

4

1 回答 1

48

有一些要点需要考虑。

  1. 代码应该是真正随机的(从 MCRYPT_DEV_URANDOM 读取),并且不应该从其他用户相关信息派生。
  2. 理想情况下,代码采用 base62 编码(AZ az 0-9)以避免 URL 出现问题。
  3. 在数据库中仅存储令牌的哈希值,否则具有数据库读取权限的攻击者可以重置任何帐户。

这导致在用户单击链接后,您必须在数据库中找到令牌的哈希值。有两种可能的方式来存储令牌:

  • 您可以使用不带盐的 SHA512 之类的哈希算法对令牌进行哈希处理。如果令牌非常强(最小长度为 20,AZ 为 0-9),这是安全的。从理论上讲,您必须在将此类哈希输入数据库之前检查它是否已经存在,实际上这可以忽略不计。我实现了一个可以处理此类令牌的密码重置类。
  • 您使用 BCrypt 和 salt 对令牌进行哈希处理。这允许更短的令牌,但您无法在数据库中搜索散列令牌。相反,您必须在链接中包含 row-id 才能找到令牌。
于 2013-11-16T13:56:51.860 回答