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

CryptAcquireContext

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

Назначение и роль в CryptoAPI

CryptoAPI — это платформа, предоставляющая разработчикам возможность использовать криптографические сервисы без необходимости вникать в детали реализации конкретных алгоритмов. CryptAcquireContext выполняет две ключевые задачи:

  1. Выбор и инициализация CSP. Функция загружает указанный криптографический провайдер (например, Microsoft Base Cryptographic Provider v1.0 или Microsoft Enhanced Cryptographic Provider). CSP — это независимый программный модуль, реализующий алгоритмы шифрования (RSA, AES, DES, 3DES), хеширования (MD5, SHA-1, SHA-256) и управления ключами.
  2. Создание или открытие контейнера ключей. Контейнер ключей — это защищённая область, где хранятся ключи пользователя (открытые и закрытые). Функция позволяет либо создать новый контейнер, либо открыть существующий, а в некоторых случаях — открыть контейнер по умолчанию.

Без успешного вызова CryptAcquireContext невозможно выполнить ни одну последующую криптографическую операцию в рамках CryptoAPI.

Синтаксис и параметры

Функция объявлена в заголовочном файле wincrypt.h и имеет следующий прототип:

``c BOOL CryptAcquireContextA( HCRYPTPROV *phProv, LPCSTR szContainer, LPCSTR szProvider, DWORD dwProvType, DWORD dwFlags ); ``

Параметры:

  • phProvуказатель на переменную типа HCRYPTPROV, которая при успешном вызове получает дескриптор контекста CSP.
  • szContainer — имя контейнера ключей. Может быть NULL (для контейнера по умолчанию) или строкой, задающей пользовательское имя. Если контейнер не существует, а флаг CRYPT_NEWKEYSET не указан, функция вернёт ошибку.
  • szProvider — имя CSP. Если NULL, используется CSP по умолчанию для указанного типа провайдера.
  • dwProvType — тип провайдера (например, PROV_RSA_FULL, PROV_RSA_AES, PROV_DSS). Определяет набор поддерживаемых алгоритмов.
  • dwFlags — комбинация флагов, управляющих поведением функции. Основные флаги:
  • CRYPT_VERIFYCONTEXT — доступ только для проверки подписей; не требует доступа к контейнеру ключей.
  • CRYPT_NEWKEYSET — создаёт новый контейнер ключей с указанным именем.
  • CRYPT_MACHINE_KEYSET — контейнер хранится в хранилище локальной машины, а не пользователя.
  • CRYPT_DELETEKEYSET — удаляет указанный контейнер ключей.

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

Типы криптографических провайдеров (dwProvType)

Тип провайдера определяет, какие алгоритмы доступны. Наиболее распространённые типы:

Тип провайдераЗначениеОписание
PROV_RSA_FULL1Базовая поддержка RSA (шифрование, подпись, хеширование MD5/SHA-1).
PROV_RSA_AES24Расширенная поддержка RSA с AES (шифрование до 256 бит, хеширование SHA-256).
PROV_DSS3Цифровая подпись DSA (без шифрования).
PROV_DH_SCHANNEL12Протоколы Диффи-Хеллмана для Schannel (SSL/TLS).

Особенности работы с контейнерами ключей

Контейнеры ключей являются важнейшим элементом безопасности в CryptoAPI. Они могут храниться в реестре (для пользовательских контейнеров) или в файловой системе (для машинных контейнеров). Основные сценарии:

  • Создание нового контейнера: вызов с флагом CRYPT_NEWKEYSET. При этом генерируется новая пара ключей (открытый и закрытый) в рамках CSP.
  • Открытие существующего контейнера: вызов без флага CRYPT_NEWKEYSET. Если контейнер не найден, функция возвращает ошибку NTE_BAD_KEYSET.
  • Удаление контейнера: вызов с флагом CRYPT_DELETEKEYSET. После удаления все ключи, хранящиеся в контейнере, становятся недоступными.
  • Режим только для проверки (CRYPT_VERIFYCONTEXT): не требует наличия контейнера. Используется, когда нужно только проверить подпись или выполнить хеширование без доступа к закрытому ключу.

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

Ниже приведён типичный пример вызова CryptAcquireContext для создания контейнера и получения дескриптора CSP:

``c HCRYPTPROV hProv = 0; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_NEWKEYSET)) { // Обработка ошибки (например, контейнер уже существует) if (GetLastError() == NTE_EXISTS) { // Открыть существующий контейнер CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, 0); } else { // Критическая ошибка return 1; } } // Использование hProv для шифрования, подписи и т.д. // ... CryptReleaseContext(hProv, 0); ``

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

  • Функция CryptAcquireContext является частью устаревшего CryptoAPI. Начиная с Windows Vista, Microsoft рекомендует использовать более современный API — Cryptography API: Next Generation (CNG). CNG предоставляет более гибкую модель, поддержку новых алгоритмов (ECC, SHA-3) и лучшую изоляцию ключей.
  • Контейнеры ключей, созданные через CryptoAPI, несовместимы с CNG. Однако для обратной совместимости Windows поддерживает оба API.
  • Параметр szContainer может быть NULL, что означает использование контейнера по умолчанию. Это удобно для простых приложений, но не рекомендуется для систем, где требуется строгое разделение ключей между разными приложениями.
  • Флаг CRYPT_MACHINE_KEYSET позволяет хранить ключи в общедоступном машинном хранилище. Это полезно для служб Windows, но требует прав администратора при создании контейнера.

История и развитие

Функция CryptAcquireContext появилась в Windows 95 с выходом CryptoAPI 1.0. В Windows 2000 была добавлена поддержка AES и расширенных провайдеров. В Windows Vista и более поздних версиях CryptoAPI постепенно вытесняется CNG, однако CryptAcquireContext остаётся доступной для обеспечения совместимости с унаследованным кодом.

Альтернативы в современных системах

В CNG аналогом CryptAcquireContext является функция NCryptOpenStorageProvider, которая возвращает дескриптор провайдера CNG. Для работы с ключами используются NCryptCreatePersistedKey и NCryptOpenKey. CNG также поддерживает аппаратные модули безопасности (HSM) и смарт-карты через собственные провайдеры.

Источники

  • Microsoft Corporation. «CryptAcquireContext function (wincrypt.h)» — документация MSDN.
  • Microsoft Corporation. «Cryptographic Service Providers (CSP)» — документация MSDN.
  • Microsoft Corporation. «Cryptography API: Next Generation (CNG)» — документация MSDN.
  • Шнайер Б. «Прикладная криптография» (главы о реализации криптографических API).
  • MSDN Magazine. «The Cryptography API: A Developer's Guide» (2001).

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

На главную BFOmetr →