我是否必须生成额外的盐,即使password_hash()已经提供了盐?

时间:2015-02-16 23:36:07

标签: php cryptography salt bcrypt php-password-hash

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

 <?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()附加盐?

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

2 个答案:

答案 0 :(得分:1)

你应该生成自己的salt,因为函数password_hash()使用操作系统的随机源尽可能做到最好。换句话说,虽然你可以做得更糟,但你无法生成更好的盐。

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

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

盐应该保护你免受彩虹表攻击。必须为这种盐构建彩虹表,因为现在不可能强制使用随机的20+密码。如果为每个密码添加唯一的salt,则攻击者必须为每个密码构建一个rainbow-table。如果您对更多信息感兴趣,可以查看我的tutorial关于安全存储密码的信息。

答案 1 :(得分:0)

password_hash()生成自己的盐。不需要再次加盐。从PHP Reference看到:如果省略,每个密码哈希值都会通过password_hash()生成一个随机盐。这是预期的操作模式。