我该如何存储密码盐?

时间:2012-03-27 21:16:02

标签: php security passwords salt

使用PHP,我使用shama6算法使用hmac函数编码密码。我不确定的是如何正确储存盐。

哈希密码的全部意义在于黑客可以访问数据库。如果我将数据库中的salt存储在与散列密码相同的行中,是不是就像我将黑客交给“密码”一样?我正拿着一把带锁的门,把入侵者递给钥匙。

有人可以向我解释他们如何储存盐吗?

3 个答案:

答案 0 :(得分:16)

将盐放入窃取数据库的攻击者的手中实际上并不是问题。将salt和原始密码组合到密码哈希中可以防止攻击者使用数百万已知和众所周知的密码哈希的“彩虹表”来获取某些被盗用户ID的密码。< / p> 将密码和盐混合在一起使得甚至单个密码破解的难度也要高出许多数量级,因为盐会使彩虹表中已知的密码哈希失效。因此,即使攻击者知道每个用户的盐,这意味着为了破解任何单个用户,攻击者必须仅为该用户计算一个全新的彩虹表,其中将用户的盐与其他用户组合在一起他们开始使用彩虹表中已知的密码。

密码密码不会使不可能破解密码,但要困难得多。例如,攻击者可以使用哈希和盐来定位您的一小部分用户,这是鼓励不太可能出现在彩虹表中的强密码的另一个原因。

答案 1 :(得分:3)

我会选择存储salt以及散列算法的标识符和散列本身。

原因如下:

通常,对数据库的访问仅限于localhost或某些预定义的IP地址范围。这意味着,对于黑客获取对数据库的访问权限,他/她将需要危害您的服务器文件系统(通过获取直接访问权限或注入脚本)。或者执行SQL注入。

在前一种情况下,如果有人在DB中访问了您的salt,他/她就可以从您的PHP文件源中轻松读取它们。

使用PDOMySQLi的预准备语句可以简单地防止后一种原因。您不应再使用旧的mysql_*函数作为API。它们不再维护,并且已经弃用has begun

即使有人将您的手放在您的数据库上,也不是那么有问题。如果您使用crypt()函数来创建具有良好算法的哈希值(建议使用CRYPT_BLOWFISH),那么即使单个密码破解也可能非常长(以年为单位)。到那时,您可以轻松地向用户发送“更改密码”通知,并锁定所有尚未这样做的人。

如果您使用的是PHP 5.5+,则应使用新密码API:http://php.net/password

答案 2 :(得分:2)

盐旨在明确并立即可用。密码哈希是完全不可逆的,但它是字典可攻击的。因此,盐足以增加几个数量级来扰乱字典攻击。使salt可用不应该降低散列密码的安全性。