Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP密码盐真的有必要吗?_Php_Database_Hash_Passwords_Salt - Fatal编程技术网

PHP密码盐真的有必要吗?

PHP密码盐真的有必要吗?,php,database,hash,passwords,salt,Php,Database,Hash,Passwords,Salt,这个问题我已经问了自己十几次了 密码真的有必要吗? 我找不到关于这个问题的好文献 从安全角度看,密码盐是否有帮助? 如果一个数据库被破坏了,如果密码被破坏了,盐不是就丢失了吗 另外,从刷力的角度来看,如果我禁止IP,真的有理由储存盐吗?是的,你应该一直使用盐。幸运的是,PHP非常聪明。发件人: 如果使用函数的默认选项,PHP将在散列时为每个密码生成随机salt。随机盐是一种额外的安全层,使得破解任何密码都异常困难。即使两个或多个用户使用相同的密码,他们的哈希值也会不同 这使您不必生成盐,而将繁重

这个问题我已经问了自己十几次了

密码真的有必要吗?

我找不到关于这个问题的好文献

从安全角度看,密码盐是否有帮助? 如果一个数据库被破坏了,如果密码被破坏了,盐不是就丢失了吗

另外,从刷力的角度来看,如果我禁止IP,真的有理由储存盐吗?

是的,你应该一直使用盐。幸运的是,PHP非常聪明。发件人:

如果使用函数的默认选项,PHP将在散列时为每个密码生成随机salt。随机盐是一种额外的安全层,使得破解任何密码都异常困难。即使两个或多个用户使用相同的密码,他们的哈希值也会不同

这使您不必生成盐,而将繁重的工作留给PHP来完成。验证块使用散列中的随机盐,以便能够针对给定密码进行测试

密码验证()的文档中:

请注意,
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和产生的散列。长回答短:使用这两个函数。不要使用自己的密码散列方法-你会做错事。你可以检索散列,但它们对你没有好处,因为它们不能反向工程。它们是单向散列,你的登录系统需要将密码与散列进行比较这是最好的答案。