sql >> Databáze >  >> RDS >> Mysql

Jak stáhnout osolené heslo z databáze a auth uživatele?

Vývojáři často bojují s ověřením přihlašovacího hesla, protože si nejsou jisti, jak naložit s uloženým hashem hesla. Vědí, že heslo by mělo být hašováno pomocí vhodné funkce jako password_hash( ) a uložte je do varchar(255) pole:

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

V přihlašovacím formuláři nemůžeme heslo ověřit přímo pomocí SQL, ani jej hledat, protože uložené hashe jsou solené. Místo toho my...

  1. musíte načíst hash hesla z databáze a hledat podle ID uživatele
  2. a poté můžete zkontrolovat přihlašovací heslo s nalezeným hashem pomocí password_verify() funkce.

Níže naleznete příklad kódu, který ukazuje, jak provést ověření hesla pomocí mysqli spojení. Kód nemá žádnou kontrolu chyb, aby byl čitelný:

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

Všimněte si, že příklad používá připravené příkazy, aby se zabránilo vkládání SQL, escapování není nutné v tomto případě. Ekvivalentní příklad ke čtení z pdo připojení může vypadat takto:

/**
 * 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. ORA-01658:nelze vytvořit INITIAL rozsah pro segment v tabulkovém prostoru TS_DATA

  2. Jak povolit operátor zřetězení potrubí v MySQL

  3. Vytvoření databázového poštovního účtu v SQL Server (T-SQL)

  4. SQLite - Nějaký rozdíl mezi omezením tabulky UNIQUE a omezením sloupce UNIQUE?