我正在尝试构建密码重置/忘记密码链接。该链接将通过电子邮件发送给用户。到目前为止,我采用了这种方法:
使用bin2hex(openssl_random_pseudo_bytes(16));
将此令牌的哈希存储在数据库表中
存储到期时间。
网址为/reset-password/{$email address}/{$token}
我想在网址上添加HMAC。如果我这样做,我可以安全地使用该用户的密码哈希(编辑: - 使用PHP5.5中的password_hash()
创建的哈希)作为密钥吗? e.g。
$hmac = hash_hmac('sha256', $url_without_hmac, $password_hash);
所以新网址为/reset-password/{$email_address}/{$token}/{$hmac}
并且hmac将使我们能够在没有全局存储的密钥的情况下验证该URL是否是真实的。这似乎是一种安全的方法,尽管使用电子邮件发送链接吗?
答案 0 :(得分:3)
不,你不应该这样做。
HMAC密钥与加密密钥相同,这意味着它必须完全随机且不可预测。密码哈希不具备该属性,也可能长度不足。
更糟糕的是,如果你这样做了,你就会为你的用户暴露第二个(也可能更容易被利用)的攻击向量'密码 - 攻击者可以通过暴力破解用户的密码哈希,允许他们稍后对密码本身执行相同的本地攻击。
最后,即使这些缺陷并不存在,你也不会真正为这个想法添加任何有意义的保护措施。你只是过度设计它。
答案 1 :(得分:1)
我不建议,其他人可能不同意,但是,我会认为这是违反安全规定的;哈希不是100%安全,因此可能会不必要地泄露用户密码将是危险的。这将是一个更安全的替代方案(并且真的没那么多工作)分别设置一个临时令牌并将其存储到您的数据库中,并具有到期时间