当前位置: 首页 > 知识库问答 >
问题:

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

於彬
2023-03-14

在使用PHP的本机password_hash()函数时,我必须(或应该)生成自己的salt,尽管(据我所知),它已经可以创建salt,如本例所示(由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)现在,如果我要添加一个额外的salt(如果你说是,再次添加salt),那么我将如何使用password_verify()在中添加salt?

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

共有2个答案

彭鹭洋
2023-03-14

password\u hash()生成自己的salt。无需再次添加salt。请参见PHP参考:如果省略,则密码_hash()将为每个哈希密码生成一个随机salt。这是预期的操作模式。

田巴英
2023-03-14

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

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

生成一个包含38500个字符的salt绝对没有好处。根据salt的添加方式,当您使用密码长度最大的算法(如BCrypt)时,它甚至可能会降低安全性。通常一个salt大约是20字节。

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

 类似资料:
  • 我正在使用。NET Bcrypt哈希实现来自第三方库,它具有创建哈希的方法,只需提供文本或密码,如下所示。 我知道生成的hash包含salt信息,但在创建hash时它没有获取salt参数。 Bcrypt在内部创建随机盐并使用它? 如果我不使用salt重载方法,它会导致安全漏洞吗?

  • 问题内容: 所以我正在尝试bcrypt。我有一类(如下所示,该类来自http://www.firedartstudios.com/articles/read/php- security-how-to-safe-store-your- passwords ),其中包含3个功能。第一个是生成随机的Salt,第二个是使用第一个生成的Salt生成哈希,最后一个是通过将提供的密码与哈希密码进行比较来验证所提

  • 问题内容: 我正在尝试在Java中生成盐,以与用于安全密码存储的哈希算法配合使用。我正在使用以下代码创建随机盐: 这应该生成一个完全安全的,随机生成的盐,以用于我的哈希算法。但是,当我运行代码时,每次都会输出相同的盐…表示生成的盐根本不是随机的。 出于明显的安全性目的,每个用户都需要一个唯一的符号,但是如果我每次创建一个新帐户时都使用此代码,则每个用户都将具有相同的符号,这一开始就破坏了它的用途。

  • 我使用uuidv4输入字段唯一的关键字,我甚至通过传递数组索引作为唯一的道具检查,但我得到相同的警告反应。StackOverflow上的一个类似问题建议在最外层的JSX标签上使用密钥,所以我将密钥放在

  • 然后我使用相同的公式来解密密码,通过尝试所有可能的子字符串组合,直到找到正确的一个。 我的问题是A.除了可能的性能问题之外,这种方法还会带来什么危险? B.这种方法是否矫枉过正,像这样加盐和存储盐/密码有必要吗?c.如果没有必要,我还可以使用什么其他方法来加盐和存储盐/密码?

  • 虽然我理解加盐和散列密码过程背后的神学,但我不太理解方法论。据我所知,这个问题及其相关答案中列出的方法,以及MSDN的这篇文章,都经历了创建不同长度的salt的步骤,以便在散列给定密码的过程中使用。 但是,稍后检查密码怎么样?据我所知,再次创建哈希将导致生成全新的盐,最终导致在尝试登录时验证失败。 我是否错过了盐或盐配方的保存位置?还是我不太了解这个过程?