密码哈希安全性

时间:2011-07-16 10:03:13

标签: php security

我有一些关于密码哈希的问题。我发现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);

2 个答案:

答案 0 :(得分:2)

使用随机每用户salt并将其与哈希值一起存储在数据库中。结合它是您的配置文件中的每个站点的秘密。这样,攻击者在开始破解密码之前,需要访问数据库和配置文件。

为了安全地散列密码,我建议结合三种成分:

  1. Key-Derivation-Function。它类似于普通哈希,但它很慢而且需要盐。 bcrypt和PBKDF2是常见的选择。
  2. 每用户盐随机。这样做的主要目的是每个用户都有所不同。您将它与哈希一起存储在数据库中。如果攻击者得到它就没问题。
  3. 每个网站的秘密。这样做的目的是访问数据库不足以破解密码。攻击者也需要访问配置文件。即使他了解到每个站点的秘密,该计划仍然像你根本没有使用秘密一样安全。

答案 1 :(得分:0)

使用bcrypt!

关于安全存储密码的经典文本:

http://codahale.com/how-to-safely-store-a-password/

引用文章:

  

盐不会帮助您

奖金!

使用bcrypt比使用自己的bs和可能不正确的腌制方案更简单。

不要实施自己的密码系统或熵来源