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
Freigeben: 2024-12-05 03:39:09
Original
955 Leute haben es durchsucht

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'];
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage