Wie kann man ein gesalzenes Passwort von der Datenbank und dem Authentifizierungsbenutzer zurückziehen?

Lesezeit: 4 Minuten

Wie kann man ein gesalzenes Passwort von der Datenbank und
clusterBuddy

Dies ist mein erster Versuch, eine Mitgliederseite mit gesalzenen Passwörtern zu implementieren, die alle in der DB (MySQL) gespeichert sind. Alles funktioniert, bis auf den Fehler auf der Seite „Login für Mitglieder“.

Der Fehler:

Anmeldeseite für Mitglieder akzeptiert irgendein Eintrag auf die Mitgliederseite und aus irgendeinem Grund übergibt meinen Scheck für $result === false

Dies ist der Code zum Überprüfen, ob ein Mitglied vorhanden ist. Bitte lassen Sie mich wissen, was das Problem ist:

$servername="localhost";
$username="root";
$pwd = '';
$dbname="lp001";

$connect = new mysqli($servername,$username,$pwd,$dbname);

if ($connect->connect_error){
    die('connection failed, reason: '.$connect->connect_error);
}


$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'];

$saltedPW = $password.$salt;
$hashedPW = hash('sha256', $saltedPW);
$sqlQuery = "SELECT * FROM users WHERE name="$name" AND password = '$hashedPW'";

if (mysqli_query($connect, $sqlQuery)){
    echo '<h1>Welcome to the member site '.$name.'</h1>';
}else{
    echo 'error adding the query: '.$sql_q.'<br> Reason: '.mysqli_error($connect);
}

  • Sehen Sie, es ist fast schlüsselfertig für Sie, der Login-Bereich, mit password_verify() hier: stackoverflow.com/a/33665819 . Es umfasst Sitzung, Fehlerberichterstattung und Try/Catch

    – Zeichnete

    11. Juli 2016 um 6:21 Uhr


  • Die SHA-*-Algorithmen sind nicht sicher, Passwörter zu speichern, verwenden Sie stattdessen die Funktion passwort_hash() um einen sicheren BCrypt-Hash zu generieren. Es wird unnötig, das Salz separat zu lagern, schau dir diese Antwort an.

    – Martinstöckli

    16. Juli 2016 um 15:38 Uhr


  • @martinstoeckli – danke, wenn du es als Code aufschreiben kannst, werde ich es als Antwort setzen, die mir und anderen in Zukunft helfen würde, danke nochmal, Knospe.

    – ClusterBuddy

    17. Juli 2016 um 11:14 Uhr

Wie kann man ein gesalzenes Passwort von der Datenbank und
martinstöckli

Oft kämpfen Entwickler mit der Überprüfung eines Login-Passworts, weil sie nicht sicher sind, wie sie mit dem gespeicherten Passwort-Hash umgehen sollen. Sie wissen, dass das Passwort mit einer geeigneten Funktion wie gehasht werden sollte passwort_hash()und speichern Sie sie in a varchar(255) Bereich:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

Im Login-Formular können wir das Passwort nicht direkt mit SQL verifizieren oder danach suchen, da die gespeicherten Hashes gesalzen sind. Stattdessen wir…

  1. müssen den Passwort-Hash aus der Datenbank lesen und nach der Benutzer-ID suchen
  2. und kann anschließend mit dem das Login-Passwort gegen den gefundenen Hash prüfen password_verify() Funktion.

Unten finden Sie einen Beispielcode, der zeigt, wie Sie eine Passwortüberprüfung mit einem durchführen mysql Verbindung. Der Code hat keine Fehlerprüfung, um ihn lesbar zu machen:

/**
 * 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 db, searching by username
$sql="SELECT password FROM users WHERE username = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $_POST['username']); // 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);
}

Beachten Sie, dass das Beispiel vorbereitete Anweisungen verwendet, um eine SQL-Injektion zu vermeiden. Flucht ist nicht notwendig in diesem Fall. Ein äquivalentes Beispiel zum Lesen von a pdo Verbindung könnte so aussehen:

/**
 * 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 db, searching by username
$sql="SELECT password FROM users WHERE username = ?";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $_POST['username'], 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);
}

935470cookie-checkWie kann man ein gesalzenes Passwort von der Datenbank und dem Authentifizierungsbenutzer zurückziehen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy