我有一些关于密码哈希的问题。我发现hash_hmac是一个很好的函数来散列密码,但仍然存在一些问题。
来自另一个stackoverflow的问题有人回答:
return hash_hmac('sha512', $salt . $user['password'], $this->site_key);
我最初的问题是关于hmac如何使用密钥,在维基百科上似乎hmac函数会在对每条消息进行散列之前将密钥添加到密钥之前,密钥本身不会起到盐的作用吗?我可以放弃$ salt而只是使用用户特定的密钥吗? hash_hmac('sha512', $user['password'], $this->user_key)
最大的问题仍然是生成$ salt(或第一个问题的$ user_key)。如果我使用rand()生成它们,我不喜欢将使用过的salt存储在数据库中。那么什么是生成用户特定盐的好方法?
更新
如果我 将盐存储在数据库中,是否可以安全使用:
$user_key = $user['salt'] . $this->site_key;
return hash_hmac('sha512', $user['password'], $user_key);
答案 0 :(得分:2)
使用随机每用户salt并将其与哈希值一起存储在数据库中。结合它是您的配置文件中的每个站点的秘密。这样,攻击者在开始破解密码之前,需要访问数据库和配置文件。
为了安全地散列密码,我建议结合三种成分:
答案 1 :(得分:0)
使用bcrypt!
关于安全存储密码的经典文本:
http://codahale.com/how-to-safely-store-a-password/
引用文章:
盐不会帮助您
奖金!
使用bcrypt比使用自己的bs和可能不正确的腌制方案更简单。不要实施自己的密码系统或熵来源