生成重置密码令牌的最佳做法

时间:2013-11-16 01:51:29

标签: passwords guid reset-password

有关如何构建重置密码令牌的最佳做法?我在想:

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

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

1 个答案:

答案 0 :(得分:34)

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

  1. 代码应该是随机的(从MCRYPT_DEV_URANDOM读取),不应该从其他用户相关信息中获取。
  2. 理想情况下,代码是base62编码的(A-Z a-z 0-9),以避免Url出现问题。
  3. Store only a hash of the token in the database,否则对数据库具有读取权限的攻击者可以重置任何帐户。
  4. 这会导致在用户单击链接后必须在数据库中找到令牌的哈希值的问题。存储令牌有两种可能的方法:

    • 使用SHA512之类的哈希算法对令牌进行哈希处理,而不使用盐。如果令牌非常强大(最小长度为20,0-9 a-z A-Z),这是安全的。从理论上讲,在将数据输入数据库之前,必须检查这种哈希是否已经存在,实际上这可以忽略不计。我实现了一个可以处理此类令牌的password-reset class
    • 用BCrypt和salt哈希令牌。这允许更短的令牌,但您无法在数据库中搜索散列令牌。相反,您必须在链接中包含row-id才能找到令牌。