【问题标题】:Must I generate an additional salt, even though password_hash() already provides a salt?即使 password_hash() 已经提供了盐,我是否必须生成额外的盐?
【发布时间】:2015-04-17 14:26:57
【问题描述】:

在使用 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() 时添加盐?

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

【问题讨论】:

  • password_hash() 生成自己的盐。不用再加盐了。
  • 好吧……那么在你看来,如果我再次加盐会不会降低安全性?
  • 盐吃多了对身体不好
  • 如果您想探索不同加盐方案的相对优点,那么Information Security 将是一个更好的提问地点。您可能可以通过反复加盐和散列密码来提高安全性,但每次迭代都有代价。问题真的是'它足够安全吗?'
  • 哈哈,对你的心脏不好^.^…但它甚至会加长密码。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,非常感谢您回答的细节!
    • 20+密码是什么意思?长字符?字节?不过我确实会生成随机密码。
    • 我刚刚发现我只能使用 PHP 5.2
    • 所以,我现在不知道该怎么办。我会一直坚持下去,直到找到一个可行的选择。
    • @MasonH.Hatfield - 我的意思是有 20 多个密码,现在可以使用不安全的 MD5 哈希以大约 8Giga per second 的速度暴力破解密码(BCrypt 需要更长的时间) .因此,长度为 20 个字符的密码需要大约 100000000000000000000000000000 年才能破解。你真的坚持使用 PHP 5.2,BCrypt 在 5.3 之前不受支持吗?如果你不能切换到 5.3,你最好的选择可能是phpass library
    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2017-12-11
    • 2013-04-23
    • 1970-01-01
    • 2022-07-14
    • 2017-12-28
    • 2021-10-16
    相关资源
    最近更新 更多