Хранение и извлечение ключей

Архитектура хранилища ключей

CNG предоставляет модель для хранения закрытых ключей, которая позволяет адаптироваться к текущим и будущим требованиям создания приложений, использующих функции шифрования, такие как шифрование с открытым или закрытым ключом, а также требования к хранению материала ключа. Маршрутизатор хранилища ключей является центральной процедурой в этой модели и реализуется в Ncrypt.dll. Приложение обращается к поставщикам хранилища ключей (KSP) в системе через маршрутизатор хранилища ключей, который скрывает такие сведения, как изоляция ключа, как от приложения, так и от самого поставщика хранилища. На следующем рисунке показана архитектура изоляции ключа CNG и ее функции.

Поставщик хранилища ключей cng

В соответствии с общими требованиями (CC) долгоживущие ключи должны быть изолированы, чтобы они никогда не присутствовали в процессе приложения. В настоящее время CNG поддерживает хранение асимметричных закрытых ключей с помощью программного KSP Майкрософт, который входит в состав Windows Server 2008 и Windows Vista и устанавливается по умолчанию.

Изоляция ключей включена по умолчанию в Windows Server 2008 и Windows Vista. Функция изоляции ключей недоступна на платформах, предшествующих этим. Кроме того, сторонние поставщики KSP не загружаются в службу изоляции ключей (процесс LSA). В службу изоляции ключей загружается только поставщик ключей Microsoft KSP.

Процесс LSA используется в качестве процесса изоляции ключа для повышения производительности. Весь доступ к закрытым ключам осуществляется через маршрутизатор хранилища ключей, который предоставляет полный набор функций для управления закрытыми ключами и их использования.

CNG хранит открытую часть хранимого ключа отдельно от частной части. Открытая часть пары ключей также поддерживается в службе изоляции ключей, и доступ к ней осуществляется с помощью локального вызова удаленной процедуры (LRPC). Маршрутизатор хранилища ключей использует LRPC при вызове в процессе изоляции ключа. Весь доступ к закрытым ключам проходит через маршрутизатор закрытых ключей и проверяется CNG.

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

CNG предоставляет набор API, которые используются для создания, хранения и извлечения криптографических ключей. Список этих API см. в разделе Функции хранилища ключей CNG.

Типы ключей

CNG поддерживает следующие типы ключей:

  • Diffie-Hellman открытый и закрытый ключи.
  • Алгоритм цифровой подписи (DSA, FIPS 186-2) открытый и закрытый ключи.
  • Открытый и закрытый ключи RSA (PKCS No 1).
  • Несколько устаревших открытых и закрытых ключей (CryptoAPI).
  • Открытый и закрытый ключи шифрования на эллиптических кривых.

Поддерживаемые алгоритмы

CNG поддерживает следующие алгоритмы ключей.

Алгоритм Длина ключа/хэша (биты)
RSA От 512 до 16384 с шагом 64 бита
DH От 512 до 16384 с шагом 64 бита
DSA От 512 до 1024 с шагом 64 бита
ECDSA P-256, P-384, P-521 (кривые NIST)
ECDH P-256, P-384, P-521 (кривые NIST)
MD2 128
MD4 128
MD5 128
SHA-1 160
SHA-256 256
SHA-384 384
SHA-512 512

Каталоги и файлы ключей

Устаревшие CSP CryptoAPI корпорации Майкрософт хранят закрытые ключи в следующих каталогах.

Тип ключа Каталоги
Пользователь частный %APPDATA%\Microsoft\Crypto\RSA\User SID\
%APPDATA%\Microsoft\Crypto\DSS\User SID\
Локальная система private %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-18\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-18\
Локальная служба частная %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-19\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-19\
Частная сетевая служба %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-20\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-20\
Общий частный %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\MachineKeys

CNG хранит закрытые ключи в следующих каталогах.

Тип ключа Directory
Пользователь частный %APPDATA%\Microsoft\Crypto\Keys
Локальная система private %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\SystemKeys
Локальная служба частная %WINDIR%\ServiceProfiles\LocalService
Частная сетевая служба %WINDIR%\ServiceProfiles\NetworkService
Общий частный %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys

Ниже приведены некоторые различия между контейнерами ключей CryptoAPI и CNG.

  • CNG использует разные имена файлов ключей, чем файлы ключей, созданные Rsaenh.dll и Dssenh.dll устаревшими CSP. Устаревшие файлы ключей также имеют расширение .key, но файлы ключей CNG не имеют расширения .key.
  • CNG полностью поддерживает имена контейнеров ключей Юникода; CNG использует хэш имени контейнера Юникода, а CryptoAPI — хэш имени контейнера ANSI.
  • CNG является более гибким по отношению к парам ключей RSA. Например, CNG поддерживает общедоступные экспоненты, превышающие 32 бита в длину, а также ключи, в которых p и q имеют разную длину.
  • В CryptoAPI файл контейнера ключей хранится в каталоге, имя которого является текстовым эквивалентом идентификатора безопасности пользователя. Это больше не относится к CNG, что устраняет трудности при перемещении пользователей из одного домена в другой без потери всех закрытых ключей.
  • KSP CNG и имена ключей ограничены MAX_PATH символами Юникода. CSP CryptoAPI и имена ключей ограничены MAX_PATH символами ANSI.
  • CNG предлагает возможность определяемых пользователем ключевых свойств. Пользователи могут создавать и связывать пользовательские свойства с ключами, а также сохранять их с помощью сохраненных ключей.

При сохранении ключа CNG может создать два файла. Первый файл содержит закрытый ключ в новом формате CNG и всегда создается. Этот файл не используется устаревшими CSP CryptoAPI. Второй файл содержит тот же закрытый ключ в контейнере ключей CryptoAPI прежних версий. Второй файл соответствует формату и расположению, используемым Rsaenh.dll. Создание второго файла происходит только в том случае, если флаг NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG указан при вызове функции NCryptFinalizeKey для завершения ключа RSA. Эта функция не поддерживается для ключей DSA и DH.

Когда приложение пытается открыть существующий сохраненный ключ, CNG сначала пытается открыть собственный CNG-файл. Если этот файл не существует, CNG пытается найти соответствующий ключ в устаревшем контейнере ключей CryptoAPI.

При перемещении или копировании ключей CryptoAPI с исходного компьютера на целевой компьютер с помощью средства миграции пользовательской среды Windows (USMT) CNG не сможет получить доступ к ключам на целевом компьютере. Для доступа к таким перенесенным ключам необходимо использовать CryptoAPI.