Passwords 生成重置密码令牌的最佳实践

Passwords 生成重置密码令牌的最佳实践,passwords,guid,reset-password,Passwords,Guid,Reset Password,关于如何构造重置密码令牌的最佳实践?我在想: 随机17个字符[a-zA-Z0-9]+全局唯一id+随机17个字符[a-zA-Z0-9] 有一个更好的解决方案,还是一个重置密码令牌的行业标准? < P>有一些重要的要点要考虑。 代码应该是随机的(从MCRYPT_DEV_uradom读取),不应该从其他用户相关信息中删除 理想情况下,代码是base62编码的(A-Z A-Z 0-9),以避免Url出现问题 ,否则,具有数据库读取权限的攻击者可以重置任何帐户 这导致了一个问题,即在用户单击链接后,必须

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

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


有一个更好的解决方案,还是一个重置密码令牌的行业标准?

< P>有一些重要的要点要考虑。
  • 代码应该是随机的(从MCRYPT_DEV_uradom读取),不应该从其他用户相关信息中删除
  • 理想情况下,代码是base62编码的(A-Z A-Z 0-9),以避免Url出现问题
  • ,否则,具有数据库读取权限的攻击者可以重置任何帐户
  • 这导致了一个问题,即在用户单击链接后,必须在数据库中查找令牌的哈希。存储令牌有两种可能的方法:

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

    谢谢你的课()太棒了。特别是,
    generateRandomBase62String()
    hashTokenWithBcrypt()
    。太好了。关于第三次,我总是做同样的事情,出于同样的原因。不过,进一步思考一下,能够访问数据库的攻击者难道不能简单地散列一个已知的纯文本,将该散列存储在数据库中,然后在密码重置URL中使用他选择的纯文本吗?我想攻击者需要访问数据库,以及了解使用了哪种哈希算法,但搜索空间似乎要小得多。@DustinRasener-获得对数据库的写访问权限比只进行读访问要困难得多。您可以通过SQL注入、废弃备份和废弃服务器获得读访问权限。。。另一方面,如果攻击者具有写入数据库的权限,则不需要重置密码,只需直接覆盖密码哈希即可。有关的详细信息。还请注意,您的重置令牌应该过期。我猜第二个选项在技术上会更好地抵御在线暴力攻击,因为每次尝试都必须不只是与众多用户中的任何一个匹配,而是与单个特定用户匹配。尽管现实可行,但适当的锁定逻辑应该使这方面的任何好处从一开始就可以忽略不计。