suchen

Heim  >  Fragen und Antworten  >  Hauptteil

So hashen und überprüfen Sie Passwörter mit der Funktion „password_hash“ von PHP

<p>In letzter Zeit habe ich versucht, meine eigene Sicherheit für ein Anmeldeskript zu implementieren, das ich im Internet gefunden habe. Als ich versuchte, ein Skript zum Generieren eines Salts für jeden Benutzer zu lernen, bin ich auf <code>password_hash</code> gestoßen. </p> <p>Soweit ich weiß (basierend auf der Lektüre auf dieser Seite), wird das Salt bereits in der Zeile generiert, wenn Sie <code>password_hash</code> verwenden. ist das echt? </p> <p>Ich habe noch eine Frage: Ist es sinnvoll, zwei Salze zu verwenden? Einer wird direkt in der Datei und der andere in der Datenbank gespeichert? Wenn also jemand das Salt in der Datenbank bricht, haben Sie immer noch ein Salt in der Datei. Ich habe hier gelesen, dass es niemals eine kluge Idee ist, Salz aufzubewahren, aber es verwirrt mich immer, wenn Leute das sagen. </p>
P粉011684326P粉011684326464 Tage vor630

Antworte allen(2)Ich werde antworten

  • P粉896751037

    P粉8967510372023-08-18 17:37:32

    是的,你理解得没错,函数password_hash()会自动生成一个盐,并将其包含在生成的哈希值中。将盐存储在数据库中是完全正确的,即使已知,它也能发挥作用。

    // 为在数据库中存储的新密码生成哈希值。
    // 该函数会自动生成一个密码学安全的盐。
    $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);
    
    // 检查输入的登录密码的哈希值是否与存储的哈希值匹配。
    // 盐和成本因素将从$existingHashFromDb中提取。
    $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);

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

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

    Antwort
    0
  • P粉422227023

    P粉4222270232023-08-18 10:36:51

    使用password_hash是存储密码的推荐方式。不要将它们分开存储在数据库和文件中。

    假设我们有以下输入:

    $password = $_POST['password'];

    首先通过以下方式对密码进行哈希处理:

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    然后查看输出结果:

    var_dump($hashed_password);

    如你所见,它已经被哈希处理了。(我假设你已经完成了这些步骤)。

    现在将这个哈希密码存储在你的数据库中,确保你的密码列足够大以容纳哈希值(至少60个字符或更长)。当用户请求登录时,你可以通过以下方式检查数据库中的哈希值与密码输入是否匹配:

    // 查询数据库获取用户名和密码
    // ...
    
    if(password_verify($password, $hashed_password)) {
        // 如果密码输入与数据库中的哈希密码匹配
        // 做一些操作,你懂的... 登录他们。
    } 
    
    // 否则,将他们重定向回登录页面。

    官方参考文档

    Antwort
    0
  • StornierenAntwort