繁体   English   中英

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

[英]Should I use password hash as secret key in HMAC?

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

  1. 使用bin2hex(openssl_random_pseudo_bytes(16));生成令牌bin2hex(openssl_random_pseudo_bytes(16));

  2. 将此令牌的哈希存储在db表中

  3. 存储它的到期时间。

网址为/reset-password/{$email address}/{$token}

我想在网址中添加一个HMAC。 如果这样做,我可以安全地使用该用户的密码哈希( 编辑:-在PHP5.5中使用password_hash()创建的哈希 )作为秘密密钥吗? 例如

$hmac = hash_hmac('sha256', $url_without_hmac, $password_hash);

因此新的网址为/reset-password/{$email_address}/{$token}/{$hmac}

而hmac将使我们能够在没有全局存储的密钥的情况下验证url是真实的。 尽管使用电子邮件发送链接,这似乎是一种安全的方法吗?

不,您不应该这样做。

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

更糟糕的是,如果这样做,您将暴露出第二个(可能更容易利用)用户密码的攻击媒介-攻击者将能够通过蛮力来确定用户的密码哈希 ,从而允许他们稍后对密码本身在本地执行相同的攻击。

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

我不建议这样做,其他人可能会不同意,但是,我认为这违反了安全性。 哈希不是100%安全的,因此潜在地不必要地泄露用户密码将很危险。 分别设置一个临时令牌并将其存储到您的数据库中将是一种更为安全的选择(实际上工作量并不大)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM