Как использовать хеширование паролей с помощью PDO, чтобы сделать мой код более безопасным?

Мой код действительно работает, но он совсем не защищен, я не хочу использовать 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>"; 

Может ли кто-нибудь показать мне, как включить его в код, который у меня есть?

Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.

  • PHP 5.5+: используйте password_hash()
  • PHP 5.3.7+: используйте password-compat (пакет совместимости для выше)
  • Все остальные: используйте phpass

Не делай этого сам. Если вы создаете свою соль, ВЫ НЕПРАВИЛЬНО . Вы должны использовать библиотеку, которая обрабатывает это для вас.

 $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 } 

О безопасности вашего кода :

  • Вы должны ВСЕГДА проверять пользовательские записи, даже с помощью метода POST, который можно изменить с помощью firebug перед отправкой формы. Когда вы вставляете пользовательский ввод в запрос , это гораздо важнее.

О вашем вопросе вообще

Как я вам посоветовал в комментарии, используйте PHPass или уже сделанные API, которые будут выполнять эту работу за вас.

Вы будете использовать имя пользователя, пароль и соль для создания учетной записи и вставить хэш в базу данных.

Во время аутентификации вы будете регенерировать хеш с указанным входом для входа + пароля и информацией, которую вы добавили, чтобы генерировать соль.

Если оба сгенерированных хэша совпадают, пользователь аутентифицируется.

EDIT: Да, пароль также хорош.

В принципе, у вас есть два варианта, различающихся по сложности:

  • Храните хэш пароля зарегистрированного пользователя, используя алгоритм хэширования по вашему выбору (подробнее об этом позже).
  • создайте случайную соль (постоянную, секретную строку), которая будет использоваться вместе с паролем пользователя, чтобы создать хэш, как указано выше, а затем сохранить этот хэш в БД.

Когда вы извлекаете запись пользователя, вы сравниваете хэш, вычисленный из предоставленного пароля, с хешем, хранящимся в БД.

Пример:

 $HashedPass = hash('sha512', $password); 

или с заранее определенной ОСВ:

 $HashedPass = hash('sha512', $password.SALT_STRING); 

Храните это в БД, как и раньше.

Аутентификация выполняется аналогичным образом:

 $HashedPass = hash('sha512', $password.SALT_STRING); 

а затем извлекать из БД на основе этого хэш-сравнения с сохраненным.

Теперь я хотел бы остановиться на ваших проблемах с алгоритмами Hashing: вам не нужно использовать md5, вы также можете использовать более безопасные алгоритмы хеширования, см. Комментарий здесь: хеш-функция PHP. Одно из предложений заключается в использовании алгоритма sha512.

Самое главное, вы должны понимать, что хеш – это одностороннее преобразование – нет практического способа перепроектировать исходный пароль только из хэша, только, возможно, найдя альтернативные строки, которые производят одну и ту же строку хеширования.

Надеюсь, вы обнаружите, что используете сильный алгоритм Хэша, а также соль, чтобы смягчить ущерб украденной Хэш-БД, достаточно подходящей для ваших нужд.