2011-07-12 19 views
0

大家好我有一个问题,如果这是好的做法或不。我知道,简单的双哈希值可能会因各种原因而变差。在已经散列的值上使用HMAC,是好还是坏的做法?

我想要做的就是像这样,在PHP中。

$val = hash_hmac('sha256', md5($password), $salt); 

原因是我们正在通过封闭的API验证可信赖的合作伙伴。密码在我们的数据库中存储为MD5哈希。但是,我不希望我们的合作伙伴通过网络发送相同的价值。

通过这种方式,我可以将我们数据库中的md5'd密码与我们合作伙伴发送的唯一哈希进行比较。

你说什么?

回答

0

首先,这是用户密码(即,您是否代表用户进行身份验证),还是您的两台服务器之间的共享密码?

如果是用户密码,请停止。您将密码保存为纯文本(或作为未加密的md5)。无论哪种方式都不好。将密码保存为salted hash,然后使用OAuth或其他方法进行身份验证。

如果是两台服务器(不表示用户),你仍然可以使用OAuth或东西,但如果你只是想简单的东西,你应该像这样认证之间共享的秘密:

$val = hash_hmac('sha256', $nonce, $secret); 

$nonce是一个由服务器随机选择的一次性值,以防止重放攻击。

请记住,如果您没有随机数,那么您发送的任何值都是您的共享密钥。如果你从md5的hmac或其他任何东西导出它并不重要;如果它每次都相同,则相当于通过通信通道发送的密码。并且记得要保护MITM的通信频道!

+0

感谢您的意见。这是代表用户。为了说明我们不是以纯文本的形式将密码存储在数据库中,它们被存储为未加密的MD5。不是为了免除自己,但是当我到达这里时就是这样。合作伙伴已经使用nonce,http摘要确切地向他们的API验证了他们的凭据。次级身份验证代表最终用户。 – HarryYee

+0

那么,它仍然是一个共享的秘密,所以你应该使用一个随机数的hmac,就像我的例子一样......但是切换到oauth之类的东西,当你有机会时重新输入你的密码:) – bdonlan

相关问题