繁体   English   中英

PHP password_hash()/ bcrypt

[英]PHP password_hash() / bcrypt

我正在检查bcrypt哈希算法。

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

echo password_hash("123", PASSWORD_BCRYPT, array( "salt" => "1234567890123456789012" ));
echo password_hash("123", PASSWORD_BCRYPT, array( "salt" => "1234567890123456789012xxxxxxxxxxxxxxx" ));

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

  1. 盐为什么存储在哈希表中? 这对我完全没有意义。 如果攻击者不知道哈希值,那么从数据库中获取哈希值就无法对其进行任何处理。
  2. 为什么我用两种不同的盐得到相同的哈希值? 仅将用于盐的前22个字符传递给函数吗?

非常感谢你!

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

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

如果省略盐, password_hash()将为每个散列的password_hash()生成随机盐。 这是预期的操作模式,不应提供自己的盐。
PHP7实际上会产生警告,告诉您不建议使用salt选项。

传递的salt必须至少为22个字符,但是大多数基础算法(例如bcrypt)不会使用整个salt,有关更多信息,请参见此答案

盐不是您必须努力保持机密的东西。 即使已知,它们的保护也是有效的。 https://crackstation.net/hashing-security.htm

盐不必是秘密的。 仅通过将散列随机化,查找表,反向查找表和Rainbow表就失效了。 攻击者不会预先知道盐的含量,因此他们无法预先计算查找表或彩虹表。 如果每个用户的密码都用不同的盐进行散列,则反向查找表攻击也将不起作用。

由于您似乎使用的是固定的食盐值,因此请注意以下几点:

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

我建议使用不带可选参数的password_hash 默认功能的构建具有很高的安全性,通过指定自己的算法和选项,可能会削弱其功能。

根据PHP文档

注意强烈建议您不要为此功能生成自己的盐。 如果您不指定盐,它将自动为您创建安全盐。

编辑:这就是为什么将盐秘密保留在bcrypt中是毫无意义的原因。

根据这篇文章 ,在8个字符的密码中有3,025,989,069,143,040个可能的组合。 通常,您应该将bcrypt的工作因数调整为需要0.1秒来哈希密码。 这意味着计算所有可能性需要302,598,906,914,304秒。 那是9,588 千年

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM