Безопасность PHP: Почему использование функции md5() для хэширования паролей считается небезопасным в 2026 году?
Функция md5() была разработана в 1991 году как криптографическая хэш-функция, однако к 2026 году её использование для хэширования паролей считается грубейшей ошибкой безопасности. Разберём подробно, почему это так.
**1. Скорость вычисления — главная уязвимость**
MD5 спроектирована для быстрого вычисления хэшей, что критично при работе с файлами и контрольными суммами. Но для паролей это катастрофа: современные GPU способны перебирать миллиарды MD5-хэшей в секунду. Например, видеокарта RTX 4090 вычисляет около 160 миллиардов MD5-хэшей в секунду, что делает брутфорс-атаки тривиальными.
**2. Rainbow-таблицы**
Существуют заранее вычисленные базы данных пар «пароль → MD5-хэш», содержащие миллиарды записей. Злоумышленник, получив базу с MD5-хэшами паролей, может мгновенно найти соответствие для большинства слабых и средних паролей. Даже добавление соли (salt) вручную не решает проблему полностью, если реализовано неправильно.
**3. Коллизии**
Учёные доказали, что MD5 подвержена коллизиям — двум разным входным данным можно подобрать одинаковый хэш. Это открывает возможности для атак на уровне аутентификации.
**4. Нет встроенного механизма работы с солью**
PHP-разработчики нередко писали конструкции вида `md5($password)` или `md5($salt . $password)`, реализуя соль вручную. Это создаёт риск ошибок реализации, слабой соли или её повторного использования.
**Что использовать вместо md5() в 2026 году?**
PHP предоставляет встроенные функции, специально разработанные для безопасного хэширования паролей:
— **`password_hash($password, PASSWORD_BCRYPT)`** — использует алгоритм bcrypt с автоматической генерацией соли и настраиваемым параметром стоимости (cost), который замедляет вычисление.
— **`password_hash($password, PASSWORD_ARGON2ID)`** — алгоритм Argon2id, победитель Password Hashing Competition 2015 года. Устойчив к GPU-атакам благодаря высокому потреблению памяти.
— **`password_verify($password, $hash)`** — безопасная проверка пароля без риска тайминг-атак.
**Пример безопасного кода:**
php
// Хэширование
$hash = password_hash($password, PASSWORD_ARGON2ID, [
‘memory_cost’ => 65536,
‘time_cost’ => 4,
‘threads’ => 2
]);
// Проверка
if (password_verify($inputPassword, $hash)) {
// Успешная аутентификация
}
**Итог:** Использование md5() для паролей в 2026 году — это не просто устаревшая практика, а прямая угроза безопасности пользователей. Переходите на password_hash() с Argon2id или bcrypt, и никогда не реализуйте криптографию вручную.
