首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >password_hash() / bcrypt

password_hash() / bcrypt
EN

Stack Overflow用户
提问于 2015-06-07 00:46:18
回答 2查看 1.1K关注 0票数 1

我在检查bcrypt哈希算法。

我使用password_hash()进行了第一次测试:

代码语言:javascript
复制
echo password_hash("123", PASSWORD_BCRYPT, array( "salt" => "1234567890123456789012" ));
echo password_hash("123", PASSWORD_BCRYPT, array( "salt" => "1234567890123456789012xxxxxxxxxxxxxxx" ));

两者都将返回'$2y$10$123456789012345678901uiaLpJxTpf6VbfI5NADlsRsfvEm6aq9C'.

  1. 为什么要把盐存储在哈希里面呢?这对我来说一点意义都没有。从数据库中获取哈希的攻击者如果不知道盐,就不能对它们做任何事情。
  2. 为什么我用两种不同的盐得到同样的哈希?盐中使用的前22个字符是否传递给了函数?

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-07 00:53:38

salt不是秘密,它通常与哈希一起存储在数据库中,还可以像password_hash一样直接存储在哈希中。

salt创建了惟一性,因此哈希不能轻易地用彩虹表或字典之类的东西破解,它除了使哈希更独特之外并没有真正增加安全性,因此对哈希运行字典或表不匹配,因为它还包括salt。

如果省略salt,password_hash()将为每个密码哈希生成一个随机的盐分。这是预定的操作模式,你不应该自己提供盐。

PHP7实际上会产生一个警告,告诉您使用salt选项是不可取的。

传递的盐分至少需要22个字符,但大多数底层算法,如bcrypt,不使用整个salt,有关更多信息,请参见这个答案

票数 3
EN

Stack Overflow用户

发布于 2015-06-07 00:56:18

盐不是你必须努力保守秘密的东西。即使在已知的情况下,它们的保护也是有效的。https://crackstation.net/hashing-security.htm

盐不一定是秘密的。仅仅通过随机化散列、查找表、反向查找表和彩虹表就会变得无效。攻击者不会事先知道盐是什么,所以他们无法预先计算查找表或彩虹表。如果每个用户的密码使用不同的salt进行散列,则反向查找表攻击也将无法工作。

由于您似乎使用的是固定的盐值,请注意以下事项:

一个常见的错误是在每个散列中使用相同的盐分。盐要么被硬编码到程序中,要么随机生成一次。这是无效的,因为如果两个用户有相同的密码,那么他们的哈希仍然是相同的。攻击者仍然可以使用反向查找表攻击同时对每个散列运行字典攻击。他们只需将盐分应用于每个密码猜测,然后再散列。如果盐是硬编码成一个流行的产品,查找表和彩虹表可以为该盐,使它更容易破解哈希产生的产品。

我建议使用没有可选参数的password_hash。默认函数构建为高度安全,通过指定您自己的算法和选项,您可能会削弱它的功能。

根据PHP文档

警告强烈建议您不要为该函数生成自己的salt。如果您不指定安全盐,它将自动为您创建一个安全盐。

编辑:,这就是为什么在bcrypt中保持盐的秘密是没有意义的。

每个这个职位有3,025,989,069,143,040个可能的组合,以一个8个字符的密码。您通常应该对bcrypt的工作因素进行调优,以便花费0.1秒来散列密码。这意味着计算所有可能性需要302,598,906,914,304秒。这是9588千禧年的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30688957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档