2012-06-08 50 views
6

例如与河豚返回类似:在数据库中存储PHP crypt()结果是否安全?

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

包含有关散列ALG的类型信息以及它所包含的盐。很多资源说只是将这个值存储在数据库中,它将是安全的。但是,有人不能仅仅通过测试这些值的通用密码列表来破解其中的一些吗?

+0

是不是你的数据库安全吗? – CompanyDroneFromSector7G

回答

7

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

的盐只介绍,以防止有人利用已经预先计算组已知的散列密码,迫使攻击者实际上老调重弹的所有可能的密码与独特的盐。盐本身并不是秘密,哈希算法也不是。

简而言之:是的,这个值是绝对安全的数据库来存储。

4

通过crypt()产生的散列是具体所意指被存储。不管你的密码哈希方案是什么,如果有人拿到你的数据库内容,他们将能够暴力破解你的密码,并且你根本没有选择不存储密码哈希。由crypt()应用的算法被特别选择,因为它们花费大量时间来计算散列值;当你只测试一个密码时,这并不明显,但是强制数千个密码变得不切实际地慢。

1

但有人不能只是测试一个通用的密码列表对 这些值来破解其中的一些?

你总是可以做不管密码是如何存储。 crypt函数并不妨碍这一点,但它会使它真的很慢。如果用户使用真正常见的密码(如123456),那么世界上不会有散列算法保护他。

如果不允许这些简单的密码,并使用一个很好的散列算法(即隐窝()电源)你做你最好的保护密码。

0

如果有人访问你的数据库那么他们将有机会获得的盐无论哪种方式,因为你应该使用不同的盐,每一个用户密码(你最有可能会在数据库中一起存储)。

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

上隐窝一些更良好的信息可以在这里找到: Why does PHP crypt() prepend the salt to the hash?

相关问题