Heim  >  Fragen und Antworten  >  Hauptteil

So verwenden Sie PHPs „password_hash“, um Passwörter zu hashen und zu überprüfen

<p>In letzter Zeit habe ich versucht, meine eigene Sicherheit in ein Anmeldeskript zu implementieren, über das ich im Internet gestolpert bin. Nachdem ich Schwierigkeiten hatte zu lernen, wie ich mein eigenes Skript erstellen kann, um für jeden Benutzer einen Salt zu generieren, bin ich auf <code>password_hash</code> gestoßen. </p> <p>So wie ich es verstehe (basierend auf der Lektüre dieser Seite), wird das Salt bereits in der Zeile generiert, wenn Sie <code>password_hash</code> verwenden. Das ist echt? </p> <p>Meine andere Frage ist, wäre es nicht klug, zwei Arten von Salz zu haben? Eine direkt in der Datei und eine in der Datenbank? Wenn also jemand das Salt in der Datenbank beschädigt, können Sie das Salt trotzdem direkt in der Datei speichern? Ich habe hier gelesen, dass das Aufbewahren von Salz niemals eine kluge Idee ist, aber es verwirrt mich immer, was die Leute damit meinen. </p>
P粉898107874P粉898107874398 Tage vor402

Antworte allen(2)Ich werde antworten

  • 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);

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

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

    Antwort
    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.

    官方参考

    Antwort
    0
  • StornierenAntwort