Недавно я пытался реализовать свою собственную систему безопасности в сценарии входа в систему. Изо всех сил пытаясь научиться создавать собственный скрипт для генерации салта для каждого пользователя, я наткнулся на 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);
Web