Криптографическая хеш-функция — это детерминированное отображение произвольных входных данных в строку фиксированной длины, называемую хеш-значением или дайджестом. Вход может быть любой длины: текст, файл, поток байтов, структура данных. Выход всегда имеет строго определённый размер, зависящий от конкретного алгоритма (например, 256 бит для SHA-256).
Основная цель таких функций — не восстановление исходных данных, а их одностороннее преобразование с сохранением уникальной «отпечатковой» характеристики.
Одни и те же входные данные всегда дают один и тот же результат:
H(x) = y
H(x) = y (повторно)
Любое отклонение в результате указывает либо на изменение входа, либо на ошибку вычисления.
Хеш должен вычисляться эффективно даже для больших объёмов данных. Это критично для применения в браузерной среде и серверных системах, где обработка происходит в реальном времени.
По значению хеша невозможно восстановить исходные данные:
H(x) = y → найти x практически невозможно
Это свойство обеспечивает односторонний характер функции. Даже зная алгоритм, вычислительные ресурсы не позволяют практически восстановить вход.
Если известно значение x₁, невозможно найти другое x₂ такое, что:
H(x₁) = H(x₂), x₁ ≠ x₂
Это важно для защиты от подмены данных при проверке целостности.
Коллизия — ситуация, когда два разных входа дают одинаковый хеш:
H(x₁) = H(x₂)
Криптографически стойкая функция минимизирует вероятность нахождения таких пар. Теоретически коллизии возможны (из-за конечной длины выхода), но на практике их поиск должен быть вычислительно неосуществим.
Малейшее изменение входных данных приводит к полностью непредсказуемому изменению хеша.
Пример:
"data" → a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
"Data" → 3c6e0b8a9c15224a8228b9a98ca1531d
Разница в одном символе полностью меняет результат.
Криптографические хеш-функции строятся на последовательной обработке данных блоками. Внутреннее состояние проходит через серию нелинейных преобразований, включающих:
Результатом становится фиксированное состояние, которое и формирует выходной дайджест.
На практике используются стандартизированные алгоритмы:
В контексте браузерных технологий наиболее распространён SHA-256 из семейства SHA-2.
В Web Crypto API хеширование реализовано через интерфейс
SubtleCrypto, доступный как crypto.subtle.
Основная операция — digest.
crypto.subtle.digest(algorithm, data)
Где:
algorithm — строка или объект с названием
хеш-функцииdata — бинарные данные (ArrayBuffer,
TypedArray)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)
При проверке вводимое значение хешируется и сравнивается с сохранённым.
Хеши используются для:
Хеширование и шифрование часто путаются, но их цели принципиально различны.
Несмотря на криптографическую стойкость, хеш-функции не являются абсолютной защитой:
Поэтому в современных системах используются усиленные схемы (salt + slow hashing для паролей), хотя Web Crypto API предоставляет именно базовые примитивы.
Web Crypto API предоставляет низкоуровневый доступ к криптографическим операциям без необходимости использования внешних библиотек. Хеширование в этом контексте является фундаментальной операцией, на которой строятся более сложные механизмы:
Хеш-функции в API работают в асинхронном режиме, что соответствует архитектуре браузера и предотвращает блокировку основного потока выполнения.