Насколько это безопаснее, чем обычный MD5 ? Я только начал изучать безопасность пароля. Я довольно новичок в PHP.
$salt = 'csdnfgksdgojnmfnb';
$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
WHERE username = '".mysql_real_escape_string($_POST['username'])."'
AND password = '$password'");
if (mysql_num_rows($result) < 1) {
/* Access denied */
echo "The username or password you entered is incorrect.";
}
else {
$_SESSION['id'] = mysql_result($result, 0, 'id');
#header("Location: ./");
echo "Hello $_SESSION[id]!";
}
Ответы:
Самый простой способ обезопасить вашу схему хранения паролей - использовать стандартную библиотеку .
Поскольку безопасность, как правило, намного сложнее и с более невидимыми возможностями взломать, чем может решить большинство программистов в одиночку, использование стандартной библиотеки почти всегда является самым простым и наиболее безопасным (если не единственным) доступным вариантом.
Новый API паролей PHP (5.5.0+)
Если вы используете PHP версии 5.5.0 или новее, вы можете использовать новый упрощенный API хеширования паролей
Пример кода с использованием API паролей PHP:
(Если вы все еще используете устаревшую версию 5.3.7 или новее, вы можете установить ircmaxell / password_compat, чтобы иметь доступ к встроенным функциям)
Улучшение соленых хэшей: добавить перец
Если вам нужна дополнительная безопасность, специалисты по безопасности сейчас (2017) рекомендуют добавить « перец » в (автоматически) соленые хэши паролей.
Существует простой класс, который безопасно реализует этот шаблон, я рекомендую: Netsilik / PepperedPasswords ( github ).
Он поставляется с лицензией MIT, поэтому вы можете использовать его по своему усмотрению, даже в проприетарных проектах.
Пример использования кода
Netsilik/PepperedPasswords
:Старая стандартная библиотека
Взгляните на: Переносимая среда хеширования паролей PHP : phpass и убедитесь, что вы используете
CRYPT_BLOWFISH
алгоритм, если это возможно.Пример кода с использованием phpass (v0.2):
PHPass был реализован в некоторых довольно известных проектах:
Хорошо, что вам не нужно беспокоиться о деталях, эти детали были запрограммированы людьми с опытом и проверены многими людьми в Интернете.
Для получения дополнительной информации о схемах хранения паролей, прочитайте сообщение в блоге Джеффа : « Вы, вероятно, храните пароли неправильно»
Что бы вы ни делали, если вы идете на подход « Я сделаю это сам, спасибо », не используйте
MD5
илиSHA1
больше . Это хороший алгоритм хэширования, но он считается нарушенным в целях безопасности .В настоящее время использование крипты , с CRYPT_BLOWFISH является лучшей практикой.
CRYPT_BLOWFISH в PHP - это реализация хеша Bcrypt. Bcrypt основан на блочном шифре Blowfish и использует дорогостоящую настройку ключей для замедления алгоритма.
источник
Вашим пользователям будет намного безопаснее, если вы будете использовать параметризованные запросы вместо конкатенации операторов SQL. И соль должна быть уникальной для каждого пользователя и должна храниться вместе с хэшем пароля.
источник
Лучшим способом было бы для каждого пользователя иметь уникальную соль.
Преимущество наличия соли заключается в том, что злоумышленнику становится сложнее предварительно сгенерировать подпись MD5 для каждого словарного слова. Но если злоумышленник узнает, что у вас есть фиксированная соль, он может предварительно сгенерировать подпись MD5 для каждого словарного слова с префиксом вашей фиксированной соли.
Лучший способ - каждый раз, когда пользователь меняет свой пароль, ваша система генерирует случайную соль и сохраняет ее вместе с записью пользователя. Проверка пароля становится немного дороже (поскольку вам нужно найти соль, прежде чем вы сможете сгенерировать подпись MD5), но это значительно усложняет злоумышленнику предварительную генерацию MD5.
источник
crypt()
функции). И так как вам все равно придется извлекать хэш пароля, использование соли для конкретного пользователя не сделает процедуру более дорогой. (Или вы имели в виду создание новой случайной соли дорого? Я так не думаю.) В противном случае +1.С PHP 5.5 (то, что я описываю, доступно даже для более ранних версий, см. Ниже), я хотел бы предложить использовать его новое встроенное решение:
password_hash()
иpassword_verify()
. Он предоставляет несколько опций для достижения необходимого уровня защиты паролем (например, путем указания параметра «стоимость» через$options
массив)вернется
Как вы можете видеть, строка содержит соль, а также стоимость, которая была указана в опциях. Он также содержит используемый алгоритм.
Следовательно, при проверке пароля (например, когда пользователь входит в систему), при использовании дополнительной
password_verify()
функции он извлекает необходимые криптопараметры из самого хэша пароля.Если не указать соль, сгенерированный хэш пароля будет отличаться при каждом вызове,
password_hash()
потому что соль генерируется случайным образом. Поэтому сравнение предыдущего хэша с вновь сгенерированным не удастся даже для правильного пароля.Проверка работает так:
Я надеюсь, что предоставление этих встроенных функций вскоре обеспечит лучшую защиту паролей в случае кражи данных, поскольку это уменьшает количество мыслей, которые программист должен придумать для правильной реализации.
Существует небольшая библиотека (один файл PHP), которая даст вам PHP 5.5
password_hash
в PHP 5.3.7+: https://github.com/ircmaxell/password_compatисточник
password_hash()
иpassword_verify
независимо от того, какой пароль (правильный или нет) я использовал, яЯ не против. Мистер Этвуд писал о силе MD5 по сравнению с радужными столами , и, в основном, с такой длинной солью, как вы сидите довольно (хотя некоторые случайные знаки препинания / числа могут улучшить это).
Вы также можете взглянуть на SHA-1, который, похоже, становится все более популярным в наши дни.
источник
Я хочу добавить:
Для совместимости со старыми системами часто устанавливают ограничение на максимальную длину пароля. Это плохая политика безопасности: если вы устанавливаете ограничение, устанавливайте его только для минимальной длины паролей.
Для восстановления забытого пароля необходимо отправить адрес, по которому пользователь может сменить пароль.
Хеш пароля может быть устаревшим (параметры алгоритма могут обновляться). С помощью функции
password_needs_rehash()
вы можете проверить это.источник