CryptAcquireContext
CryptAcquireContext — это функция программного интерфейса (API) Microsoft Windows, входящая в состав Cryptographic Application Programming Interface (CryptoAPI). Она служит для получения дескриптора (handle) криптографического провайдера (CSP — Cryptographic Service Provider), который предоставляет доступ к набору криптографических алгоритмов и защищённому хранилищу ключей. Функция является отправной точкой для большинства операций шифрования, хеширования, подписи и проверки цифровых подписей в операционных системах семейства Windows.
Назначение и роль в CryptoAPI
CryptoAPI — это платформа, предоставляющая разработчикам возможность использовать криптографические сервисы без необходимости вникать в детали реализации конкретных алгоритмов. CryptAcquireContext выполняет две ключевые задачи:
- Выбор и инициализация CSP. Функция загружает указанный криптографический провайдер (например, Microsoft Base Cryptographic Provider v1.0 или Microsoft Enhanced Cryptographic Provider). CSP — это независимый программный модуль, реализующий алгоритмы шифрования (RSA, AES, DES, 3DES), хеширования (MD5, SHA-1, SHA-256) и управления ключами.
- Создание или открытие контейнера ключей. Контейнер ключей — это защищённая область, где хранятся ключи пользователя (открытые и закрытые). Функция позволяет либо создать новый контейнер, либо открыть существующий, а в некоторых случаях — открыть контейнер по умолчанию.
Без успешного вызова 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_FULL | 1 | Базовая поддержка RSA (шифрование, подпись, хеширование MD5/SHA-1). |
| PROV_RSA_AES | 24 | Расширенная поддержка RSA с AES (шифрование до 256 бит, хеширование SHA-256). |
| PROV_DSS | 3 | Цифровая подпись DSA (без шифрования). |
| PROV_DH_SCHANNEL | 12 | Протоколы Диффи-Хеллмана для 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 →