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_MD2 | MD2 | 128 |
| CALG_MD5 | MD5 | 128 |
| CALG_SHA | SHA-1 | 160 |
| CALG_SHA_256 | SHA-256 | 256 |
| CALG_SHA_384 | SHA-384 | 384 |
| CALG_SHA_512 | SHA-512 | 512 |
На практике наиболее часто используются SHA-256 и SHA-512, так как MD5 и SHA-1 считаются криптографически устаревшими из-за обнаруженных коллизий.
Пример использования
Типичный сценарий работы с CryptHashData включает следующие шаги:
- Открытие криптографического провайдера (CryptAcquireContext).
- Создание хэш-объекта (CryptCreateHash) с указанием алгоритма.
- Один или несколько вызовов CryptHashData для подачи данных.
- Получение итогового хэша (CryptGetHashParam).
- Освобождение ресурсов (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 →