Я создал регистрационную форму, обработанную следующим образом:
function register_user() {
global $conn;
$name = sanitize($_POST['name']);
$email = sanitize($_POST['email']);
$password = sanitize($_POST['password']);
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$saltedPW = $password . $salt;
$hashedPW = hash('sha256', $saltedPW);
mysqli_query($conn, "INSERT INTO users (name, email, password, salt) VALUES ('$name', '$email', '$hashedPW', '$salt')");
Форма входа затем обрабатывается следующим образом:
function login($email, $password) {
global $conn;
$user_id = user_id_from_username($email);
$query = mysqli_query($conn, "SELECT salt FROM users WHERE email = '$email'");
$row1 = mysqli_fetch_assoc($query);
$salt = $row1['salt'];
$saltedPW = $password . $salt;
$hashedPW = hash('sha256', $saltedPW);
$result = mysqli_query($conn, "SELECT COUNT(user_id) FROM users WHERE email = '$email' AND password = '$hashedPW'");
$row = mysqli_fetch_row($result);
return ($row[0] == 1) ? $user_id : false;
}
Пользовательская таблица структурирована следующим образом:
Идентификатор пользователя; название; Эл. адрес; пароль; соль (дополнительные столбцы для восстановления пароля, права администратора и т. д.). Отправив подробности в отдел соответствия ИТ моей компании, кто-то с опытом работы с PHP (превосходя мой, без сомнения) заявил, что я не могу сохранить ключ для шифрования в системе — если кто-то получит файл, он сможет расшифровать пароль. Мой вопрос — это правильно? Мой процесс некорректен? Все исследования, которые я провел, показывают, что хеш SHA256 со случайной солью — один из лучших способов.
Я не могу сохранить ключ для шифрования в системе
У вас нет Вы хешируете, вы не шифруете. соль! == ключ
если кто-то получил файл, он может расшифровать пароль
Нет. Ничего не зашифровано, поэтому расшифровать нечего. Они получат только полученный хеш, который им все равно придется использовать грубой силой.
Мой процесс некорректен?
Да, но не из-за их комментариев. Это неверно, потому что вы никогда не должны использовать SHA, MD5 или аналогичные пароли. Они предназначены для быстрой работы, а это не то, что вам нужно. Вы хотите что-то, что намеренно требует много ресурсов процессора, чтобы совершать атаки грубой силы несвоевременно. Это именно то, что password_hash () функция для. Используй это.
Не используйте sha256, md5 и т. Д. Для хеширования пароля. Я думаю, что вы должны использовать BCrypt для хеширования паролей. Это самый мощный алгоритм хеширования паролей в настоящее время. password_hash()
а также password_verify()
используются для хеширования и проверки пароля для BCrypt. PHP 5.5.0 или выше использует BCrypt в качестве алгоритма по умолчанию для password_hash()
, Не используйте свою собственную соль. Позволять password_hash()
сделай это для тебя.