Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Криптографические операции в .NET выполняются библиотеками операционной системы (ОС). Эта зависимость имеет преимущества:
- Приложения .NET получают преимущества надежности ОС. Обеспечение безопасности библиотек шифрования от уязвимостей является высоким приоритетом для поставщиков ОС. Для этого они предоставляют обновления, которые должны применять системные администраторы.
- Приложения .NET имеют доступ к алгоритмам, проверенным на соответствие FIPS, если библиотеки ОС проверены на соответствие FIPS.
Зависимость от библиотек ОС также означает, что приложения .NET могут использовать только криптографические функции, поддерживаемые ОС. Хотя все платформы поддерживают некоторые основные функции, некоторые функции, поддерживаемые .NET, не могут использоваться на некоторых платформах. В этой статье определены функции, поддерживаемые на каждой платформе.
В этой статье предполагается, что у вас есть опыт работы с криптографией в .NET. Дополнительные сведения см. в статье .NET Cryptography Model and .NET Cryptographic Services.
Алгоритмы хэширования и проверки подлинности сообщений
Все классы хэш-алгоритмов и классы хэш-кодирования сообщений (HMAC), включая классы *Managed, используют библиотеки ОС, за исключением случаев работы в .NET на браузере WASM. В браузере WASM, SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 и эквиваленты HMAC реализуются с помощью управляемого кода.
| Алгоритм | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид | Браузер |
|---|---|---|---|---|---|---|
| MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-3-256 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| SHA-3-384 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| SHA-3-512 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| SHAKE-128 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+2 | ❌ | ❌ | ❌ | ❌ |
| SHAKE-256 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+2 | ❌ | ❌ | ❌ | ❌ |
| HMAC-MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| HMAC-SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| HMAC-SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| HMAC-SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| HMAC-SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| HMAC-SHA-3-256 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| HMAC-SHA-3-384 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| HMAC-SHA-3-512 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-1281 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-2561 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-XOF-1281 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-XOF-2561 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
1Доступно начиная с .NET 9.
2Расширяемая выходная функция потоковой передачи (XOF) доступна начиная с .NET 9. В Linux для этого требуется OpenSSL 3.3.
Симметричное шифрование
Базовые алгоритмы шифрования и сцепка осуществляются системными библиотеками.
| Шифр + режим | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| AES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| AES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| AES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| AES-CFB128 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-CFB64 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| RC2-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| RC2-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| RC2-CFB | ❌ | ❌ | ❌ | ❌ | ❌ |
Шифрование, прошедшее проверку подлинности
Поддержка шифрования с проверкой подлинности (AE) предоставляется для AES-CCM, AES-GCM и ChaCha20Poly1305 через классы System.Security.Cryptography.AesCcm, System.Security.Cryptography.AesGcm и System.Security.Cryptography.ChaCha20Poly1305 соответственно.
Так как для поддержки алгоритма требуются более новые API платформы для проверки подлинности, поддержка может не присутствовать на всех платформах. Чтобы определить, поддерживает ли текущая платформа алгоритм, можно использовать IsSupported статическое свойство в классе для алгоритма.
| Шифр + режим | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид | Браузер |
|---|---|---|---|---|---|---|
| AES-GCM; | ✔️ | ✔️ | ✔️ | ⚠️ | ✔️ | ❌ |
| AES-CCM | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ❌ |
| ChaCha20Poly1305 | Windows 10 Build 20142+ | OpenSSL 1.1.0+ | ✔️ | ⚠️ | Уровень API 28+ | ❌ |
AES-CCM в macOS
До .NET 10 AES-CCM работал, если была представлена поддерживаемая версия OpenSSL, а загрузчик динамической библиотеки мог его найти. Поддержка OpenSSL в macOS была удалена в .NET 10.
AES-GCM и ChaCha20Poly1305 в iOS, tvOS и MacCatalyst
Поддержка AES-GCM и ChaCha20Poly1305 доступна начиная с .NET 9 в iOS и tvOS 13.0 и более поздних версиях, а также для всех версий MacCatalyst.
Ключи AES-CCM, нонсы и теги
Размеры ключей
AES-CCM работает с 128, 192 и 256-разрядными ключами.
Размеры nonce
Класс AesCcm поддерживает 56, 64, 72, 80, 88, 96 и 104-битные (7, 8, 9, 10, 11, 12 и 13-байтные) nonces.
Размеры тегов
Класс AesCcm поддерживает создание или обработку тегов 32, 48, 64, 80, 96, 112 и 128-разрядных (4, 8, 10, 12, 14 и 16 байтов).
Ключи AES-GCM, одноразовые числа (nonces) и теги
Размеры ключей
AES-GCM работает с 128, 192 и 256-разрядными ключами.
Размеры nonce
Класс AesGcm поддерживает только 96-разрядные (12-байтовые) nonces.
Размеры тегов
В Windows и Linux класс AesGcm поддерживает создание или обработку тегов размером 96, 104, 112, 120 и 128 бит (12, 13, 14, 15 и 16 байт). На платформах Apple размер тега ограничен 128-разрядным (16-байтом) из-за ограничений платформы CryptoKit.
Ключи ChaCha20Poly1305, одноразовые числа и теги аутентификации
ChaCha20Poly1305 имеет фиксированный размер для ключа, одноразового числа (nonce) и тега аутентификации. ChaCha20Poly1305 всегда использует 256-разрядный ключ, 96-разрядный (12-байтовый) и 128-разрядный (16-байтовый) тег.
Асимметричная криптография
В этом разделе содержатся следующие подразделы:
RSA
Создание ключей RSA (Rivest-Shamir-Adleman) выполняется библиотеками ОС и зависит от их размеров и характеристик производительности.
Операции с ключами RSA выполняются библиотеками ОС, а типы ключей, которые могут быть загружены, подлежат требованиям к ОС.
.NET не поддерживает "сырые" (без добавления) операции RSA.
Поддержка заполнения и дайджеста зависит от платформы:
| Режим заполнения | Windows (CNG) | Linux (OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Андроид | Windows (CAPI) |
|---|---|---|---|---|---|---|
| Шифрование PKCS1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| OAEP - SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| OAEP - SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| OAEP - SHA-3 | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| Подпись PKCS1 (MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Подпись PKCS1 (SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠️1 |
| Подпись PKCS1 (SHA-3) | Сборка Windows 11 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 Windows CryptoAPI (CAPI) поддерживает подпись PKCS1 с алгоритмом SHA-2. Однако отдельный объект RSA может быть загружен в поставщик криптографических служб (CSP), который не поддерживает этот объект.
RSA в Windows
- Windows CryptoAPI (CAPI) используется каждый раз, когда используется
new RSACryptoServiceProvider(). - Криптографический API следующего поколения Windows (CNG) используется всякий раз, когда используется
new RSACng(). - Объект, возвращаемый RSA.Create, внутренне поддерживается Windows CNG. Это использование Windows CNG является деталью реализации и может быть изменено.
- Метод расширения GetRSAPublicKey для X509Certificate2 возвращает экземпляр RSACng. Это использование RSACng является подробным описанием реализации и подлежит изменению.
- Метод GetRSAPrivateKey расширения для X509Certificate2 в настоящее время предпочитает экземпляр RSACng, но если RSACng не удается открыть ключ, RSACryptoServiceProvider будет предпринят. Предпочитаемый провайдер является деталью реализации и подлежит изменению.
Собственное взаимодействие RSA
.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует код шифрования .NET. Используемые типы не преобразуются между платформами и должны использоваться только при необходимости.
| Тип | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| RSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ⚠️1 | ⚠️1 |
| RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| RSAOpenSsl | ❌ | ✔️ | ❌ 2 | ❌ | ❌ |
1 На не-Windows, RSACryptoServiceProvider можно использовать для совместимости с существующими программами. В этом случае любой метод, требующий интероперабельности с ОС, например открытие именованного ключа, вызывает исключение PlatformNotSupportedException.
2 В macOS до .NET 10 RSAOpenSsl работал, если был установлен OpenSSL и можно было найти соответствующий файл библиотеки libcrypto dylib с помощью динамической загрузки библиотек. Эта поддержка была удалена в .NET 10.
ECDSA
Создание ключа ECDSA (алгоритм цифровой подписи на эллиптической кривой) выполняется библиотеками ОС и зависит от их ограничений по размеру и характеристик производительности.
Ключевые кривые ECDSA определяются библиотеками ОС и подвергаются их ограничениям.
| эллиптическая кривая; | Windows 10 | Windows 7 — 8.1 | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|---|
| NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Кривые Brainpool (именованные кривые) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
| Другие именованные кривые | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
| Явные кривые | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
| Экспорт или импорт как явный | ✔️ | ❌ 3 | ✔️ | ❌ 3 | ❌ 3 | ✔️ |
1 Дистрибутивы Linux не поддерживают одинаковые именованные кривые.
2 Поддержка именованных кривых добавлена в Windows CNG в Windows 10. Дополнительные сведения см. в разделе CNG с именованными эллиптических кривыми. Именованные кривые недоступны в более ранних версиях Windows, за исключением трех кривых в Windows 7.
3 Экспорт с явными параметрами кривой требует поддержки библиотеки ОС, которая недоступна на платформах Apple или более ранних версиях Windows.
Поддержка 4 Android для некоторых кривых зависит от версии Android. Распространители Android могут также добавлять или удалять кривые из сборки Android.
Нативное взаимодействие ECDSA
.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует код шифрования .NET. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.
| Тип | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| ECDsaOpenSsl | ❌ | ✔️ | ❌* | ❌ | ❌ |
* На macOS до .NET 10 ECDsaOpenSsl работал, если OpenSSL был установлен и соответствующий libcrypto dylib можно было найти с помощью динамической загрузки библиотеки. Эта поддержка была удалена в .NET 10.
ECDH
Создание ключей ECDH (Elliptic Curve Diffie-Hellman) выполняется библиотеками ОС и зависит от их ограничений размера и характеристик производительности.
Класс ECDiffieHellman поддерживает "необработанное" значение вычисления ECDH, а также с помощью следующих функций производного ключа:
- HASH(Z)
- HASH(prepend || Z || добавление)
- HMAC(key, Z)
- HMAC(key, prepend || Z || добавление)
- HMAC(Z, Z)
- HMAC(Z, префикс || Z || суффикс)
- Tls11Prf(label, seed)
Ключевые кривые ECDH определяются библиотеками ОС и подвергаются их ограничениям.
| эллиптическая кривая; | Windows 10+ | Windows 7 — 8.1 | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|---|
| NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Кривые Brainpool (именованные кривые) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
| Другие именованные кривые | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
| Явные кривые | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
| Экспорт или импорт как явный | ✔️ | ❌ 3 | ✔️ | ❌ 3 | ❌ 3 | ✔️ |
1 Дистрибутивы Linux не поддерживают одинаковые именованные кривые.
2 Поддержка именованных кривых добавлена в Windows CNG в Windows 10. Дополнительные сведения см. в разделе CNG с именованными эллиптических кривыми. Именованные кривые недоступны в более ранних версиях Windows, за исключением трех кривых в Windows 7.
3 Экспорт с явными параметрами кривой требует поддержки библиотеки ОС, которая недоступна на платформах Apple или более ранних версиях Windows.
Поддержка 4 Android для некоторых кривых зависит от версии Android. Распространители Android могут также добавлять или удалять кривые из сборки Android.
Нативная интероперабельность ECDH
.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует .NET. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.
| Тип | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| ECDiffieHellmanOpenSsl | ❌ | ✔️ | ❌* | ❌ | ❌ |
* На macOS до .NET 10 ECDiffieHellmanOpenSsl работал, если OpenSSL был установлен и соответствующий libcrypto dylib можно было найти с помощью динамической загрузки библиотеки. Эта поддержка была удалена в .NET 10.
DSA
Создание ключей DSA (алгоритм цифровой подписи) выполняется системными библиотеками и зависит от ограничений размера и характеристик производительности.
| Функция | Windows CNG | Линукс | macOS | Windows CAPI (Криптографический интерфейс программирования для Windows) | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|---|
| Создание ключа (<= 1024 бита) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
| Создание ключа (> 1024 бита) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
| Загрузка ключей (<= 1024 бит) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| Загрузка ключей (> 1024 бита) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
| FIPS 186-2 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| FIPS 186-3 (подписи SHA-2) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* macOS загружает ключи DSA больше 1024 бит, но поведение этих ключей не определено. Они не ведут себя в соответствии с FIPS 186-3.
DSA в Windows
- Windows CryptoAPI (CAPI) используется каждый раз, когда используется
new DSACryptoServiceProvider(). - Криптографический API следующего поколения Windows (CNG) используется всякий раз, когда используется
new DSACng(). - Объект, возвращаемый DSA.Create, внутренне поддерживается Windows CNG. Это использование Windows CNG является деталью реализации и может быть изменено.
- Метод GetDSAPublicKey расширения для X509Certificate2 возвращает экземпляр DSACng. Это использование DSACng является подробным описанием реализации и подлежит изменению.
- Метод расширения GetDSAPrivateKey для X509Certificate2 предпочитает экземпляр DSACng, но если DSACng не удается открыть ключ, будет предпринята попытка с DSACryptoServiceProvider. Предпочитаемый провайдер является деталью реализации и подлежит изменению.
Нативное взаимодействие DSA
.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует код шифрования .NET. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.
| Тип | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| DSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ❌ | ⚠️1 |
| DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| DSAOpenSsl | ❌ | ✔️ | ❌ 2 | ❌ | ❌ |
1 На не-Windows, DSACryptoServiceProvider можно использовать для совместимости с существующими программами. В этом случае любой метод, требующий взаимодействия с системой, например, открытие именованного ключа, вызовет исключение PlatformNotSupportedException.
2 В macOS до .NET 10 DSAOpenSsl работал, если был установлен OpenSSL и можно было найти соответствующий файл библиотеки libcrypto dylib с помощью динамической загрузки библиотек. Эта поддержка была удалена в .NET 10.
После квантовой криптографии
Постквантовые алгоритмы доступны начиная с .NET 10. Они также доступны для .NET Framework с помощью пакета NuGet Microsoft.Bcl.Cryptography. В следующей таблице поддержки указывается поддержка платформы встроенных компонентов шифрования операционной системы, например созданных из Generate или ImportFromPem. Реализации, производные от базового класса, могут иметь разные характеристики поддержки.
Для встроенных алгоритмов доступно статическое свойство, с помощью которого можно определить, поддерживает ли платформа любой из наборов параметров.
Собственные типы взаимодействия для алгоритмов post-quantum не поддерживают создание ключей или импорт. Они существуют специально для сценариев взаимодействия с собственными типами платформ, такими как EVP_PKEY OpenSSL или CngKey Windows.
ML-KEM
| Алгоритм | Виндоус | Линукс | Яблоко | Андроид | Браузер |
|---|---|---|---|---|---|
| ML-KEM-512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-KEM-768 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-KEM-1024 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
Нативная интероперабельность ML-KEM
- MLKemOpenSsl: OpenSSL 3.5.0+
- MLKemCng: Участники программы Windows 11 Insider (Последняя сборка)
ML-DSA
ML-DSA имеет чистый и предхешированный вариант (HashML-DSA). В следующей таблице указаны как оригинальные, так и прехэшированные варианты.
| Алгоритм | Виндоус | Линукс | Яблоко | Андроид | Браузер |
|---|---|---|---|---|---|
| ML-DSA-44 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-65 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-87 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-44 External Mu (μ)1 | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-65 External Mu (μ)1 | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-87 External Mu (μ)1 | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
1 Поддержка внешнего Mu предназначена для подписывания и проверки только Mu. Вычисление Mu не поддерживается.
Нативная межоперабельность ML-DSA
- MLDsaOpenSsl: OpenSSL 3.5.0+
- MLDsaCng: Участники программы Windows 11 Insider (новейшая версия)
SLH-DSA
SLH-DSA имеет основной и предхешируемый варианты (HashSLH-DSA). В следующей таблице указаны как оригинальные, так и прехэшированные варианты.
| Алгоритм | Виндоус | Линукс | Яблоко | Андроид | Браузер |
|---|---|---|---|---|---|
| SLH-DSA-SHA2-128f | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHA2-128s | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHA2-192f | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHA2-192s | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHA2-256f | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHA2-256s | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHAKE-128f | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHAKE-128s | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHAKE-192f | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHAKE-192s | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHAKE-256f | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| SLH-DSA-SHAKE-256s | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
Встроенная совместимость SLH-DSA
- SlhDsaOpenSsl: OpenSSL 3.5.0+
- SlhDsaCng: не поддерживается
Составные ML-DSA
| Алгоритм | Виндоус | Линукс | Яблоко | Андроид | Браузер |
|---|---|---|---|---|---|
| MLDSA44-RSA2048-PSS-SHA256 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA44-RSA2048-PKCS15-SHA256 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA44-Ed25519-SHA512 | ❌ | ❌ | ❌ | ❌ | ❌ |
| MLDSA44-ECDSA-P256-SHA256 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA3072-PSS-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA3072-PKCS15-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA4096-PSS-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA4096-PKCS15-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-ECDSA-P256-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-ECDSA-P384-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-ECDSA-brainpoolP256r1-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-Ed25519-SHA512 | ❌ | ❌ | ❌ | ❌ | ❌ |
| MLDSA87-ECDSA-P384-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-ECDSA-brainpoolP384r1-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-Ed448-SHAKE256 | ❌ | ❌ | ❌ | ❌ | ❌ |
| MLDSA87-RSA3072-PSS-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-RSA4096-PSS-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-ECDSA-P521-SHA512 | Инсайдерская программа Windows 11 (последняя сборка) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
Композитное взаимодействие ML-DSA
- CompositeMLDsaCng: не поддерживается
Сертификаты X.509
Большая часть поддержки сертификатов X.509 в .NET поставляется из библиотек ОС. Чтобы загрузить сертификат в экземпляр X509Certificate2 или X509Certificate в .NET, сертификат должен быть загружен базовой библиотекой ОС.
Чтение PKCS12/PFX
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Пустой | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Один сертификат, без закрытого ключа | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Один сертификат с закрытым ключом | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Несколько сертификатов, закрытых ключей нет | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Несколько сертификатов, один закрытый ключ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Несколько сертификатов, несколько закрытых ключей | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Создать PKCS12/PFX
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Пустой | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Один сертификат, без закрытого ключа | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Один сертификат с закрытым ключом | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Несколько сертификатов, закрытых ключей нет | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Несколько сертификатов, один закрытый ключ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Несколько сертификатов, несколько закрытых ключей | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Эфемерная загрузка | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS не может загружать закрытые ключи сертификата без объекта цепочки ключей, который требует записи на диск. Цепочки ключей создаются автоматически для загрузки PFX и удаляются, когда они больше не используются. Так как параметр X509KeyStorageFlags.EphemeralKeySet означает, что закрытый ключ не должен быть записан на диск, установка этого флага в macOS приводит к PlatformNotSupportedException.
Создание коллекции сертификатов PKCS7
Windows и Linux выдают большие двоичные объекты PKCS7 с кодировкой DER. macOS выдает двоичные объекты PKCS #7, кодированные в CER с неопределенной длиной.
X509Store
В Windows класс X509Store является представлением API Магазина сертификатов Windows. Эти API работают так же в .NET, как и в .NET Framework.
На системах, отличных от Windows, класс X509Store представляет собой проекцию решений доверия системы (только для чтения), решений доверия пользователя (чтение и запись) и хранилища ключей пользователя (чтение и запись).
В следующих таблицах показано, какие сценарии поддерживаются на каждой платформе. Для неподдерживаемых сценариев (❌ в таблицах) выбрасывается CryptographicException.
Мой магазин
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Откройте CurrentUser\My (только для чтения) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Откройте CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Откройте CurrentUser\My (ExistingOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
| Откройте LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
В Linux хранилища создаются при первой записи, а пользовательские хранилища по умолчанию не существуют, поэтому попытка открыть CurrentUser\My с помощью ExistingOnly может завершиться ошибкой.
В macOS CurrentUser\My хранилище — это основная цепочка ключей пользователя, которая используется по умолчанию.login.keychain Магазин LocalMachine\My .System.keychain
Корневое хранилище
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Откройте CurrentUser\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| Откройте CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Откройте CurrentUser\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (если ReadOnly) | ❌ | ✔️ (если ReadOnly) |
| Откройте LocalMachine\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| Откройте LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
| Откройте LocalMachine\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (если ReadOnly) | ❌ | ✔️ (если ReadOnly) |
В Linux LocalMachine\Root хранилище является интерпретацией пакета сертификатов ЦС, расположенного по умолчанию в пути для OpenSSL.
В macOS CurrentUser\Root хранилище представляет собой интерпретацию SecTrustSettings результатов для домена доверия пользователей. Хранилище LocalMachine\Root представляет собой интерпретацию SecTrustSettings результатов для доменов доверия администратора и системы.
Расположения доверенных корневых сертификатов в Linux
В Linux .NET использует OpenSSL (libssl) для поиска доверенных корневых сертификатов. OpenSSL определяет расположение хранилища сертификатов с помощью переменных среды (SSL_CERT_FILE и SSL_CERT_DIR) и путей по умолчанию для конкретного дистрибутива. Если каталог корневого хранилища, настроенный для OpenSSL, не содержит никаких сертификатов, .NET возвращается к проверке /etc/ssl/certs. Эта резервная версия обеспечивает совместимость с дистрибутивами, такими как SUSE Linux Enterprise Server (SLES), где указанный в SSL_CERT_DIR каталог может содержать только сертификаты в формате BEGIN TRUSTED CERTIFICATE, который .NET не поддерживает в качестве корневых сертификатов.
Этот резервный вариант возникает только в следующих случаях:
- Переменная
SSL_CERT_DIRсреды не задана явным образом. - Каталог сертификатов по умолчанию не содержит доступных сертификатов.
Если ваши сертификаты не загружаются правильно, убедитесь, что:
- Файлы сертификатов находятся в формате PEM с маркером
BEGIN CERTIFICATE(неBEGIN TRUSTED CERTIFICATE). - Переменные среды
SSL_CERT_DIRиSSL_CERT_FILEуказывают на правильные расположения, если заданы. - Файл пакета сертификатов или каталог имеет соответствующие разрешения на чтение.
Промежуточное хранилище
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Откройте CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
| Откройте CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Откройте CurrentUser\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (если ReadOnly) | ❌ | ❌ |
| Откройте LocalMachine\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
| Откройте LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
| Откройте LocalMachine\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (если ReadOnly) | ❌ | ❌ |
В Linux CurrentUser\Intermediate хранилище используется в качестве кэша при скачивании промежуточных ЦС своими записями доступа к данным центра в успешной сборке X509Chain. Хранилище LocalMachine\Intermediate — это интерпретация набора сертификатов ЦС в пути по умолчанию для OpenSSL.
В macOS CurrentUser\Intermediate хранилище рассматривается как пользовательское хранилище. Сертификаты, добавленные в это хранилище, не влияют на сборку цепочки X.509.
Запрещенный магазин
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Откройте CurrentUser\Disallowed (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
| Открыть CurrentUser\Disallowed (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
| Откройте CurrentUser\Disallowed (ExistingOnly) | ✔️ | ⚠️ | ✔️ (если ReadOnly) | ✔️ (если ReadOnly) | ✔️ (если ReadOnly) |
| Откройте LocalMachine\Disallowed (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
| Откройте LocalMachine\Disallowed (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
| Откройте LocalMachine\Disallowed (ExistingOnly) | ✔️ | ❌ | ✔️ (если ReadOnly) | ✔️ (если ReadOnly) | ✔️ (если ReadOnly) |
В Linux хранилище Disallowed не используется при построении цепочки, и попытка добавить в него содержимое приводит к CryptographicException. При CryptographicException открытии Disallowed хранилища вызывается исключение, если оно уже приобрело содержимое.
В macOS хранилища CurrentUser\Disallowed и LocalMachine\Disallowed являются интерпретациями соответствующих результатов SecTrustSettings для сертификатов, для которых задано значение доверия Always Deny.
Не существующий магазин
| Сценарий | Виндоус | Линукс | macOS | iOS, tvOS, MacCatalyst | Андроид |
|---|---|---|---|---|---|
| Откройте несуществующий магазин (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
| Открыть несуществующее хранилище CurrentUser (чтение/запись) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
| Открытие несуществующего хранилища LocalMachine (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
В macOS создание пользовательского хранилища с помощью API X509Store поддерживается только для CurrentUser расположения. Он создаст новую цепочку ключей без пароля в каталоге цепочки ключей пользователя (~/Library/Keychains). Чтобы создать цепочку ключей с паролем, можно использовать P/Invoke SecKeychainCreate . Аналогичным образом SecKeychainOpen можно использовать для открытия связки ключей в разных местах.
IntPtr Результат можно передать в new X509Store(IntPtr) для получения хранилища, способного обеспечивать чтение и запись, с учетом разрешений текущего пользователя.
X509Chain
macOS не поддерживает автономное использование CRL, поэтому X509RevocationMode.Offline обрабатывается как X509RevocationMode.Online.
macOS не поддерживает тайм-ауты, инициированные пользователем при загрузке CRL (списка отзыва сертификатов), OCSP (протокола статуса онлайн-сертификатов) и AIA (доступ к информации о полномочиях), поэтому X509ChainPolicy.UrlRetrievalTimeout игнорируется.
Сертификаты шифрования после квантовых вычислений и PKCS12/PFX
Поддержка постквантовых сертификатов также требует поддержки от примитивного алгоритма.
| Операция | Алгоритм | Виндоус | Линукс | Яблоко | Андроид | Браузер |
|---|---|---|---|---|---|---|
| Импорт PKCS#12 | ML-DSA | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Экспорт PKCS#12 | ML-DSA | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Ассоциация закрытого ключа | ML-DSA | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Импорт PKCS#12 | ML-KEM | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Экспорт PKCS#12 | ML-KEM | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Ассоциация закрытого ключа | ML-KEM | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Импорт PKCS#12 | SLH-DSA | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Экспорт PKCS#12 | SLH-DSA | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Ассоциация закрытого ключа | SLH-DSA | ❌ | ✔️ | ❌ | ❌ | ❌ |
Дополнительные ресурсы
- Модель шифрования .NET
- Криптографические службы .NET
- Timing vulnerabilities with CBC-mode symmetric decryption using padding (Уязвимости в учете времени при симметричной расшифровке в режиме CBC с использованием заполнения).
- защита основных данных ASP.NET