我应该在HMAC中使用密码哈希作为密钥吗?

时间:2016-03-14 13:18:54

标签: php security hash passwords

我正在尝试构建密码重置/忘记密码链接。该链接将通过电子邮件发送给用户。到目前为止,我采用了这种方法:

  1. 使用bin2hex(openssl_random_pseudo_bytes(16));

  2. 生成令牌
  3. 将此令牌的哈希存储在数据库表中

  4. 存储到期时间。

  5. 网址为/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是否是真实的。这似乎是一种安全的方法,尽管使用电子邮件发送链接吗?

2 个答案:

答案 0 :(得分:3)

不,你不应该这样做。

HMAC密钥与加密密钥相同,这意味着它必须完全随机且不可预测。密码哈希不具备该属性,也可能长度不足。

更糟糕的是,如果你这样做了,你就会为你的用户暴露第二个(也可能更容易被利用)的攻击向量'密码 - 攻击者可以通过暴力破解用户的密码哈希,允许他们稍后对密码本身执行相同的本地攻击。

最后,即使这些缺陷并不存在,你也不会真正为这个想法添加任何有意义的保护措施。你只是过度设计它。

答案 1 :(得分:1)

我不建议,其他人可能不同意,但是,我会认为这是违反安全规定的;哈希不是100%安全,因此可能会不必要地泄露用户密码将是危险的。这将是一个更安全的替代方案(并且真的没那么多工作)分别设置一个临时令牌并将其存储到您的数据库中,并具有到期时间