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