Понятие криптографической хеш-функции

Криптографическая хеш-функция — это детерминированное отображение произвольных входных данных в строку фиксированной длины, называемую хеш-значением или дайджестом. Вход может быть любой длины: текст, файл, поток байтов, структура данных. Выход всегда имеет строго определённый размер, зависящий от конкретного алгоритма (например, 256 бит для SHA-256).

Основная цель таких функций — не восстановление исходных данных, а их одностороннее преобразование с сохранением уникальной «отпечатковой» характеристики.


Детерминированность

Одни и те же входные данные всегда дают один и тот же результат:

H(x) = y
H(x) = y (повторно)

Любое отклонение в результате указывает либо на изменение входа, либо на ошибку вычисления.


Быстрота вычисления

Хеш должен вычисляться эффективно даже для больших объёмов данных. Это критично для применения в браузерной среде и серверных системах, где обработка происходит в реальном времени.


Необратимость (preimage resistance)

По значению хеша невозможно восстановить исходные данные:

H(x) = y  →  найти x практически невозможно

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


Устойчивость к поиску второго прообраза (second preimage resistance)

Если известно значение x₁, невозможно найти другое x₂ такое, что:

H(x₁) = H(x₂), x₁ ≠ x₂

Это важно для защиты от подмены данных при проверке целостности.


Устойчивость к коллизиям

Коллизия — ситуация, когда два разных входа дают одинаковый хеш:

H(x₁) = H(x₂)

Криптографически стойкая функция минимизирует вероятность нахождения таких пар. Теоретически коллизии возможны (из-за конечной длины выхода), но на практике их поиск должен быть вычислительно неосуществим.


Эффект лавины (avalanche effect)

Малейшее изменение входных данных приводит к полностью непредсказуемому изменению хеша.

Пример:

"data"   →  a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
"Data"   →  3c6e0b8a9c15224a8228b9a98ca1531d

Разница в одном символе полностью меняет результат.


Структурная идея хеширования

Криптографические хеш-функции строятся на последовательной обработке данных блоками. Внутреннее состояние проходит через серию нелинейных преобразований, включающих:

  • побитовые операции (AND, OR, XOR)
  • циклические сдвиги
  • модульные сложения
  • нелинейные функции сжатия

Результатом становится фиксированное состояние, которое и формирует выходной дайджест.


Семейство алгоритмов

На практике используются стандартизированные алгоритмы:

  • SHA-1 (устаревший, уязвим к коллизиям)
  • SHA-256
  • SHA-384
  • SHA-512
  • SHA-3 (основан на другой конструкции — Keccak)

В контексте браузерных технологий наиболее распространён SHA-256 из семейства SHA-2.


Криптографическая хеш-функция в Web Crypto API

В Web Crypto API хеширование реализовано через интерфейс SubtleCrypto, доступный как crypto.subtle.

Основная операция — digest.

crypto.subtle.digest(algorithm, data)

Где:

  • algorithm — строка или объект с названием хеш-функции
  • data — бинарные данные (ArrayBuffer, TypedArray)

Пример SHA-256

const encoder = new TextEncoder();
const data = encoder.encode("example text");

const hashBuffer = await crypto.subtle.digest("SHA-256", data);

Результат — ArrayBuffer, содержащий бинарный хеш.


Преобразование в читаемый вид

Хеш обычно представляют в шестнадцатеричном формате:

const hashArray = Array.from(new Uint8Array(hashBuffer));

const hashHex = hashArray
  .map(b => b.toString(16).padStart(2, "0"))
  .join("");

Роль хеш-функций в криптографии

Проверка целостности данных

Хеш используется для контроля изменений:

  • исходный файл → хеш сохраняется
  • при проверке файл хешируется повторно
  • сравнение значений выявляет изменения

Цифровые подписи

Хеш не подписывается напрямую как большой объём данных, вместо этого:

message → hash → подпись

Это ускоряет операции и повышает безопасность.


Хранение паролей

Пароли не сохраняются в исходном виде. Вместо этого хранится их хеш:

password → H(password)

При проверке вводимое значение хешируется и сравнивается с сохранённым.


Адресация и идентификация данных

Хеши используются для:

  • идентификаторов блоков в блокчейне
  • адресации контента (content-addressable storage)
  • дедупликации файлов

Отличие от шифрования

Хеширование и шифрование часто путаются, но их цели принципиально различны.

Шифрование:

  • двустороннее преобразование
  • наличие ключа
  • восстановление исходных данных возможно

Хеширование:

  • одностороннее преобразование
  • ключ не используется
  • восстановление невозможно в практическом смысле

Ограничения и практические аспекты

Несмотря на криптографическую стойкость, хеш-функции не являются абсолютной защитой:

  • атаки перебора возможны при слабых входных данных
  • утечки словарей паролей позволяют использовать радужные таблицы
  • устаревшие алгоритмы (MD5, SHA-1) уязвимы к коллизиям

Поэтому в современных системах используются усиленные схемы (salt + slow hashing для паролей), хотя Web Crypto API предоставляет именно базовые примитивы.


Связь с Web Crypto API

Web Crypto API предоставляет низкоуровневый доступ к криптографическим операциям без необходимости использования внешних библиотек. Хеширование в этом контексте является фундаментальной операцией, на которой строятся более сложные механизмы:

  • HMAC (ключевой хешированный код)
  • цифровые подписи
  • протоколы аутентификации
  • безопасные токены

Хеш-функции в API работают в асинхронном режиме, что соответствует архитектуре браузера и предотвращает блокировку основного потока выполнения.