Открыть сервис

CryptHashData

CryptHashData — это функция из набора криптографических API (CryptoAPI) корпорации Microsoft, предназначенная для последовательного добавления данных в хэш-объект. Она используется в процессе вычисления хэш-суммы (дайджеста) произвольного объёма информации и является частью стандартного интерфейса для работы с криптографическими алгоритмами в операционных системах семейства Windows.

История и контекст

CryptoAPI был представлен Microsoft в 1996 году как часть платформы Windows NT 4.0 и затем включён в состав Windows 95 OSR2. Разработка этого набора функций была вызвана необходимостью предоставления разработчикам стандартизированного и безопасного интерфейса для выполнения криптографических операций без необходимости встраивать в приложения сторонние библиотеки. Функция CryptHashData стала частью этого API с момента его появления и остаётся актуальной в последующих версиях Windows, включая Windows 10 и Windows 11.

В 2000-х годах Microsoft выпустила обновлённый криптографический интерфейс — Cryptography API: Next Generation (CNG), который постепенно вытесняет классический CryptoAPI. Однако функция CryptHashData продолжает поддерживаться в режиме совместимости и используется в устаревших приложениях, а также в некоторых сценариях, где требуется работа с ранними версиями Windows.

Назначение и принцип работы

CryptHashData предназначена для подачи данных на вход алгоритму хэширования, который уже был инициализирован через функцию CryptCreateHash. Хэш-объект, создаваемый перед вызовом CryptHashData, содержит в себе контекст выбранного алгоритма (например, MD5, SHA-1, SHA-256) и текущее состояние вычислений.

Функция не вычисляет итоговый хэш сама — она лишь добавляет очередной блок данных к уже обработанным. Завершение вычисления и получение дайджеста выполняется функцией CryptGetHashParam. Такой подход позволяет обрабатывать данные частями (например, при чтении больших файлов или потоковых данных), не загружая их целиком в оперативную память.

Сигнатура функции

``c BOOL CryptHashData( HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags ); ``

Параметры:

  • hHash — дескриптор хэш-объекта, полученный от CryptCreateHash.
  • pbDataуказатель на буфер с данными для хэширования.
  • dwDataLen — длина данных в байтах.
  • dwFlags — флаги, обычно устанавливается в 0. В некоторых версиях API может использоваться для указания особых режимов, но в классическом CryptoAPI этот параметр зарезервирован и должен быть нулевым.

Возвращаемое значение: TRUE в случае успеха, FALSE — при ошибке. Код ошибки можно получить через GetLastError.

Алгоритмы хэширования

Функция CryptHashData работает с любым алгоритмом, который был указан при создании хэш-объекта. В классическом CryptoAPI поддерживаются следующие алгоритмы (идентификаторы из wincrypt.h):

ИдентификаторАлгоритмДлина дайджеста (бит)
CALG_MD2MD2128
CALG_MD5MD5128
CALG_SHASHA-1160
CALG_SHA_256SHA-256256
CALG_SHA_384SHA-384384
CALG_SHA_512SHA-512512

На практике наиболее часто используются SHA-256 и SHA-512, так как MD5 и SHA-1 считаются криптографически устаревшими из-за обнаруженных коллизий.

Пример использования

Типичный сценарий работы с CryptHashData включает следующие шаги:

  1. Открытие криптографического провайдера (CryptAcquireContext).
  2. Создание хэш-объекта (CryptCreateHash) с указанием алгоритма.
  3. Один или несколько вызовов CryptHashData для подачи данных.
  4. Получение итогового хэша (CryptGetHashParam).
  5. Освобождение ресурсов (CryptDestroyHash, CryptReleaseContext).

Пример на языке C:

```c HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; BYTE rgbData[] = "Пример данных для хэширования"; DWORD cbData = sizeof(rgbData) - 1; // без нуль-терминатора BYTE rgbHash[32]; DWORD cbHash = sizeof(rgbHash);

// Открытие провайдера CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);

// Создание хэш-объекта SHA-256 CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash);

// Хэширование данных CryptHashData(hHash, rgbData, cbData, 0);

// Получение дайджеста CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0);

// Очистка CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); ```

Ограничения и особенности

  • Безопасность. Функция сама по себе не обеспечивает защиту от атак по сторонним каналам (timing attacks). В современных приложениях рекомендуется использовать CNG, где такие атаки учитываются на уровне реализации.
  • Потокобезопасность. Классический CryptoAPI не гарантирует потокобезопасность. Одновременное использование одного хэш-объекта из нескольких потоков может привести к некорректным результатам.
  • Поддержка. В Windows 10 и 11 функция CryptHashData доступна, но Microsoft рекомендует для новых разработок использовать CNG (функции BCryptHashData, NCryptHashData).
  • Завершение хэширования. После вызова CryptGetHashParam с флагом HP_HASHVAL хэш-объект сбрасывается и может быть повторно использован для хэширования новых данных (без необходимости создавать новый объект).

Применение

CryptHashData используется в широком спектре приложений:

  • Проверка целостности файлов. Вычисление контрольных сумм для сравнения с эталонными значениями.
  • Хранение паролей. Хэширование паролей перед сохранением в базу данных (часто в комбинации с солью).
  • Цифровые подписи. Как часть процесса создания и проверки подписей (совместно с CryptSignHash).
  • Протоколы аутентификации. В реализациях SSL/TLS, Kerberos и других протоколов, встроенных в Windows.

Критика и альтернативы

Основной недостаток CryptHashData — привязка к архитектуре CryptoAPI, которая считается устаревшей. Разработчики критикуют её за сложность управления контекстами, зависимость от криптографических провайдеров (CSP) и отсутствие поддержки современных алгоритмов, таких как SHA-3 или BLAKE2. Вместо неё рекомендуется использовать:

  • BCryptHashData (CNG) — более современная и безопасная реализация.
  • NCryptHashData (CNG) — для работы с ключами, хранящимися в аппаратных модулях безопасности (TPM, смарт-карты).
  • Сторонние библиотеки: OpenSSL, libsodium, Botan.

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

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →