Мой код действительно работает, но он совсем не защищен, я не хочу использовать MD5, поскольку он не все настолько безопасен. Я искал хэширование паролей, но я не уверен, как включить его в свой код.
Авторизоваться:
require_once __DIR__.'/config.php'; session_start(); $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); $sql = "SELECT * FROM users WHERE username = :u AND password = :p"; $query = $dbh->prepare($sql); // prepare $params = array(":u" => $_POST['username'], ":p" => $_POST['password']); $query->execute($params); // execute $results = $query->fetchAll(); // then fetch //hash passwords pls if (count($results) > 0 ){ $firstrow = $results[0]; $_SESSION['username'] = $firstrow['username']; echo "Hello $username you have successfully logged in"; //header ("location:.php"); } else{ echo "Login Has Failed"; return; }
Регистр:
$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); $username = $_POST["username"]; $email = $_POST["email"]; $password = $_POST["password"]; $stmt = $dbh->prepare("insert into users set username='".$username."', email='".$email."', password='".$password."' "); $stmt->execute(); echo "<p>Thank you, you are registered</p>";
Может ли кто-нибудь показать мне, как включить его в код, который у меня есть?
Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.
password_hash()
password-compat
(пакет совместимости для выше) Не делай этого сам. Если вы создаете свою соль, ВЫ НЕПРАВИЛЬНО . Вы должны использовать библиотеку, которая обрабатывает это для вас.
$dbh = new PDO(...); $username = $_POST["username"]; $email = $_POST["email"]; $password = $_POST["password"]; $hash = password_hash($password, PASSWORD_DEFAULT); $stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); $stmt->execute([$username, $email, $hash]);
И при входе в систему:
$sql = "SELECT * FROM users WHERE username = ?"; $stmt = $dbh->prepare($sql); $result = $stmt->execute([$_POST['username']]); $users = $result->fetchAll(); if (isset($users[0]) { if (password_verify($_POST['password'], $users[0]->password) { // valid login } else { // invalid password } } else { // invalid username }
О безопасности вашего кода :
О вашем вопросе вообще
Как я вам посоветовал в комментарии, используйте PHPass или уже сделанные API, которые будут выполнять эту работу за вас.
Вы будете использовать имя пользователя, пароль и соль для создания учетной записи и вставить хэш в базу данных.
Во время аутентификации вы будете регенерировать хеш с указанным входом для входа + пароля и информацией, которую вы добавили, чтобы генерировать соль.
Если оба сгенерированных хэша совпадают, пользователь аутентифицируется.
EDIT: Да, пароль также хорош.
В принципе, у вас есть два варианта, различающихся по сложности:
Когда вы извлекаете запись пользователя, вы сравниваете хэш, вычисленный из предоставленного пароля, с хешем, хранящимся в БД.
Пример:
$HashedPass = hash('sha512', $password);
или с заранее определенной ОСВ:
$HashedPass = hash('sha512', $password.SALT_STRING);
Храните это в БД, как и раньше.
Аутентификация выполняется аналогичным образом:
$HashedPass = hash('sha512', $password.SALT_STRING);
а затем извлекать из БД на основе этого хэш-сравнения с сохраненным.
Теперь я хотел бы остановиться на ваших проблемах с алгоритмами Hashing: вам не нужно использовать md5, вы также можете использовать более безопасные алгоритмы хеширования, см. Комментарий здесь: хеш-функция PHP. Одно из предложений заключается в использовании алгоритма sha512.
Самое главное, вы должны понимать, что хеш – это одностороннее преобразование – нет практического способа перепроектировать исходный пароль только из хэша, только, возможно, найдя альтернативные строки, которые производят одну и ту же строку хеширования.
Надеюсь, вы обнаружите, что используете сильный алгоритм Хэша, а также соль, чтобы смягчить ущерб украденной Хэш-БД, достаточно подходящей для ваших нужд.