У меня было много проблем с моим кодом, так как я впервые начал изучать что-то о хэшировании и засовывании паролей. Во-первых, я узнаю, как «хэш» пароли с MD5 (да, не делайте этого больше), затем с хешем и SHA256 и, наконец, теперь с bcrypt (или, по крайней мере, я считаю, что это bcrypt). Вот мой регистрационный код на данный момент:PDO Fetching Зашифрованный пароль?
register.php
<html>
<head>
<title>PDO - hashing algorithm</title>
</head>
<body>
<?php
if(isset($_POST['submit'])) {
define("DB_DSN", "mysql:host=localhost;dbname=test");
define ("DB_USER", "root");
define ("DB_PASS", "");
try {
$connect = new PDO (DB_DSN, DB_USER, DB_PASS);
$query = "CREATE TABLE IF NOT EXISTS `users` (
`id` INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
`username` VARCHAR(100) NOT NULL,
`password` VARCHAR(500) NOT NULL
)ENGINE=InnoDB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;";
$stmt = $connect->prepare($query);
$stmt->execute();
} catch (PDOException $e) {
echo $e->getMessage();
}
// Let's hash the password
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
$hashedpassword = crypt($_POST['password']. '$2a$12$' .$salt);
try {
$query = "INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)";
$stmt = $connect->prepare($query);
$stmt->execute(array(
':username' => $_POST['username'],
':password' => $hashedpassword
));
if ($stmt->rowCount() == 1) {
echo "Well done, user has registered successfully";
} else {
echo "An error occured.. Please try again";
}
} catch (PDOException $e) {
echo $e->getMessage();
}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<p>Username: <input type="text" name="username"/></p>
<p>Password: <input type="password" name="password" /></p>
<input type="submit" name="submit" />
</form>
</body>
</html>
Этот код работает и будет склеп пароль, так что не мой главный вопрос. Мой главный вопрос: как мне сравнить введенный пользователем пароль и пароль, хранящиеся в db, когда я хочу создать страницу входа?
вот мой login.php atm. Скажите, если вы видите что-то, что у меня нет, но я не могу заставить это работать, он не выведет имя пользователя и пароль из базы данных.
<?php
try {
define("DB_DSN", "mysql:host=localhost;dbname=test");
define ("DB_USER", "root");
define ("DB_PASS", "");
$connect = new PDO (DB_DSN, DB_USER, DB_PASS);
} catch (PDOException $e) {
echo $e->getMessage();
}
if(isset($_POST['submit'])) {
$query = "SELECT * FROM `users` WHERE (username) = :username";
$stmt = $connect->prepare($query);
$stmt->execute(array(
':username' => $_POST['username']
));
if($stmt->rowCount() == 0) {
echo "User doesn't exist";
}
$row = $stmt->fetch();
if (crypt($_POST['password'], $row['password']) == $row['password']) {
echo $row['username']. $row['password'];
} else {
return false;
}
}
?>
Извлечь хэш из bcrypt из базы данных, используя прилагаемое использование r ID/имя. Выбранное значение * должно содержать соль и количество раундов, а также результат хэша. Затем используйте это вместе с предоставленным пользователем вводом для генерации нового значения bcrypt и сравнения - аутентификация действительна тогда и только тогда, когда они являются одинаковыми. Я совершенно уверен, что это показано на примерах. Или, лучше, используйте аккуратную библиотеку/обертку. (В отличие от сломанного метода хэширования пароля без соли, он требует первой выборки соли, чтобы его можно было использовать для вычисления хэша вызова.) – user2246674
Я отредактировал свой комментарий ниже с образцом кода, который, надеюсь, поможет вам. –