function isValidLogin($user, $passwordGivenByUser) { $hashedPassword = getHashedPassword($passwordGivenByUser, $user["salt"]); return $user['password'] == $hashedPassword; }
function comparePasswords($hsPassword, $password) { //Parse out the salt from the hsPassword $salt = substr($hsPassword, 0, SALT_LEN); $hsPassword = substr($hsPassword, SALT_LEN); //Get the hashed password $password = getHashedPassword($salt, $password); //Compare if ($password == $hsPassword) { return true; } else { return false; } }
} // Benutzername und Passwort werden überprüft // Schritt 1: // Im Beispiel seien die Zugangsdaten in einer Textdatei gespeichert, welche // im wesentlichen dem Aufbau einer Datei entspricht, wie diese der Apache mit // der Methode htpasswd verwendet. // Das wäre hier mit den Benutzernamen foo und bar und dem identischen(!) Passwort // 'GeHeim' etwas wie: // foo:$2y$05$AoeUm/2hL5sdySuNuH0CmeSCZN7DneDdmU3thyrFWgiboh3FYQ0ae:weitere Informationen // bar:$2y$05$9971LHpPxCmZikyi3WqEd.1h8GE6QKfqT4RwS/FDINRqyzLcEHy.C:weitere Informationen // Weiter wird der Benutzername beim Speichern stets klein geschrieben und man muss absichern, // dass keine Leerzeichen am Beginn oder Ende des Strings mitgeliefert wurden: $_POST['username'] = strtolower(trim($_POST['username'])); // Wir kapseln aber das Abholen des Passwortes, damit auch Datenbanken verwendet werden können. // Dazu muss unten die Funktion getHashedPassword($username) angepasst werden. $hashedPassword = getHashedPassword($_POST['username']); if (false == $hashedPassword) { show_login('', 'Den Benutzer gibt es nicht.'); exit; } // Schritt 2: Überprüfen des Passwortes // leider gibt es noch ältere Installationen als PHP 5.5 - die password_verify() nicht kennen if (!function_exists('password_verify')) { // Wenn es crypt() nicht gibt, dann ist das PHP so alt, dass sicherheitsrelaventes damit // nicht gemacht werden sollte: if (!function_exists('crypt')) { // es gibt auch noch ältere ... die("Sorry: Aber Sie sollten Ihr PHP wirklich updaten!"); } // Wenn es password_verify() nicht gibt, dann bauen wir eine: function password_verify($password, $hashedPassword)
if (!($sql = connectToDatabase())) { sqlFail(); } //Does the user exist? $query = "SELECT * FROM user WHERE username='******'"; //Run query if (!($queryResult = mysqli_query($sql, $query))) { sqlFail(); } if (mysqli_num_rows($queryResult) != 0) { //User Name is already taken userNameUsed(); } //Generate a salt, get a salted-hashed password appended to salt $salt = generateSalt(); $password = getHashedPassword($salt, $password); $password = $salt . $password; //Add userName and password to database $query = "INSERT INTO user (username, password) VALUES ('{$userName}', '{$password}')"; //Run query if (!($queryResult = mysqli_query($sql, $query))) { sqlFail(); } //Disconnect from the database mysqli_close($sql); //--------------------------------------------- //Called if user name already taken //--------------------------------------------- function userNameUsed() { mysqli_close($sql);
//connects to database $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //shows errors $userquery = "SELECT username,password FROM user"; function getHashedPassword($username, $conn) { $stmt = $conn->prepare('SELECT password FROM user WHERE username = :username'); $stmt->execute(array('username' => $username)); $row = $stmt->fetch(); var_dump($row); if ($row == false) { return false; } return $row['password']; } $passwordHash = getHashedPassword($username, $conn); password_verify($password, $passwordHash); var_dump($hashpass); /* foreach ( $conn->query($userquery) as $row ) { echo $row['username']. " - " .$row['password']."<br>"; } //this also works if (password_verify($password, $hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } */ var_dump($password); var_dump($hash);