Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como retirar uma senha salgada do banco de dados e do usuário de autenticação?


Muitas vezes, os desenvolvedores lutam com a verificação de uma senha de login, porque não têm certeza de como lidar com o hash de senha armazenado. Eles sabem que a senha deve ser hash com uma função apropriada como password_hash( ) , e armazená-los em um varchar(255) campo:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

No formulário de login, não podemos verificar a senha diretamente com o SQL, nem podemos procurá-la, pois os hashes armazenados são salgados. Em vez disso, nós...
  1. tem que ler o hash de senha do banco de dados, pesquisando pelo id do usuário
  2. e depois pode verificar a senha de login em relação ao hash encontrado com o password_verify() função.

Abaixo você pode encontrar um código de exemplo, mostrando como fazer a verificação de senha com um mysqli conexão. O código não tem verificação de erros para torná-lo legível:
/**
 * 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);
}

Observe que o exemplo usa instruções preparadas para evitar injeção de SQL, não é necessário escapar nesse caso. Um exemplo equivalente para ler de um pdo conexão pode ficar assim:
/**
 * 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);
}