正在生成用于密码哈希的用户唯一hmac密钥


Generating user unique hmac keys for password hashing

对于我网站的密码哈希,我编写了以下函数:

public function hash($user) {
    $user_key = hash_hmac('sha512', $user['id'].$user['email'], $this->site_key);
    $password = hash_hmac('sha512', $user['password'], $user_key);
}

我生成用户唯一密钥,用于最终的密码哈希。因为这个密钥是用sha512散列的,所以根据我在维基百科上读到的内容,它应该提供足够的安全性:

HMAC的加密强度取决于底层散列函数的加密强度、其以比特为单位的散列输出长度的大小以及加密密钥的大小和质量。

我以前从未见过这种散列密码的方式,我想知道它是否足够好?

额外:我没有使用salt,因为我认为hmac会将提供的密钥附加到数据中(就像salt一样(,这是对的吗?

好的,首先也是最重要的。不要编写自己的函数来进行密码哈希。我并不怀疑你的技术,但为了安全起见,不要使用自己的哈希系统。和HMAC你的钥匙是可以的,但我仍然不会使用它。

最后,我建议你为你的用户密码这样做。

<?PHP
$password=$user['password'];
$username=$user['username'];
 
$salt='usesomesillystringforsalt';
$hashed_password=crypt($password.$username,'$2a$04$usesomesillstringforsalt$');
?>

该算法使用基于Blowfish的Bcrypt,这是一种非常稳健的算法,也是Gawker媒体在被黑客入侵后所采用的算法,因为它对密码哈希具有稳健性和实用性。cryptPHP手册

下一步,记得把写usesomesillystringforsalt的部分改成其他内容。它需要是以A-Z、A-Z、0-9和"为基数的22位数字">

请访问该链接以了解有关算法本身的更多信息。我建议你只使用这个实现,因为它比你建议的要强大得多。

如果你想更进一步,我建议你为每个用户使用一种独特的盐。如果你想这样做,我可以写一个函数的例子,告诉你如何做到这一点。

如前所述,如果您还有任何问题,请随时提出。