Heim >Datenbank >MySQL-Tutorial >Wie authentifiziert man Benutzer sicher mit in einer Datenbank gespeicherten Salted-Passwörtern?

Wie authentifiziert man Benutzer sicher mit in einer Datenbank gespeicherten Salted-Passwörtern?

Linda Hamilton
Linda HamiltonOriginal
2024-12-05 03:39:09885Durchsuche

How to Safely Authenticate Users with Salted Passwords Stored in a Database?

So entziehen Sie ein Salted-Passwort aus der Datenbank und authentifizieren einen Benutzer

Beim Implementieren einer Mitgliederseite mit Salted-Passwörtern, die in einer Datenbank gespeichert sind, Die Sicherstellung einer korrekten Authentifizierung wird von entscheidender Bedeutung. Beim Versuch, die Existenz eines Benutzers zu überprüfen, können jedoch Fehler auftreten.

Das Problem

Der folgende Codeausschnitt zeigt eine falsche Methode zur Überprüfung, ob ein Mitglied existiert:

$name = mysqli_real_escape_string($connect, $_POST['name']);
$password = mysqli_real_escape_string($connect, $_POST['password']);
$saltQuery = "SELECT salt FROM users WHERE name = '$name';";
$result = mysqli_query($connect, $saltQuery);
if ($result === false){
    die(mysqli_error());
}
$row = mysqli_fetch_assoc($result);
$salt = $row['salt'];

Dieser Code versucht, das Salt aus der Datenbank abzurufen, schlägt jedoch fehl, wenn die Abfrage zurückkehrt falsch.

Die Lösung

Um die Anmeldeinformationen eines Benutzers genau zu überprüfen, müssen wir den gespeicherten Passwort-Hash abrufen und ihn mit dem vom Benutzer eingegebenen Passwort vergleichen. Dieser Prozess beinhaltet die Verwendung der Funktionen password_hash() und password_verify().

Beispielcode für MySQLi

/**
 * mysqli example for a login with a stored password-hash
 */
$mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$mysqli->set_charset('utf8');

// Find the stored password hash in the database, searching by username
$sql = 'SELECT password FROM users WHERE name = ?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $_POST['name']); // it is safe to pass the user input unescaped
$stmt->execute();

// If this user exists, fetch the password-hash and check it
$isPasswordCorrect = false;
$stmt->bind_result($hashFromDb);
if ($stmt->fetch() === true) {
  // Check whether the entered password matches the stored hash.
  // The salt and the cost factor will be extracted from $hashFromDb.
  $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
}

Beispielcode für PDO

/**
 * pdo example for a login with a stored password-hash
 */
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$pdo = new PDO($dsn, $dbUser, $dbPassword);

// Find the stored password hash in the database, searching by username
$sql = 'SELECT password FROM users WHERE name = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $_POST['name'], PDO::PARAM_STR); // it is safe to pass the user input unescaped
$stmt->execute();

// If this user exists, fetch the password hash and check it
$isPasswordCorrect = false;
if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) {
  $hashFromDb = $row['password'];

  // Check whether the entered password matches the stored hash.
  // The salt and the cost factor will be extracted from $hashFromDb.
  $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
}

Das obige ist der detaillierte Inhalt vonWie authentifiziert man Benutzer sicher mit in einer Datenbank gespeicherten Salted-Passwörtern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn