"Соленые" хеши: надежная защита паролей и методы взлома

"Соленые" хеши: надежная защита паролей и методы взлома

Узнайте, как работают популярные алгоритмы (MD5, SHA, bcrypt, Argon2) и почему даже «посоленные» хеши могут быть взломаны.

Хеширование с добавлением соли — один из самых распространенных способов защиты паролей в веб-приложениях и других IT-системах. Благодаря соли (случайной строке, добавляемой к паролю перед его хешированием), злоумышленникам сложнее воспользоваться радужными таблицами (rainbow tables) и массово взламывать пароли. Тем не менее, даже «посоленный» хеш далеко не всегда обеспечивает абсолютную безопасность. В этой статье мы подробно рассмотрим, почему так происходит, какие алгоритмы хеширования чаще всего используются, какие методы помогают взламывать даже «посоленные» хеши и как этому противостоять.

Принципы хеширования и роль соли

Хеширование — это одностороннее преобразование входных данных (пароля) в фикcированную строку символов. Добавление соли — простой и эффективный способ защититься от готовых таблиц соответствия «пароль-хеш» и массовых атак. Соль «разбавляет» исходные данные, так что два одинаковых пароля, «посоленные» разными строками, получают разные хеши.

Как работает хеш с солью

Для наглядности рассмотрим упрощенный процесс хеширования с солью:

  1. Пользователь вводит пароль: my_secret.
  2. Приложение генерирует случайную строку (соль): XY12ab.
  3. К строке пароля добавляется соль: my_secretXY12ab.
  4. Полученный результат пропускается через алгоритм хеширования, например, SHA-256, Argon2 и т.д.
  5. Соль и полученный хеш хранятся в базе данных (но «перец», если используется, держится отдельно).

Злоумышленнику, получившему базу с хешами, придется для каждого хеша брать соответствующую соль и перебирать возможные пароли. Это усложняет атаку, но не делает ее невозможной — все зависит от достаточности вычислительных ресурсов и сложности самих паролей.

Обзор популярных алгоритмов хеширования

Существует множество алгоритмов хеширования, от устаревших до современных. Ниже представлен краткий обзор тех, что чаще всего встречаются в популярных приложениях и сервисах.

MD5

Устаревший алгоритм хеширования. Длина хеша — 128 бит (32 символа в шестнадцатеричной форме). Широко использовался в прошлом, однако в настоящее время считается небезопасным из-за возможности коллизий и быстрого перебора на современных GPU.

SHA-1

Тоже считается устаревшим алгоритмом, хотя и более надежным, чем MD5. Длина хеша — 160 бит (40 символов в hex). Несмотря на то, что для SHA-1 найдены практические коллизии, он все еще используется в некоторых старых системах. Однако для защиты паролей на сегодняшний день рекомендуется переходить на более надежные решения.

SHA-256 и SHA-512

Более современные представители семейства SHA-2. Длина хеша может составлять 256 или 512 бит. Они более устойчивы к коллизиям, чем SHA-1 и MD5, но при этом всё ещё относительно быстрые на современных процессорах и GPU, что позволяет эффективно выполнять атаки перебором. Как правило, SHA-256 или SHA-512 применяют в сочетании с большим количеством итераций.

bcrypt

bcrypt — алгоритм на основе шифра Blowfish. Он был создан специально для хеширования паролей, имеет настраиваемый параметр «cost», который задаёт число раундов хеширования. Основная цель — усложнить перебор паролей, сделав процесс хеширования максимально тяжёлым для злоумышленников. bcrypt популярен в таких приложениях, как WordPress (в некоторых плагинах), Ruby on Rails и других платформах.

PBKDF2

Password-Based Key Derivation Function 2 — стандартная криптографическая функция, использующая большое количество итераций (задается параметр «iterations») и соль для усложнения перебора. PBKDF2 поддерживают многие библиотеки по информационной безопасности, в том числе в .NET и OpenSSL. Часто применяется в корпоративных решениях, банках и правительственных организациях.

Argon2

Один из самых современных и эффективных алгоритмов, победивший в конкурсе по выбору нового стандарта по хешированию паролей (Password Hashing Competition). Argon2 обладает гибкими настройками: позволяет регулировать время исполнения, объем используемой памяти и параллелизм вычислений, что делает его одним из самых сложных для перебора.

Какой алгоритм используют популярные приложения

Многие крупные сервисы и платформы осознают важность безопасного хеширования и внедряют современные алгоритмы. Примеры:

  • WordPress. С недавних версий по умолчанию использует «portable PHP password hashing» (включая MD5 с солью для старых версий), а также поддерживает более безопасные методы вроде bcrypt через плагины и обновления.
  • Drupal. Использует собственный фреймворк для хеширования паролей с поддержкой изменения числа итераций. Начиная с Drupal 7, задействован SHA-512, а также есть возможность установки bcrypt.
  • Django (Python). По умолчанию применяет PBKDF2 с SHA256, в то же время поддерживая bcrypt и Argon2.
  • Laravel (PHP). Использует bcrypt и Argon2 по умолчанию, в зависимости от версии.
  • Ruby on Rails. Для аутентификации (например, в библиотеке Devise) по умолчанию используется bcrypt с динамическим параметром «cost».

Сервисы и инструменты для взлома «посоленных» хешей

Существуют как локальные приложения для перебора хешей, так и онлайн-сервисы, специализирующиеся на подборе паролей, даже с учетом соли. Ниже — самые известные решения:

Hashcat

Один из самых популярных инструментов. Работает под Windows, Linux и macOS. Поддерживает «гибридные» атаки, перебор по словарям, правила, маски и т.д. Умеет использовать мощности GPU (NVIDIA, AMD). Поддерживает широкий спектр алгоритмов: MD5, SHA-1, SHA-256, bcrypt, PBKDF2, Argon2 и другие.

John the Ripper

Универсальный кроссплатформенный инструмент со множеством режимов перебора (словарная атака, brute force, гибридная атака и т.д.). John the Ripper поддерживает большинство популярных алгоритмов, включая «посоленные» хеши Unix и Windows NTLM.

Online-сервисы

  • CrackStation. Позволяет ввести известный хеш (MD5, SHA-1, SHA-256, SHA-512 и др.) и пытается подобрать оригинальный текст. Однако, если соль уникальна и достаточно длинна, эффективность снижается.
  • Hashes.org. Сообщество специалистов по взлому хешей, где можно загрузить свои «образцы» и ждать, пока кто-то из участников попытается их взломать.

Все эти сервисы и инструменты в большинстве случаев требуют либо отдельного указания соли, либо они автоматически анализируют формат, если речь идет о известных форматах (например, хеши Unix, где соль сохраняется в начале). Чем более редкий или сложный формат хранения пароля, тем сложнее автоматизировать его взлом.

Почему «посоленный» хеш можно взломать

Наличие соли затрудняет процесс взлома, но не делает систему неуязвимой. Причины уязвимостей:

  • Доступ к базе данных и к соли. Как правило, соли хранятся прямо в базе. Если злоумышленник получил дамп, он будет знать не только хеши, но и их соли.
  • Слабые пароли. Короткие, простые комбинации («123456», «password», «qwerty») взламываются очень быстро методом перебора. Даже большая соль не спасет, если пользовательский пароль тривиален.
  • Низкое количество итераций. Использование современных алгоритмов, но с маленьким числом раундов (итераций), даёт злоумышленнику возможность производить миллионы проверок в секунду на мощном оборудовании.
  • Отсутствие «перца». «Перец» (pepper) — дополнительная секретная строка, хранящаяся отдельно от базы. Если перец не используется, взлом становится проще: вся необходимая информация для перебора есть в базе.

Лучшие практики для безопасного хеширования

Чтобы минимизировать риск взлома «посоленных» хешей, рекомендуется придерживаться следующих мер:

  • Выбирать современные алгоритмы (bcrypt, PBKDF2, Argon2). Они обеспечивают гибкие настройки и усложняют перебор.
  • Настраивать количество итераций или параметр «cost». Чем больше итераций, тем труднее взломать пароль за счет роста времени вычисления.
  • Генерировать случайные и достаточно длинные соли. Это устраняет возможность коллизий и снижают вероятность перебора соли.
  • Использовать «перец» (pepper). Храните его в отдельном месте (конфигурационный файл, аппаратный модуль безопасности), чтобы в случае утечки БД злоумышленник не смог легко восстановить пароли.
  • Требовать сложные пароли от пользователей. Внедряйте политику длины, разнообразия символов и периодической смены паролей.
  • Регулярно обновлять системы и проводить аудит безопасности. Устаревшее ПО и неактуальные криптобиблиотеки могут содержать уязвимости.

Заключение

"Соленые" хеши являются неотъемлемым компонентом надежной защиты паролей, однако их эффективность зависит от комплекса мер. Использование устаревших алгоритмов, недостаточного количества итераций или слабых паролей сводит на нет преимущества соли. Для обеспечения максимальной безопасности рекомендуется применять современные криптографические алгоритмы, такие как bcrypt, PBKDF2 или Argon2, дополнять соль "перцем", устанавливать высокий параметр "cost" или число итераций, а также регулярно проводить аудит инфраструктуры и обновлять программное обеспечение. Только комплексный подход, включающий все эти меры, способен существенно усложнить задачу злоумышленнику и гарантировать сохранность конфиденциальных данных.

Все еще проверяете уязвимости после сборки ПО?

8 июля CICADA8 покажет, как делать это до CI/CD — быстро, чётко, безопасно.

Реклама. 18+. Рекламодатель ООО «АЙТИПИ Сервисы», ИНН 7708719821