【发布时间】:2011-07-16 10:03:13
【问题描述】:
我有几个关于密码哈希的问题。我发现 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() 生成使用过的盐,我不喜欢将它们存储在数据库中。那么生成用户特定盐的好方法是什么?
更新
如果我将将盐存储在数据库中,是否可以安全使用:
$user_key = $user['salt'] . $this->site_key;
return hash_hmac('sha512', $user['password'], $user_key);
【问题讨论】:
-
为什么要使用
hash_hmac()而不是md5()来散列密码? -
@CodeInChaos: 有多少加盐密码和
md5()加密的密码因为生成速度快而被破解?我想看一篇文章。 -
许多低复杂度的密码。以最近的 MtGox dbleak 为例。他们使用了未加盐(旧)和加盐(新)密码哈希的组合。但即使是一些加盐密码也被破解了,因为简单的密码可以被暴力破解。拥有大量计算能力的攻击者(例如僵尸网络)每秒可以计算数十亿个 md5 哈希值。
-
@CodeInChaos:是的,简单的密码可以被暴力破解,但是加盐的密码甚至不是简单的。
-
一旦保存密码哈希的服务器受到攻击,盐也会受到攻击。这是重要的攻击场景之一。