Глоссарий
Что такое хеширование паролей? Безопасное хранение паролей через одностороннее преобразование
Хеширование паролей хранит пароль как необратимое одностороннее преобразование. Чем оно отличается от шифрования, почему MD5/SHA-256 небезопасны и правильный ответ: соль на каждого пользователя плюс медленный хеш — bcrypt, Argon2 или scrypt.
«Никогда не храните пароль в базе данных как есть» — так как же его хранить? Ответ — хеширование. Вот как оно работает и ключевые моменты для безопасного применения (без шагов атаки).
Хеширование ≠ шифрование
Их путают, но цели противоположны. Шифрование — «обратимо с ключом, чтобы прочитать позже». Хеширование — «одностороннее, обратить нельзя». Пароль — это информация, которую даже оператору не нужно читать обратно, поэтому намеренно необратимый хеш — правильный выбор.
Шифрование (обратимое)
открытый текст ⇄ шифртекст. ключ обращает. для данных, которые читают обратно
Хеширование (одностороннее)
пароль → хеш. обратить нельзя. для хранения паролей
При входе вы проверяете: «захешировать введённый пароль тем же способом и посмотреть, совпадает ли он с сохранённым хешем.» Восстанавливать оригинал вам никогда не нужно.
Почему «чистых MD5/SHA-256» недостаточно
MD5 и SHA-256 — быстрые хеши. В других местах это полезное свойство, но слабость для хранения паролей: атакующий может вычислять огромное число вариантов в секунду против утёкшего хеша.
- Радужные таблицы: гигантская предвычисленная таблица «распространённый пароль → его хеш». С чистым хешем совпадение находится простым поиском.
- Перебор: чем быстрее хеш, тем больше вариантов за единицу времени — то есть тем легче взломать.
Два решения
Добавьте соль (разное значение для каждого пользователя)
Перед хешированием подмешайте случайное значение, разное для каждого пользователя (соль). Теперь один и тот же пароль хранится по-разному у всех, что побеждает радужные таблицы и не даёт одному прогону взлома охватить повторно используемые пароли между аккаунтами.
Используйте намеренно медленный, специально созданный хеш
bcrypt / Argon2 / scrypt позволяют сделать вычисление намеренно дорогим (параметр стоимости). Замедление, незаметное для одного легитимного входа, снижает перебор атакующего до непрактичной скорости. Соль встроена и в них.
Мнение этого сайта: не собирайте это сами
«Уж MD5 плюс соль — наверняка достаточно?» — это классическая ловушка. Безопасное хранение паролей зависит ещё и от генерации и хранения соли, настройки стоимости и обработки временных различий. Вместо того чтобы собирать это самому, опирайтесь на официальную функцию паролей вашего языка/фреймворка (большинство под капотом используют bcrypt/Argon2). Для новых систем сделайте Argon2id первым выбором.
Читать дальше
- Глоссарий: что такое соль («приправа» на каждого пользователя, побеждающая атаки на повтор)
- Обучение: как безопасно хранить пароли (хеширование + соль на практике)
- Основы: правильное хранение паролей (хватит открытого текста) / выбор менеджера паролей
FAQ
QЧем хеширование отличается от шифрования?
Шифрование обратимо: с ключом можно расшифровать данные обратно, что и нужно для данных, которые вы будете читать снова. Хеширование одностороннее — его нельзя обратить. Пароль на самом деле не нужно читать обратно, даже вам самому, поэтому намеренно необратимый хеш подходит. Даже если базу данных украдут, вытащить из хешей исходные пароли напрямую нельзя.
QДостаточно ли безопасно хеширование с MD5 или SHA-256?
Нет, само по себе нет. MD5/SHA-256 — «быстрые» хеши, поэтому атакующий может проверять огромное число вариантов в секунду, и распространённые пароли падают перед перебором или радужными таблицами (предвычисленными таблицами поиска). Чтобы сделать это безопасным, добавьте «соль» на каждого пользователя и используйте намеренно медленный, специально созданный хеш (bcrypt, Argon2 или scrypt).
QЧто именно мне использовать?
Для новых систем Argon2 (особенно Argon2id) — первый выбор, а bcrypt или scrypt — надёжные альтернативы. Все они встраивают соль и настраиваемый фактор стоимости в свою конструкцию. Вместо того чтобы вручную собирать MD5+соль, используйте эти стандартные реализации (официальные функции вашего языка/фреймворка) — это безопаснее и надёжнее.