Безопасное хранение паролей
Хешируйте пароли с помощью password_hash и проверяйте их с помощью password_verify
«Безопасное хранение паролей» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Никогда не храните пароли в открытом виде
Хранение паролей в открытом виде означает, что утечка базы данных раскроет пароль каждого пользователя. Всегда храните криптографический хеш — предпочтительно bcrypt, Argon2id или scrypt.
password_hash()
Встроенная функция PHP password_hash() создаёт безопасный хеш со случайной солью, включённой в результат.
<?php
$hash = password_hash("mysecretpassword", PASSWORD_BCRYPT);
// Output: $2y$10$... (includes algorithm, cost, salt, hash)password_verify()
Проверяйте пароль в открытом виде по сохранённому хешу.
<?php
$hash = "$2y$10$abcdef...";
$valid = password_verify("mysecretpassword", $hash);
if ($valid) {
echo "Correct password!";
}Варианты алгоритмов
PHP поддерживает:
PASSWORD_BCRYPT— широко поддерживается, ограничение в 72 байтаPASSWORD_ARGON2I— требует большого объёма памяти (PHP 7.2+)PASSWORD_ARGON2ID— рекомендуется, устойчив к атакам с использованием GPU (PHP 7.3+)PASSWORD_DEFAULT— в настоящее время bcrypt, но в будущих версиях PHP может измениться
Фактор сложности
Фактор сложности определяет, насколько медленно вычисляется хеш. Чем выше сложность, тем медленнее атаки методом перебора. Стандартный фактор сложности bcrypt равен 10.
<?php
$hash = password_hash("secret", PASSWORD_BCRYPT, ["cost" => 12]);
// Cost 12 takes ~0.5s on typical hardware — acceptable for loginpassword_needs_rehash()
После обновления PHP или изменения настроек сложности проверьте, требуется ли обновить существующие хеши.
<?php
if (password_verify($plain, $storedHash) &&
password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$user->update(["password" => password_hash($plain, PASSWORD_DEFAULT)]);
}Фасад Hash в Laravel
Laravel оборачивает password_hash в фасад Hash, по умолчанию используя bcrypt.
<?php
use Illuminate\Support\Facades\Hash;
$hash = Hash::make("mysecretpassword");
$valid = Hash::check("mysecretpassword", $hash); // trueArgon2 в Laravel
Настройте Laravel на использование Argon2id в config/hashing.php.
// config/hashing.php
"driver" => "argon2id",Обработка соли
Современные функции хеширования PHP автоматически добавляют криптографически случайную соль. Никогда не реализуйте собственное добавление соли — легко допустить ошибку.
Перец (секрет на уровне приложения)
Дополнительный секрет (перец), хранящийся вне базы данных, можно смешать с данными перед хешированием. Даже если база данных будет украдена, злоумышленник не сможет выполнить перебор без перца.
Сравнение за постоянное время
password_verify() использует внутри сравнение за постоянное время, предотвращая атаки по времени выполнения. Никогда не сравнивайте хеши с помощью ==.
Итоги
Используйте password_hash() с PASSWORD_DEFAULT или PASSWORD_ARGON2ID. Проверяйте пароли с помощью password_verify(). При необходимости повторно создавайте хеш при входе. Никогда не храните пароли в открытом виде и не используйте MD5/SHA1 для паролей.
Быстрая проверка
Какая функция проверяет пароль по хешу, созданному PHP?
Часто задаваемые вопросы
Урок «Безопасное хранение паролей» бесплатный?
Да — полный текст урока «Безопасное хранение паролей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Безопасное хранение паролей»?
Хешируйте пароли с помощью password_hash и проверяйте их с помощью password_verify Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Безопасное хранение паролей»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Защита от межсайтового скриптинга (XSS)
- SQL-инъекции и параметризованные запросы
- Защита от CSRF
- Безопасное хранение паролей