Я использую скрипт, который написал ircmaxell с именем password_compat . Я думал, что правильно выполнил его инструкции, но я не могу проверить свой пароль с помощью password_verify($password, $hash)
.
Хешированный пароль, сохраненный в моей базе данных;
$2y$10$zYpSzIj7kTPv3H7wDI/uXSYqi1se46b38uumP6SM4XGMmsjU3q
Я использую PDO, чтобы захватить мой хешированный пароль и использовать password_verify($password, $hash)
чтобы сравнить то, что отправляет логин. Я понимаю, что BRCYPT не является хеширующей функцией, поэтому password_verify($password, $hash)
сделает это волшебство. Я понятия не имею, как создается соль, но я бы подумал, что она создает обычную соль для каждого нового пароля, но как она может сравнить ее с моим сохраненным паролем, меня озадачивает. Как он соответствует правильной соли с паролем? Все это не спасло соль в моей базе данных, что меня смущает, lol. Вот код, который я использую;
Bcrypt
if($login->verifyip($_SERVER['REMOTE_ADDR'])) { require_once 'password.php'; //password_compat supplied file $username = $_POST['username']; $password = $_POST['password']; $dbpassword = $login->GetPassword($username); // pull saved password from db // verify posted password with saved password if(password_verify($dbpassword, $password)) { echo 'verified'; } else { echo 'not verified'; } }
PDO
public function GetPassword($username) { $passwordSQL = 'CALL get_password(:_user)'; // using stored procedure try { $pdo = new PDO('my login stuff'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $password = $pdo->prepare($passwordSQL); $password->bindParam(':_user',$username); $password->execute(); $fetch = $password->fetchColumn(0); $password->closeCursor(); return $fetch; } catch(PDOException $e) { return 'error' . $e->getMessage(); exit(); } }
Я удалил $ хэш, как предложил блендер.
Спасибо, что посмотрели 🙂
аргументы password_verify
противоположны:
password_verify($password, $dbpassword)
Что касается того, как это работает, хэш имеет такую форму:
$<algorithm>$<cost>$<salt>/<hash>
Итак, из хэша:
$2y$10$zYpSzIj7kTPv3H7wDI/uXSYqi1se46b38uumP6SM4XGMmsjU3q
Вы можете видеть, что стоимость равна 10
, соль – zYpSzIj7kTPv3H7wDI
а bcrypt(salt + password)
– uXSYqi1se46b38uumP6SM4XGMmsjU3q
.
password_verify
извлекает эту информацию из предоставленного хеша и просто проверяет, есть ли bcrypt(salt + password) == hash
.