2

在使用 PHP 的本机 password_hash() 函数时,必须(或应该)生成我自己的盐,即使(据我了解)它已经可以创建一个盐,如本示例中所示(由http://www.php 提供。净):

 <?php
/**
 * Note that the salt here is randomly generated.
 * Never use a static salt or one that is not randomly generated.
 *
 * For the VAST majority of use-cases, let password_hash generate the salt randomly for you
 */
$options = [
   'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

目前我一直在使用 sha512 进行散列并生成 38,500 个字符的盐。(我不确定字符数是否真的很重要,所以我还是尝试了......它似乎奏效了,因为允许我成功注册和登录用户,但我不知道整个安全漏洞)像这样:

  <?php
  $Salt =  str_repeat(hash("sha512", uniqid(time())), 40);
  ?>

很奇怪,但是在密码学方面我有很多东西要学。(这里是其中一种盐的链接https://shrib.com/F7lB9Ycf)现在如果我要添加额外的盐(如果你说是,再次加盐),那么我将如何在使用 password_verify 时添加盐()?

提前感谢任何可以提供帮助的人!

4

2 回答 2

1

您不应该生成自己的盐,因为函数password_hash()使用操作系统的随机源尽可能地做到了这一点。换句话说,您将无法产生更好的盐,尽管您可以做得更糟。

// Leave out a salt in the options
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));

生成 38500 个字符的盐绝对没有优势。根据添加盐的方式,当您使用具有最大密码长度的算法(如 BCrypt 所做的那样)时,它甚至会降低安全性。通常一个盐大约是 20 个字节。

盐应该可以保护您免受彩虹表攻击。必须为这种盐建立一个彩虹表,因为现在不可能暴力破解一个随机的 20+ 密码。如果您为每个密码添加一个唯一的盐,攻击者将不得不为每个密码构建一个彩虹表。如果您对更多信息感兴趣,可以查看我关于安全存储密码的教程。

于 2015-02-17T08:20:21.120 回答
0

password_hash()生成自己的盐。无需再次加盐。请参阅PHP 参考如果省略,password_hash() 将为每个散列密码生成随机加盐。这是预期的操作模式。

于 2015-02-16T23:41:47.123 回答