Web

Использование password_hash для хеширования и проверки паролей в PHP

Недавно я пытался реализовать свою собственную систему безопасности в сценарии входа в систему. Изо всех сил пытаясь научиться создавать собственный скрипт для генерации салта для каждого пользователя, я наткнулся на password_hash.

Насколько я понимаю, салт уже генерируется в строке, когда используется password_hash?

Еще один вопрос, который у меня возник: не было бы разумно иметь два салта? Один прямо в файле, а другой в БД? Таким образом, если кто-то скомпрометирует ваш салт в БД, он все равно останется прямо в файле?

 

Ответ 1

Использование password_hashэто рекомендуемый способ хранения паролей. Не разделяйте их на БД и файлы.

Допустим, у нас есть следующие данные:

$password = $_POST['password'];

 

Сначала вы хешируете пароль, выполнив следующие действия:

$hashed_password = password_hash($password, PASSWORD_DEFAULT);

 

Затем имеем результат:

var_dump($hashed_password);

 

Как видите, он хеширован.

Теперь вы сохраняете этот хешированный пароль в своей базе данных, следя за темчтобы столбец пароля был достаточно большим для хранения хешированного значения (не менее 60 символов или больше). Когда пользователь просит войти в систему, вы проверяете ввод пароля с этим значением хеш-функции в базе данных, выполнив следующие действия:

// Запрос из базы данных логина и пароля

if(password_verify($password, $hashed_password)) {

    // Если введенный пароль совпал с хешированным паролем в базе данных

 

// Иначе переходим обратно на страницу входа в систему.

 

 

Ответ 2

Да, вы правильно поняли, функция password_hash() сама сгенерирует салт и включит его в полученное хеш-значение. Хранить салт в базе данных абсолютно правильно.

// Хеширование нового пароля для хранения в базе данных.

// Функция автоматически генерирует криптографически безопасный салт.

$hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);

// Проверяем, совпадает ли хеш введенного пароля для входа в систему с хранящимся там хешем.

// Салт и коэффициент будут извлечены из $existingHashFromDb.

$isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);

 

Второй салт, который вы упомянули (тот, что хранится в файле), на самом деле является ключом на стороне сервера. Однако есть способ получше: вы можете сначала вычислить хеш, а затем зашифровать двусторонний хеш серверным ключом. Это дает вам возможность при необходимости менять ключ.

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

 

Ответ 3

Никогда не используйте функцию md5() для защиты пароля, даже с салтом, это всегда опасно!

Защитите свой пароль с помощью новейших алгоритмов хеширования, как показано ниже:

<?php

// оригинальный пароль

$password           = '121@121';

$password_encrypted = password_hash($password, PASSWORD_BCRYPT);

 

Для сопоставления с зашифрованным паролем базы данных и паролем, введенным пользователем, используйте следующую функцию:

<?php 

 

if (password_verify($password_inputted_by_user, $password_encrypted)) {

    // Успешно!

    echo 'Пароль корректный';

}else {

    // Неверные учетные данные

    echo 'Неверный пароль';

}

 

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

<?php

$options = [

    'salt' => your_custom_function_for_salt(), 

    // собственный код для генерации подходящего и безопасного салта

    'cost' => 12;

]

$hash = password_hash($your_password, PASSWORD_DEFAULT, $options); 

Схожие статьи

Mobile First индекс Google: все о последнем тренде SEO-оптимизации
Web

Mobile First индекс Google: все о последнем тренде SEO-оптимизации

Лучший браузер для веб-разработчиков сайтов 2021
Web

Лучший браузер для веб-разработчиков сайтов 2021

Что такое видеохостинги типа Ютуба, как на них можно загружать видео
Web

Что такое видеохостинги типа Ютуба, как на них можно загружать видео

Web

Как проверить, содержит ли строка определенное слово?