Во-первых, я довольно новичок в кодировании в целом, поэтому идея хеширования несколько запутанна. По сути, я пытаюсь хешировать пароль, чтобы хранить его в базе данных, поэтому у меня нет пароля в виде простого текста (мне говорят, что это лучший способ сделать это, хотя я не думаю, что это было бы так большая проблема, если пароли не были хэшированы, поскольку это используется только в небольшой группе людей, и я мог бы сообщить, что они не используют пароли, о которых они заботятся, но мне все же было рекомендовано это сделать).
Я просмотрел несколько руководств и мог бы помочь с пониманием этого. Я расскажу о том, как я использую пароли и как я вытаскиваю их из базы данных, чтобы помочь понять эту проблему. Извините заранее, если это глупый вопрос. Просто голова, я действительно не понимаю этого, поэтому я задаю вопрос.
ПРИМЕЧАНИЕ. Включенные переменные, такие как $ login_username и $ login_password, правильно вытягиваются, я просто не хотел их включать, так как это еще больше загромождает этот беспорядок сообщения.
Зарегистрируйте пользователя (попробовали password_default и password_bcrypt, но я не вижу разницы):
require_once 'database.php'; $hash_employee_password = password_hash($employee_password, PASSWORD_DEFAULT); $query = "INSERT INTO employee (employee_id, employee_first_name, employee_last_name, employee_username, employee_email, employee_password) VALUES (:employee_id, :employee_first_name, :employee_last_name, :employee_username, :employee_email, :employee_password);"; //VALUES (".$employee_id.", '" . $employee_first_name."', '" . $employee_last_name . "', '".$employee_username."', '".$employee_email."', '" . "$employee_password');"; $statement = $db->prepare($query); $statement->bindValue(':employee_id', $employee_id); $statement->bindValue(':employee_first_name', $employee_first_name); $statement->bindValue(':employee_last_name', $employee_last_name); $statement->bindValue(':employee_username', $employee_username); $statement->bindValue(':employee_password', $hash_employee_password); $statement->bindValue(':employee_email', $employee_email); $statement->execute(); $statement->closeCursor(); //echo $query; $message = 'You have been successfully registered. Contact your manager in order to request account confirmation.'; include ('success.php');
Вход в систему:
require_once 'database.php'; include 'register_user.php'; $pwordQuery = "SELECT employee_password from employee where employee_username = :login_username"; $pwstatement = $db->prepare($pwordQuery); $pwstatement->bindValue(':login_username', $login_username); $pwstatement->execute(); $result = $pwstatement->fetch(); $pwstatement->closeCursor(); echo $result[0]; if(password_verify($login_password, $result[0])) { echo ' TRUE'; } else { echo ' FALSE '; }
Проблема в том, что я вхожу в правильное имя пользователя и пароль, но я получаю результат «FALSE». Дайте мне знать, если у вас есть идеи. Не обращайте внимания на то, что у меня есть много работы, чтобы сделать мои запросы в функции и называть их таким образом … Это сохраняется для более поздней даты.
«Длина столбца паролей – это что? Если это что-то меньшее, чем 60, mysql сработал без вас. В 9 раз из 10 это проблема. Если это так, вам нужно начать все заново, очистив ваш db и создать новый хеш. – Fred -ii- 13 мин назад "
которым я был прав все время:
@Fred Хорошо, похоже, что длина столбца 45 была плохой идеей, и это была моя единственная проблема. Спасибо за помощь, не совсем уверен, как работает этот сайт, поэтому я не знаю, как дать вам репутацию или что-то еще ».
В соответствии с руководством по функции password_hash()
:
http://php.net/manual/en/function.password-hash.php
PASSWORD_DEFAULT – Использовать алгоритм bcrypt (по умолчанию с PHP 5.5.0). Обратите внимание, что эта константа предназначена для изменения с течением времени, когда новые и более сильные алгоритмы добавляются в PHP. По этой причине длина результата от использования этого идентификатора может меняться со временем. Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором).