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

CryptSignHash

CryptSignHash — это функция, входящая в состав криптографического интерфейса прикладного программирования (API) Microsoft CryptoAPI (Cryptographic Application Programming Interface), предназначенная для создания цифровой подписи заданного хеша. Функция является частью набора криптографических примитивов, предоставляемых операционными системами семейства Windows для обеспечения целостности, аутентичности и неотказуемости данных.

Назначение и область применения

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

Технические аспекты

Параметры функции

Функция CryptSignHash имеет следующую сигнатуру (в упрощённом виде):

``c BOOL CryptSignHash( HCRYPTHASH hHash, // Хэндл хеш-объекта, который нужно подписать DWORD dwKeySpec, // Идентификатор ключа подписи (AT_SIGNATURE) LPCTSTR sDescription, // Описание подписи (обычно NULL) DWORD dwFlags, // Флаги (обычно 0) BYTE pbSignature, // Буфер для подписи DWORD pdwSigLen // Размер буфера подписи ); ``

  • hHash: Хэндл, полученный после вызова CryptCreateHash и CryptHashData или CryptHashSessionKey. Этот объект уже содержит хеш-значение данных, которые необходимо подписать.
  • dwKeySpec: Определяет, какой ключ из контейнера будет использоваться. Обычно это AT_SIGNATURE (пара ключей для подписи) или AT_KEYEXCHANGE (для обмена ключами, но используется реже для подписи).
  • sDescription: Параметр, предназначенный для хранения описания подписи. В современных реализациях обычно игнорируется или устанавливается в NULL.
  • dwFlags: Зарезервированный параметр. Должен быть равен 0.
  • pbSignature: Указатель на буфер, в который будет записана результирующая подпись. Если этот параметр равен NULL, функция возвращает необходимый размер буфера в pdwSigLen.
  • pdwSigLen: Указатель на переменную, содержащую размер буфера pbSignature. После вызова функции содержит фактический размер подписи в байтах.

Алгоритм работы

Процесс подписи с использованием CryptSignHash включает несколько этапов:

  1. Получение хеша: Сначала вызывается CryptCreateHash для создания хеш-объекта. Затем через CryptHashData в этот объект передаются исходные данные. Хеш-функция (например, SHA-1, SHA-256, MD5) определяется при создании хеш-объекта. В настоящее время для обеспечения безопасности рекомендуется использовать SHA-256 или более новые алгоритмы.
  2. Подписание хеша: Функция CryptSignHash принимает готовый хеш-объект и, используя закрытый ключ из указанного контейнера (обычно хранящегося в CSP — Cryptographic Service Provider), вычисляет цифровую подпись. Алгоритм подписи (например, RSA, DSA, ECDSA) также определяется CSP.
  3. Формирование подписи: Результатом является байтовая последовательность, представляющая собой цифровую подпись. Эта подпись может быть приложена к исходным данным или передана отдельно.

Формат подписи

Формат результирующей подписи зависит от используемого CSP и алгоритма. Для RSA-подписей (например, в CSP "Microsoft Enhanced RSA and AES Cryptographic Provider") подпись представляет собой число, полученное в результате возведения хеша в степень закрытого ключа по модулю. Для DSA и ECDSA подпись состоит из двух чисел (r, s).

Криптографические провайдеры (CSP)

Функция CryptSignHash работает в контексте конкретного CSP — программного или аппаратного модуля, реализующего криптографические алгоритмы. В Windows по умолчанию доступны несколько CSP, включая:

  • Microsoft Base Cryptographic Provider v1.0: Поддерживает RSA, RC2, RC4, MD5, SHA-1.
  • Microsoft Enhanced Cryptographic Provider v1.0: Расширенная версия с поддержкой более длинных ключей RSA (до 1024 бит).
  • Microsoft Strong Cryptographic Provider: Поддерживает AES, SHA-256, SHA-384, SHA-512, RSA до 16384 бит.
  • Microsoft Software Key Storage Provider (KSP): Современный провайдер для ключей, хранящихся в программном хранилище, поддерживает ECDSA, RSA, DSA.

Выбор CSP влияет на доступные алгоритмы хеширования и подписи, а также на длину ключей.

Применение

Электронная подпись документов

В приложениях, работающих с электронными документами, CryptSignHash используется для создания подписи, которая затем может быть проверена с помощью функции CryptVerifySignature. Это позволяет удостовериться в авторстве документа и его неизменности.

Аутентификация кода

В Windows технология Authenticode использует CryptSignHash для подписи исполняемых файлов (.exe, .dll). При подписании кода создаётся хеш файла, который затем подписывается закрытым ключом разработчика. Операционная система при запуске файла проверяет подпись, чтобы убедиться, что файл не был изменён и что он действительно от указанного издателя.

Защита сетевых протоколов

В протоколах, таких как TLS/SSL, CryptSignHash может использоваться для подписи сертификатов и сообщений, подтверждающих личность сервера или клиента.

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

  • Устаревшие алгоритмы: Использование CryptSignHash с алгоритмами MD5 или SHA-1 считается небезопасным из-за известных атак на коллизии. Рекомендуется использовать SHA-256 или более новые алгоритмы.
  • Управление ключами: Безопасность подписи полностью зависит от защиты закрытого ключа. Если ключ скомпрометирован, злоумышленник может подписывать данные от имени владельца.
  • Зависимость от CSP: Функция делегирует выполнение CSP, поэтому безопасность зависит от реализации CSP. Аппаратные CSP (например, смарт-карты) обеспечивают более высокий уровень защиты.
  • Устаревший API: Microsoft рекомендует использовать более современный Cryptography Next Generation (CNG) API, который предоставляет более гибкие и безопасные функции, такие как NCryptSignHash. CNG поддерживает больше алгоритмов, лучшую изоляцию ключей и более современные подходы к управлению.

Сравнение с CNG API

Функция CryptSignHash является частью старого CryptoAPI, который постепенно вытесняется CNG. Основные отличия:

  • Гибкость: CNG позволяет использовать любые алгоритмы, зарегистрированные в системе, а не только те, что встроены в CSP.
  • Производительность: CNG оптимизирован для современных процессоров и поддерживает аппаратное ускорение.
  • Безопасность: CNG предоставляет более строгую изоляцию ключей и поддерживает шифрование ключей на уровне ядра.
  • Поддержка: Microsoft продолжает поддерживать CryptoAPI, но все новые разработки рекомендуется вести на CNG.

Источники

  • Microsoft Developer Network (MSDN): документация по функции CryptSignHash.
  • "Cryptography API: Next Generation" (CNG) — документация Microsoft.
  • Книга "Writing Secure Code" (Michael Howard, David LeBlanc).
  • Статья "Cryptographic Service Providers" в документации Windows.

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

На главную BFOmetr →