8

例如,对于河豚,它会返回如下内容:

$2a$12$DEzG.CRsHpxpTOAHooQ.wuR6Xe9h6PxFPhOcOvf.lqDNw1TVYVnEO

它包含有关散列算法类型的信息,并且包含盐。很多资源说只将这个值存储在数据库中,它将是安全的。但是,难道不能有人针对这些值测试一个常见的密码列表来破解其中的一些吗?

4

4 回答 4

10

密码散列的安全性并非来自于信息的机密性。您已经丢弃了实际的秘密,即作为哈希值基础的密码。剩余的哈希只是原始数据的一种指纹。安全性来自这样一个事实,即不可能从散列中导出原始数据。唯一的可能性是尝试所有可能的密码,看看哪个产生相同的哈希值。这里的安全性来自这样一个事实,即这在计算上非常昂贵并且不太可能在有用的时间内成功。

引入盐只是为了防止有人使用已经预先计算的一组已知散列密码,从而迫使攻击者使用唯一的盐实际重新散列所有可能的密码。盐本身不是秘密,散列算法也不是。

简而言之:是的,该值绝对可以安全地存储在数据库中。

于 2012-06-08T10:18:55.513 回答
5

生成的哈希crypt()是专门用于存储的。无论您的密码散列方案是什么,如果有人掌握了您的数据库内容,他们将能够暴力破解您的密码,并且您根本无法选择不存储密码散列。所应用的算法crypt()是专门选择的,因为它们需要大量时间来计算哈希;当您只测试一个密码时,这并不明显,但是暴力破解数千个密码变得不切实际地慢。

于 2012-06-08T10:08:43.870 回答
2

但是,难道不能有人针对这些值测试一个常见的密码列表来破解其中的一些吗?

无论密码如何存储,您始终可以这样做。crypt 函数并不能阻止这一点,但它会让它变得非常慢。如果用户使用一个真正常见的密码(如 123456),世界上没有散列算法可以保护他。

如果您不允许使用这些简单的密码并使用良好的散列算法(crypt() 提供),那么您已尽最大努力保护密码。

于 2012-06-08T10:15:56.237 回答
0

如果有人可以访问您的数据库,那么他们将可以通过任何方式访问 salt,因为您应该为每个用户密码使用不同的 salt(您很可能将其存储在数据库中)。

盐的重点是彩虹表不起作用。个人必须重新散列密码+盐的每个组合才能确定密码。您对每个密码使用不同的盐,因此他必须为每个密码重新生成数百万个哈希值。

可以在此处找到有关 crypt 的更多有用信息: 为什么 PHP crypt() 将盐添加到哈希中?

于 2012-06-08T10:26:55.630 回答