Как использовать хеширование паролей в 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>";

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

1

Решение

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

  • 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
}
22

Другие решения

О том, как сделать ваш код более безопасным:

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

О вашем вопросе в целом

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

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

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

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

РЕДАКТИРОВАТЬ: Да, password_hash это тоже хорошо.

2

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

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

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

Пример:

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

или с заранее заданной солью:

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

Сохраните это в БД, как вы делали раньше.

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

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

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

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

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

Я надеюсь, что вы найдете использование сильного алгоритма хеширования вместе с Salt для уменьшения ущерба от украденного Hash DB, достаточно хорошего для ваших нужд.

-1
По вопросам рекламы [email protected]