首页  >  问答  >  正文

如何使用PHP的password_hash来哈希和验证密码

<p>最近,我一直在尝试在互联网上偶然发现的登录脚本上实现自己的安全性。在努力学习如何制作自己的脚本来为每个用户生成盐之后,我偶然发现了 <code>password_hash</code>。 </p> <p>据我了解(基于本页的阅读),当您使用<code>password_hash</code>时,盐已经在行中生成。这是真的? </p> <p>我的另一个问题是,有 2 种盐不是明智的吗?一种直接在文件中,一种在数据库中?这样,如果有人破坏了数据库中的盐,您仍然可以直接在文件中保存盐吗?我在这里读到,储存盐从来都不是一个聪明的主意,但它总是让我困惑人们的意思。 </p>
P粉898107874P粉898107874446 天前432

全部回复(2)我来回复

  • P粉555682718

    P粉5556827182023-08-25 00:55:35

    是的,您理解正确,函数password_hash()将自行生成盐,并将其包含在生成的哈希值中。将盐存储在数据库中是绝对正确的,即使已知它也能完成其工作。

    // Hash a new password for storing in the database.
    // The function automatically generates a cryptographically safe salt.
    $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);
    
    // Check if the hash of the entered login password, matches the stored hash.
    // The salt and the cost factor will be extracted from $existingHashFromDb.
    $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);

    您提到的第二个盐(存储在文件中的盐)实际上是胡椒或服务器端密钥。如果你在散列之前添加它(就像盐一样),那么你就添加了胡椒粉。不过,有一种更好的方法,您可以首先计算哈希值,然后使用服务器端密钥加密(双向)哈希值。这使您可以在必要时更改密钥。

    与盐相反,这个密钥应该保密。人们经常混淆它并试图隐藏盐,但最好让盐发挥其作用并用密钥添加秘密。

    回复
    0
  • P粉377412096

    P粉3774120962023-08-25 00:34:19

    建议使用password_hash来存储密码。不要将它们分成数据库和文件。

    假设我们有以下输入:

    $password = $_POST['password'];

    您首先通过执行以下操作对密码进行哈希处理:

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    然后查看输出:

    var_dump($hashed_password);

    正如你所看到的,它是经过哈希处理的。 (我假设您执行了这些步骤)。

    现在,您将此散列密码存储在数据库中,确保您的密码列足够大以容纳散列值(至少 60 个字符或更长)。当用户要求登录时,您可以使用数据库中的哈希值检查输入的密码,方法如下:

    // Query the database for username and password
    // ...
    
    if(password_verify($password, $hashed_password)) {
        // If the password inputs matched the hashed password in the database
        // Do something, you know... log them in.
    } 
    
    // Else, Redirect them back to the login page.

    官方参考

    回复
    0
  • 取消回复