Хэш — это короткий «отпечаток» данных фиксированной длины. Алгоритм берёт на вход что угодно — файл, строку, архив — и возвращает компактный результат, который удобно хранить, сравнивать и публиковать. Важная особенность: одинаковые входные данные всегда дают один и тот же хэш, а изменение хоть одного бита резко меняет итог (лавинный эффект).
Как работает хэш
Современные криптографические хэш-функции (SHA-2/3, BLAKE2/3) обрабатывают данные блоками, многократно перемешивая биты и пропуская их через нелинейные преобразования. На выходе всегда фиксированная длина: у SHA-256 — 256 бит, у SHA-512 — 512 бит. Это удобно: неважно, прогоняете вы гигабайтный образ диска или три буквы — формат результата одинаковый.
Есть три практических следствия:
- Детерминированность. Один и тот же вход даёт один и тот же digest — удобно и надёжно сверять совпадение.
- Лавинный эффект. Даже минимальная правка данных делает результат неузнаваемым, по виду хэша невозможно «угадать» содержимое.
- Потеря информации. В ходе сжатия произвольного объёма в фиксированную длину часть сведений неизбежно теряется — это важно для понимания, почему «расшифровать» хэш нельзя.
Мини-пример
Хэш не зависит от длины входа, а минимальная правка полностью меняет результат.
SHA-256("abc") → ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-256("hello") → 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
Коротко это можно мыслить так:
строка
→ [хэш-функция]
→ digest
(фиксированной длины).
Почему хэш нельзя «расшифровать»
Здесь часто путают термины. Хеширование — это не шифрование, у него нет ключа и нет обратной функции. Мы не «прячем» данные, а сжимаем их до фиксированной длины, теряя часть информации. Поэтому восстановить исходник из одного лишь digest невозможно.
- Безключевая природа. У хэш-функции нет ключа, которым можно было бы «вернуть» данные обратно.
- Потеря информации. Бесконечное множество входов сжимается в конечное множество выходов фиксированной длины — обратного однозначного перехода не существует.
- Практика атак — это не «дешифр». Злоумышленники ищут предобраз: подбирают любые данные с тем же хэшем (перебор, словари, радужные таблицы). Это обходится дорого и против него помогают соль/pepper и «медленные» функции для паролей.
В повседневной работе хэш — это инструмент сверки и целостности, а не «спрятать и потом раскрыть».
Как хэш сверяют на практике
Хэш не «восстанавливают» до исходных данных — его пересчитывают на стороне проверяющего и сравнивают с эталоном.
Файлы/артефакты
# получаем локальный хэш
calc=$(sha256sum release.iso | awk '{ print $1}')
# берём эталон (из файла/страницы) и сравниваем
[ "$calc" = "EXPECTED_SHA256" ] && echo "OK" || echo "MISMATCH"
Смысл: если хэш совпал, байты идентичны (с высокой практической гарантией).
API/сообщения (аутентифицированная целостность)
Вместо «сырого» хэша используют HMAC с секретным ключом. Получатель пересчитывает HMAC и сравнивает в константное время (чтобы не утекало по таймингу):
import hmac, hashlib
ok = hmac.compare_digest(
hmac.new(key, msg, hashlib.sha256).hexdigest(),
received_hmac_hex
)
Пароли
В базе хранят не «SHA(password)», а результат Argon2id/scrypt/bcrypt вместе с солью/параметрами. При логине сервер:
- извлекает соль и параметры из сохранённой строки;
- пересчитывает алгоритм над присланным паролем;
- сравнивает результат constant-time функцией;
- пускает только при точном совпадении.
Библиотеки прячут детали, но идея одна: пересчёт + сравнение, а не «расшифровка».
Какая хэш-функция считается криптографической
Хорошая криптографическая функция отвечает трём устойчивостям.
В идеале знать по хэшу исходник или подобрать другой вход с тем же digest практически невозможно. Также практически недостижимо найти любые два разных входа с одинаковым хэшем.
- К первому прообразу: по H нельзя найти X, где hash(X)=H.
- Ко второму прообразу: имея X, нельзя найти X₂≠X с тем же хэшем.
- К коллизиям: нельзя подобрать пару X≠Y, где hash(X)=hash(Y).
Эти свойства дополняются детерминированностью, фиксированной длиной и сильным лавинным эффектом — они важны на практике.
Какие алгоритмы использовать сегодня
Подбор зависит от задачи, но опорные варианты простые:
- Целостность/идентификаторы: SHA-256/512, SHA-3, BLAKE2/3.
- Пароли (никогда не “голый SHA”): Argon2id (рекомендуется), scrypt, bcrypt — это медленные PHF/KDF с настройкой времени и памяти.
Для файлов, релизов, артефактов и дедупликации чаще всего достаточно SHA-256/512 или очень быстрого BLAKE3.
Для паролей обязательно используйте медленные функции (Argon2id/scrypt/bcrypt) с уникальной солью и, по ситуации, pepper — так каждый подбор становится дорогим.
Не используйте в новых системах: MD5, SHA-1 — для них показаны практические коллизии.

Пароли: соль, pepper и «медленные» функции
Когда речь о паролях, правильная схема выглядит как аккуратный «конвейер».
Мы делаем одинаковые пароли разными (за счёт соли), добавляем общий секрет приложения (pepper) и намеренно удорожаем вычисление (медленный алгоритм с настройками времени и памяти).
- Salt: уникальная случайная строка для каждой записи, хранится рядом с хэшем. Ломает радужные таблицы и совпадения «user1/user2».
- Pepper: общий секрет приложения (в конфиге/secret store), не хранится в БД, добавляется поверх.
- Алгоритм: Argon2id / scrypt / bcrypt — настраиваем так, чтобы один вызов занимал ~50–200 мс на вашей инфраструктуре.
Итог: логин остаётся быстрым для пользователя, а массовый перебор — дорогим для атакующего.
Хэш, HMAC и цифровая подпись
Здесь важно не перепутать инструмент. Хэш сам по себе отвечает за целостность (байты не испортились), но не доказывает автора. Для проверки подлинности и защиты от подмен берите HMAC, для юридически значимой авторской ответственности — цифровую подпись.
- Нужна целостность файла/артефакта: SHA-256/512 (или SHA-3/BLAKE3).
- Нужна аутентифицированная целостность в API: HMAC-SHA-256.
- Нужна подлинность автора/ненападёжность: цифровая подпись (Ed25519/RSA + хэш).
Коллизии: что важно на практике
Теория подсказывает: коллизии неизбежны, потому что мы сжимаем бесконечное множество входов в конечное множество выходов фиксированной длины. Практика уточняет: для современных функций подобрать коллизию настолько сложно, что для реальных систем это равносильно невозможности.
Исключения: MD5 и SHA-1 — давно сданы в архив, потому что коллизии для них показаны на практике. Если стартуете новый проект и сомневаетесь — SHA-256 вас не подведёт.
Заключение
Хэш — однонаправленный «отпечаток» данных: он помогает сверять и гарантировать целостность, но не служит способом «спрятать и восстановить». «Расшифровать хэш» нельзя: ключа и обратной функции нет, а практические атаки — это всегда подбор соответствий.
В новых проектах для целостности используйте SHA-256/512, SHA-3 или BLAKE3, для паролей — только Argon2id/scrypt/bcrypt с уникальной солью и, при необходимости, pepper, настроив стоимость вычислений. Для аутентифицированной целостности берите HMAC, для подлинности — цифровые подписи.
