PHP密码盐真的有必要吗?
这个问题我已经问了自己十几次了 密码真的有必要吗? 我找不到关于这个问题的好文献 从安全角度看,密码盐是否有帮助? 如果一个数据库被破坏了,如果密码被破坏了,盐不是就丢失了吗 另外,从刷力的角度来看,如果我禁止IP,真的有理由储存盐吗?是的,你应该一直使用盐。幸运的是,PHP非常聪明。发件人: 如果使用函数的默认选项,PHP将在散列时为每个密码生成随机salt。随机盐是一种额外的安全层,使得破解任何密码都异常困难。即使两个或多个用户使用相同的密码,他们的哈希值也会不同 这使您不必生成盐,而将繁重的工作留给PHP来完成。验证块使用散列中的随机盐,以便能够针对给定密码进行测试 从PHP密码盐真的有必要吗?,php,database,hash,passwords,salt,Php,Database,Hash,Passwords,Salt,这个问题我已经问了自己十几次了 密码真的有必要吗? 我找不到关于这个问题的好文献 从安全角度看,密码盐是否有帮助? 如果一个数据库被破坏了,如果密码被破坏了,盐不是就丢失了吗 另外,从刷力的角度来看,如果我禁止IP,真的有理由储存盐吗?是的,你应该一直使用盐。幸运的是,PHP非常聪明。发件人: 如果使用函数的默认选项,PHP将在散列时为每个密码生成随机salt。随机盐是一种额外的安全层,使得破解任何密码都异常困难。即使两个或多个用户使用相同的密码,他们的哈希值也会不同 这使您不必生成盐,而将繁重
密码验证()的文档中:
请注意,password\u hash()
返回算法、成本和盐,作为返回的hash的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许verify函数验证散列,而不需要单独存储salt或算法信息
它确实有助于对抗“彩虹表”,即已知密码的预编译哈希。当你对密码加盐时,它们是无用的,因为散列将不同。你确实需要加盐,因为未加盐的散列太容易破解(使用)
首先,非盐散列会导致更多冲突。如果有两个密码用作密码,破解一个就足以破解两个密码。如果两者都被腌制,那么其中一个变成棒球#sd7#$j
,另一个变成棒球&$h1
,那就行不通了
其次,像棒球
甚至*4kB$l这样的密码!如果不加盐的话,使用彩虹表将很容易逆转。这是因为很容易创建一个彩虹表,它覆盖了一定长度的所有密码。但是,如果盐腌制得当,*4kB$l!h
可能会变成*4kB$l!h_'H4Sj$8)@80-+2nm:W[oa}u#*4$lNamA{
或其他荒谬的长。为其生成彩虹表要困难得多
使用PHP,让您的生活更简单,使用更方便。无论您做什么,都不要使用自己的安全算法,尤其是在密码存储方面。您会被烧死的
要了解更多信息,请阅读您可能还想花一些时间了解的内容。我想指出使用SALT的真正目的。正如另一个答案中所解释的,不同的SALT会导致相同密码的不同哈希,但这不是主要目的
通过对每个密码使用不同的密码,您可以避免构建一个彩虹表来同时获取所有密码
正如您所写,salt并不是秘密。要获得单个密码,攻击者仍然可以使用此已知salt构建彩虹表。问题是他必须为第二个密码构建第二个彩虹表,因为它使用了不同的salt。换句话说,第一个彩虹表不能重复使用以查找其他密码
构建一个彩虹表只获取一个密码是没有意义的,在找到匹配的密码之前更容易使用暴力,计算彩虹表的其余部分是无用的,因为你不能重复使用它。这就是为什么我们说,独特的盐可以防止彩虹表攻击,因为使用暴力比使用彩虹表更快。lly不应该在密码哈希上使用您自己的SALT,您真的应该使用PHP来处理密码安全。如果您使用的PHP版本低于5.5,您可以使用password\u hash():仅当您希望能够根据存储的哈希值验证明文密码时。开始加密时,salt具有一定的随机性。没有salt,给定的密码将始终生成相同的哈希值。是的,它们有帮助。是的,即使数据库被破坏。是的,即使您禁止IP。是的,它们是必要的。如何password\u verify
检索密码\u hash
而不直接从密码中获取额外信息?更新answer@GjertIngarGjersund。如果你阅读了这篇文章,你会得到更好的图片。感谢你的回答:)简而言之:密码\u hash
生成的hash包含3个内容。用于生成散列、使用的salt和产生的散列。长回答短:使用这两个函数。不要使用自己的密码散列方法-你会做错事。你可以检索散列,但它们对你没有好处,因为它们不能反向工程。它们是单向散列,你的登录系统需要将密码与散列进行比较这是最好的答案。