这两行PHP代码有何不同?

3
假设我们有一个在数据库中存储的盐,生成方式如下:

$salt = time();

这两行代码有什么区别?
$pass1 = hash('sha1', $password . $salt);

$pass2 = hash_hmac('sha1', $password, $salt);

他们输出的结果不同。第一个函数hash需要2个参数,而hash_hmac需要3个参数。因此,你可能认为我们可以通过单独使用$salt(来满足第三个参数),而不是像第2行那样将其与密码拼接在一起($password . $salt)来获得第三个额外的参数。但事实并不简单,这两个结果是不同的。为什么?到底发生了什么?
1个回答

15
因为HMAC SHA-1与将消息和密钥串联的SHA-1不同。 HMAC更像sha1($salt.sha1($salt.$password)),但不完全相同。维基百科对HMAC有一个很好的描述。

我明白了。那么,在使用HMAC时,您是否仍然需要担心为要存储在数据库中的每个记录生成单独的随机盐?还是只需为HMAC提供一个标准字符串,例如hash_hmac('sha1', $pass, "standard");,而不需要任何随机盐呢? - Chris
8
无论如何都需要随机盐来防止彩虹表攻击。 - Etan
1
谢谢Lukas和Etan。现在弄清楚了。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接