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); 

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

Web

Принудительное использование SSL/https с помощью .htaccess и mod_rewrite

Блочные и строчные элементы в HTML: подробное руководство
Web

Блочные и строчные элементы в HTML: подробное руководство

Что такое промышленный интернет вещей: особенности, преимущества и недостатки
Web

Что такое промышленный интернет вещей: особенности, преимущества и недостатки

Международные биржи фриланса: фриланс за рубежом — это просто!
Web

Международные биржи фриланса: фриланс за рубежом — это просто!

×