生成用户唯一的hmac密钥以进行密码散列

时间:2011-07-16 11:41:43

标签: php security hash passwords

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

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的加密强度取决于底层散列函数的加密强度,散列输出长度的大小(以位为单位)以及加密密钥的大小和质量。

如果之前有哈希密码并且想知道它是否足够好,我还没有看到这种方式?

额外:我没有使用盐,因为我认为 hmac将提供的密钥附加到数据(如盐),这是对的吗?

1 个答案:

答案 0 :(得分:3)

好的,首先是。不要编写自己的函数来进行密码散列。我并不怀疑你的技能,但为了安全起见,不要做自己的哈希系统。而HMAC你的钥匙还可以,但我仍然没有使用它。

最后,我建议您为用户密码执行此操作。

<?PHP

$password=$user['password'];
$username=$user['username'];

$salt='usesomesillystringforsalt';
$hashed_password=crypt($password.$username,'$2a$04$usesomesillstringforsalt$');

?>

这个算法使用基于Blowfish的Bcrypt,它是一个非常强大的算法,是Gawker媒体在被黑客攻击后进行的,因为密码散列的鲁棒性和实用性。 crypt PHP Manual

接下来,请记住将标有usesomesillystringforsalt的部分更改为其他内容。它需要是base64 salt A-Z,a-z,0-9,/和“。”的22位数字。

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

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

如上所述,如果您有任何其他问题,请随时提出。