【问题标题】:De hash a password_hash with a costDe hash a password_hash with a cost
【发布时间】:2017-08-20 14:21:40
【问题描述】:

例如,如果我对密码进行 20 次哈希运算,需要付出代价:

$Pass1=password_hash($Pass, PASSWORD_DEFAULT, ['cost' => 20])

然后我将它存储在我的数据库中,我如何让用户登录我的网站,如果我知道的password_verify() 对密码“一次”进行哈希处理?

我需要password_verify ($password,$storedPassword) 20 次吗? 或者有更简单的方法吗?我看到了一个 password_needs_rehash,我已经尝试过使用它,但它不起作用。

【问题讨论】:

  • 多次散列密码不会提高安全性。检查文本是否是先前保存的密码的常规方法是遵循与原始密码相同的转换过程(即在这种情况下对传入的文本进行 20 次散列并与先前保存的散列进行比较)。
  • 您使用成本因子 20 对密码进行哈希处理,成本因子实际上存储在哈希本身中,因此 password_verify 可以同时查看哈希算法和成本因子,并使用它们来验证提供的密码.只需像在 OP 中一样使用它,它会处理其余的事情。

标签: php password-hash


【解决方案1】:

一段时间后我找到了解决方案

$Pass1=password_hash($Pass, PASSWORD_DEFAULT, ['cost' => 20]);
password_verify($PasswordInputByUser, $Pass1);

这么简单!

【讨论】:

    【解决方案2】:
    <?php
    
    $Pass = 'greatPassword1';
    $Pass1 = password_hash( $Pass, PASSWORD_DEFAULT, ['cost' => 12] );
    echo $Pass1;
    

    $Pass1 是 $2y$12$cnxAUfdMyA67QmsCW.x2aOVxvSyLPb/idLgklfAJOG5BPDcNlV1ba

    在散列密码的开头,您会看到 $2y$12$,并且您会看到您创建的所有密码在开头都有相同的内容。这就是 PHP 了解算法和成本的方式。所以当你想验证密码是否相同时,你所要做的就是:

    $verified = password_verify('greatPassword1', $Pass1);
    // True
    
    $verified = password_verify('wrongPassword1', $Pass1);
    // False
    

    如果您使用 20 的成本,您很可能会在散列密码的开头看到 $2y$20$。我的 PHP 没有设置为允许超过 30 秒的执行时间,所以我更改为较低的成本值。

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      相关资源
      最近更新 更多