- 17 октября 2026
- 9 минут
- 5
Статью подготовили специалисты образовательного сервиса Zaochnik.
Хеширование
Хеширование — это процесс преобразования данных произвольного размера в фиксированную последовательность символов с помощью специализированного алгоритма. Результат этого преобразования называют хешем, или дайджестом. Основная цель хеширования — обеспечить компактное и однозначное представление данных для их проверки, индексации и защиты.
Хеш-функция — это алгоритм, который преобразует массив данных в последовательность букв и цифр фиксированной длины.
Понятие хеш-функции
Хеш-функция принимает на вход данные произвольного объема и возвращает строку фиксированной длины. Например, SHA-1 всегда выдает строку длиной 40 шестнадцатеричных символов, независимо от входа. Важно, что при одинаковом входном наборе байт результат всегда совпадает. Это обеспечивает стабильность и предсказуемость хеширования для любых данных.
Существует понятие криптостойкой хеш-функции. Криптостойкость требует двух условий: невозможность вычислить исходные данные по хешу и минимизация вероятности коллизий, то есть случаев одинакового хеша для разных входных данных. На практике абсолютная криптостойкость недостижима, поскольку теоретически восстановить данные можно при бесконечных ресурсах времени и вычислительной мощности. Однако современные алгоритмы, такие как SHA-256, обладают практической криптостойкостью и сопротивляются известным способам взлома.
Пример практической проверки разницы хешей при незначительном изменении входа демонстрирует алгоритм SHA-1, представленный в SQL-запросах. Для строк «Mary» и «Marry» вычисляются следующие хеши:
- SHA1('Mary') = 94f85995c7492eec546c321821aa4beca9a3e2b1
- SHA1('Marry') = 3984efca9e07e42e23a78a9efd4b9ec851050792
Различие совпадает не только в символах, но и в битовом представлении результата. Это показывает устойчивость к небольшим изменениям. Аналогично, смена регистра символов в строке «MARY» дает хеш «68ba729f955f31c9b85b148daf9971f3f04434d9», который не коррелирует с предыдущими вариантами, что указывает на чувствительность к регистру.
Результаты применения SHA1 к строкам 'Mary', 'Marry' и 'MARY' показывают, что даже минимальные изменения во входных данных приводят к качественным изменениям хеша.
Наиболее часто используемые алгоритмы: MD5 выдает 128-битный хеш (32 символа в шестнадцатеричной записи), SHA-1 — 160 бит, SHA-256 — 256 бит. Алгоритмы LM и NTLM используются преимущественно в системах Windows для аутентификации. SHA-1 с середины 2010-х признан недостаточно защищённым, что вызвало переход к SHA-256 и выше.
Механика хеширования паролей
Для хранения паролей в базе данных хеширование — обязательный уровень безопасности. При регистрации пользователь передает сервису пароль в открытом виде, но база сохраняет только хеш. При попытке входа пароль повторно хешируется, и новый хеш сравнивается с сохранённым. Это исключает хранение паролей в открытом виде.
Невозможность восстановления пароля по хешу обеспечивает дополнительную защиту. Однако для паролей низкой сложности существуют готовые словари и радужные таблицы, которые сопоставляют хеши и вероятные пароли. Для предотвращения взлома паролей используют дополнительные техники:
- Соль — случайный набор данных, добавляемый к паролю перед хешированием. Позволяет уникализировать хеш и исключить пользу от радужных таблиц.
- Переходы — повторное хеширование несколько тысяч раз для усложнения вычисления хеша.
- Использование современных алгоритмов типа bcrypt, scrypt или Argon2, которые требуют значительных ресурсов CPU и памяти.
Минимальные требования к паролям современных сервисов обычно включают длину не менее 6 символов, обязательное использование цифр, строчных и прописных букв. Из-за того, что простые пароли легко угадываются по базам, соблюдение этих требований снижает риск компрометации.
Если сервис восстанавливает старые пароли напрямую, это указывает на отсутствие хеширования и нарушение базовых правил безопасности.
Другие области применения хеширования
Хеш используется не только для паролей. Он применяется для проверки целостности данных при передаче и хранении. Например, для файлов медиаконтента, документов или программных пакетов. Размер хеша фиксирован и независим от размера исходника, что упрощает сравнение и минимизирует затраты на хранение.
Для поиска запрещённого или незаконного контента в облачных хранилищах хеши этого контента заносятся в базы данных. Сканеры автоматически сверяют хеши клиентских файлов с запрещёнными. Это позволяет контролировать распространение информации без просмотра оригинальных файлов.
В антивирусных базах вместо хранения текстов известных вирусов хранятся хеши характерных фрагментов. Это обеспечивает быструю и точную идентификацию угроз. При обнаружении совпадения хеша времени поиска и проверки значительно уменьшаются, ускоряя реакцию системы.
Для защиты сообщений и файлов от фальсификации применяется двусторонняя проверка. Отправитель рассчитывает хеш перед отправкой, получатель — после. При совпадении хешей факт изменения отсутствует. Из-за свойства лавинного эффекта изменение даже одного байта полностью меняет итоговый хеш. В результате атаки на целостность практически невозможны.
Типичные ошибки и ограничения
Подмена данных при хешировании невозможна для качественных алгоритмов, но может произойти при использовании устаревших методов типа MD5, которые подвержены коллизиям. Коллизия — ситуация, когда разные входные данные выдают одинаковый хеш. Для MD5 вероятность коллизий выше, что представляет угрозу безопасности. SHA-1 также устарел, поэтому современные проекты используют SHA-256 и выше.
Производительность хеширования важна при обработке больших объемов данных. SHA-256 примерно в 2,5 раза медленнее SHA-1 на одном ядре. Для ресурсоёмких задач применяют аппаратное ускорение или специализированные алгоритмы.
При неправильном использовании паролей без соли и повторного хеширования защита снижается, даже если алгоритм стойкий. Это уязвимость, используемая злоумышленниками.
Таблица: сравнение популярных хеш-алгоритмов
Ниже представлена таблица, которая сравнивает ключевые характеристики широко применяемых алгоритмов.
| Алгоритм | Длина хеша (бит) | Стойкость к коллизиям | Скорость |
|---|---|---|---|
| MD5 | 128 | Низкая (коллизии известны с 2004) | Очень высокая |
| SHA-1 | 160 | Средняя (коллизии найдены в 2017) | Высокая |
| SHA-256 | 256 | Высокая (на данный момент неизвестны) | Средняя |
| bcrypt | 192 (вариативно) | Очень высокая (соль и замедление) | Низкая (специально замедлен) |
| Argon2 | 256 (настраиваемо) | Очень высокая (память и времязависмость) | Низкая (за счет ресурсоемкости) |
Таблица показывает, что несмотря на высокую скорость MD5, его применение для безопасности исключено. SHA-256 и современные алгоритмы обеспечивают необходимую защиту, но требуют больших ресурсов. bcrypt и Argon2 специально замедлены для увеличения стойкости к перебору.
Матрица условий выбора метода хеширования
Выбор подходящего алгоритма хеширования зависит от требований к безопасности и производительности. Ниже приведена матрица соответствия.
| Ситуация | Рекомендуемый алгоритм | Ограничения и минусы |
|---|---|---|
| Быстрая проверка целостности больших файлов | SHA-256 | Средняя скорость, ограниченная криптостойкость |
| Хранение паролей с высокой безопасностью | Argon2, bcrypt | Высокие затраты ресурсов и время обработки |
| Наследственные системы с ограничениями по скорости | SHA-1 (до замены) | Уязвим к коллизиям, не для новых систем |
| Кеширование и индексация | MD5 | Устарел для криптографической защиты, допустим в некритичных задачах |
Рекомендуется использовать современные алгоритмы с солями и повторным хешированием для паролей, а для проверки целостности больших объемов данных — надежные и быстрые алгоритмы. При ограничениях по вычислительным ресурсам следует избегать алгоритмов с подтвержденными уязвимостями.