在已经散列的值上使用HMAC,好的还是坏的做法?

时间:2011-07-12 22:21:33

标签: md5 hash hmac sha

大家好,我有一个问题,如果这是好的做法。我知道,由于各种原因,简单地对一个值进行双重散列可能会很糟糕。

我想做的事情就是这样,在php中。

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

这样做的原因是我们通过封闭的api与受信任的合作伙伴进行身份验证。密码作为MD5哈希存储在我们的数据库中。但是,我不希望我们的合作伙伴通过网络发送相同的值。

这样我可以将数据库中的md5密码与我们的合作伙伴发送的唯一哈希进行比较。

你说什么?

1 个答案:

答案 0 :(得分:0)

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

如果是用户密码,请停止。您将以明文(或未加密的md5)保存密码。无论哪种方式都很糟糕。将密码保存为salted哈希并使用OAuth或其他东西进行身份验证。

如果它是两个服务器(不代表用户)之间的共享密钥,您仍然可以使用oauth或其他东西,但如果您只想要简单的东西,则应该像这样进行身份验证:

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

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

请记住,如果您没有nonce,那么您通过发送的任何值都是您的共享密钥。如果你从md5或其他什么的hmac中得到它并不重要;如果每次最终都相同,则相当于通过通信信道发送的密码。并记住要保护MITM的通信渠道!