sql >> Databasteknik >  >> RDS >> Mysql

Hur drar man tillbaka ett saltat lösenord från databasen och autentiseringsanvändaren?

Ofta kämpar utvecklare med verifieringen av ett inloggningslösenord, eftersom de inte är säkra på hur de ska hantera den lagrade lösenordshashen. De vet att lösenordet bör hashas med en lämplig funktion som password_hash( ) , och lagra dem i en varchar(255) fält:

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

I inloggningsformuläret kan vi inte verifiera lösenordet direkt med SQL och inte heller söka efter det, eftersom de lagrade hasharna är saltade. Istället...

  1. måste läsa lösenords-hash från databasen, söka efter användar-id
  2. och efteråt kan kontrollera inloggningslösenordet mot den hittade hashen med password_verify() funktion.

Nedan hittar du exempelkod som visar hur du gör lösenordsverifiering med en mysqli förbindelse. Koden har inga felkontroller för att göra den läsbar:

/**
 * 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);
}

Observera att exemplet använder förberedda satser för att undvika SQL-injektion, escape är inte nödvändigt I detta fall. Ett likvärdigt exempel att läsa från en pdo anslutningen kan se ut så här:

/**
 * 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);
}



  1. Anslut din OEM till Grafana med Enterprise Manager-appen för Grafana

  2. Hur får man räkningen av nuvarande månads söndagar i psql?

  3. Hur man lägger till just de distinkta värdena med SQLite Sum()

  4. ELLER Operatörskortslutning i SQL Server