Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As operações criptográficas no .NET são feitas por bibliotecas do sistema operacional (SO). Esta dependência tem vantagens:
- Os aplicativos .NET se beneficiam da confiabilidade do sistema operacional. Manter as bibliotecas de criptografia protegidas contra vulnerabilidades é uma alta prioridade para os fornecedores de sistemas operacionais. Para fazer isso, eles fornecem atualizações que os administradores de sistema devem aplicar.
- Os aplicativos .NET terão acesso a algoritmos validados por FIPS se as bibliotecas do sistema operacional forem validadas por FIPS.
A dependência das bibliotecas do sistema operacional também significa que os aplicativos .NET só podem usar recursos criptográficos suportados pelo sistema operacional. Embora todas as plataformas ofereçam suporte a determinados recursos principais, alguns recursos suportados pelo .NET não podem ser usados em algumas plataformas. Este artigo identifica os recursos suportados em cada plataforma.
Este artigo pressupõe que você tenha uma familiaridade de trabalho com criptografia no .NET. Para obter mais informações, consulte .NET Cryptography Model e .NET Cryptographic Services.
Algoritmos de autenticação de hash e mensagem
Todos os algoritmos de hash e classes de autenticação de mensagem baseada em hash (HMAC), incluindo as classes *Managed, recorrem às bibliotecas do sistema operacional, com exceção do .NET no Browser WASM. No navegador WASM, SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 e os equivalentes HMAC são implementados usando código gerenciado.
| Algoritmo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Navegador |
|---|---|---|---|---|---|---|
| MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SHA-3-256 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| SHA-3-384 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| SHA-3-512 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| SHAKE-128 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+2 | ❌ | ❌ | ❌ | ❌ |
| SHAKE-256 | Windows 11 Compilação 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 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| HMAC-SHA-3-384 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| HMAC-SHA-3-512 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-1281 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-2561 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-XOF-1281 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
| KMAC-XOF-2561 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
1 Disponível a partir do .NET 9.
2 A função de saída extensível de streaming (XOF) está disponível a partir do .NET 9. No Linux, isso requer OpenSSL 3.3.
Encriptação simétrica
As cifras subjacentes e o encadeamento são feitos pelas bibliotecas do sistema.
| Cifra + Modo de Operação | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| AES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| AES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| AES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| AES-CFB128 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-BCE | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 3DES-CFB64 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| RC2-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| RC2-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| RC2-CFB | ❌ | ❌ | ❌ | ❌ | ❌ |
Encriptação autenticada
O suporte à criptografia autenticada (AE) é fornecido para AES-CCM, AES-GCM e ChaCha20Poly1305 por meio das classes System.Security.Cryptography.AesCcm, System.Security.Cryptography.AesGcm, e System.Security.Cryptography.ChaCha20Poly1305, respetivamente.
Como a encriptação autenticada requer APIs de plataforma mais recentes para suportar o algoritmo, o suporte pode não estar presente em todas as plataformas. Para detetar em tempo de execução se a plataforma atual suporta o algoritmo, pode usar a IsSupported propriedade estática da classe para o algoritmo.
| Cifra + Modo de Operação | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Navegador |
|---|---|---|---|---|---|---|
| AES-GCM | ✔️ | ✔️ | ✔️ | ⚠️ | ✔️ | ❌ |
| AES-CCM | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ❌ |
| ChaCha20Poly1305 | Windows 10 Compilação 20142+ | OpenSSL 1.1.0+ | ✔️ | ⚠️ | API Nível 28+ | ❌ |
AES-CCM no macOS
Antes do .NET 10, AES-CCM funcionava se uma versão suportada do OpenSSL estivesse presente e o carregador de biblioteca dinâmica pudesse localizá-lo. O suporte a OpenSSL no macOS foi removido no .NET 10.
AES-GCM e ChaCha20Poly1305 no iOS, tvOS e MacCatalyst
O suporte para AES-GCM e ChaCha20Poly1305 está disponível a partir do .NET 9 no iOS e tvOS 13.0 e posterior, e em todas as versões do MacCatalyst.
Chaves, nonces e tags AES-CCM
Tamanhos das chaves
AES-CCM funciona com chaves de 128, 192 e 256 bits.
Tamanhos de Nonce
A AesCcm classe suporta nonces de 56, 64, 72, 80, 88, 96 e 104 bits (7, 8, 9, 10, 11, 12 e 13 bytes).
Tamanhos de tags
A AesCcm classe suporta a criação ou processamento de tags de 32, 48, 64, 80, 96, 112 e 128 bits (4, 8, 10, 12, 14 e 16 bytes).
Chaves, nonces e tags AES-GCM
Tamanhos das chaves
AES-GCM funciona com chaves de 128, 192 e 256 bits.
Tamanhos de Nonce
A AesGcm classe suporta apenas nonces de 96 bits (12 bytes).
Tamanhos de tags
No Windows e Linux, a AesGcm classe suporta a criação ou processamento de etiquetas de 96, 104, 112, 120 e 128 bits (12, 13, 14, 15 e 16 bytes). Nas plataformas Apple, o tamanho da tag é limitado a 128 bits (16 bytes) devido a limitações da estrutura do CryptoKit.
ChaCha20Poly1305 chaves, nonces e etiquetas
ChaCha20Poly1305 tem um tamanho fixo para a chave, o nonce e o tag de autenticação. ChaCha20Poly1305 sempre usa uma chave de 256 bits, um nonce de 96 bits (12 bytes) e uma tag de 128 bits (16 bytes).
Criptografia assimétrica
Esta secção inclui as seguintes subsecções:
RSA
A geração de chaves RSA (Rivest–Shamir–Adleman) é realizada pelas bibliotecas do sistema operacional e está sujeita às suas limitações de tamanho e características de desempenho.
As operações de chave RSA são realizadas pelas bibliotecas do sistema operacional, e os tipos de chave que podem ser carregados estão sujeitos aos requisitos do sistema operacional.
O .NET não expõe operações RSA "cruas" (não preenchidas).
O suporte a preenchimento e resumo varia de acordo com a plataforma:
| Modo de preenchimento | Windows (CNG) | Linux (OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Android | Windows (CAPI) |
|---|---|---|---|---|---|---|
| Criptografia PKCS1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| OAEP - SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| OAEP - SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| OAEP - SHA-3 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| Assinatura PKCS1 (MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Assinatura PKCS1 (SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠ ️ 1 |
| Assinatura PKCS1 (SHA-3) | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
| PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 O Windows CryptoAPI (CAPI) é capaz de realizar assinatura PKCS1 com um algoritmo SHA-2. Mas o objeto RSA individual pode ser carregado em um provedor de serviços de criptografia (CSP) que não oferece suporte a ele.
RSA no Windows
- Windows CryptoAPI (CAPI) é usado sempre que
new RSACryptoServiceProvider()é usado. - A API de Criptografia do Windows Next Generation (CNG) é usada sempre que
new RSACng()é usada. - O objeto retornado por RSA.Create é alimentado internamente pelo Windows CNG. Este uso do Windows CNG é um detalhe de implementação e está sujeito a alterações.
- O GetRSAPublicKey método de extensão para X509Certificate2 retorna uma RSACng instância. Este uso de RSACng é um detalhe de implementação e está sujeito a alterações.
- O GetRSAPrivateKey método de extensão para X509Certificate2 atualmente prefere uma RSACng instância, mas se RSACng não puder abrir a chave, RSACryptoServiceProvider será tentado. O provedor preferencial é um detalhe de implementação e está sujeito a alterações.
Interoperabilidade nativa RSA
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o código de criptografia do .NET usa. Os tipos envolvidos não traduzem entre plataformas, e só devem ser usados diretamente quando necessário.
| Tipo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| RSACryptoServiceProvider | ✔️ | ⚠ ️ 1 | ⚠ ️ 1 | ⚠ ️ 1 | ⚠ ️ 1 |
| RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| RSAOpenSsl | ❌ | ✔️ | ❌ 2 | ❌ | ❌ |
1 Em não-Windows, RSACryptoServiceProvider pode ser usado para compatibilidade com programas existentes. Nesse caso, qualquer método que exija interoperabilidade do sistema operacional, como abrir uma chave nomeada, lança um PlatformNotSupportedException.
2 No macOS, antes do .NET 10, RSAOpenSsl funcionava se o OpenSSL estivesse instalado e um dylib libcrypto apropriado pudesse ser encontrado através do carregamento dinâmico da biblioteca. Esse suporte foi removido no .NET 10.
ECDSA
A geração de chaves ECDSA (Elliptic Curve Digital Signature Algorithm) é feita pelas bibliotecas do sistema operacional e está sujeita às suas limitações de tamanho e características de desempenho.
As curvas-chave ECDSA são definidas pelas bibliotecas do SO e estão sujeitas às suas limitações.
| Curva Elíptica | Windows 10 | Windows 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|---|
| NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Curvas Brainpool (designadas como curvas) | ✔️ | ❌ | ⚠ ️ 1 | ❌ | ❌ | ⚠ ️ 4 |
| Outras curvas com nome | ⚠ ️ 2 | ❌ | ⚠ ️ 1 | ❌ | ❌ | ⚠ ️ 4 |
| Curvas explícitas | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
| Exportar ou importar conforme explícito | ✔️ | ❌ 3 | ✔️ | ❌ 3 | ❌ 3 | ✔️ |
1 As distribuições Linux não têm suporte para as mesmas curvas nomeadas.
2 O suporte para curvas nomeadas foi adicionado ao Windows CNG no Windows 10. Para obter mais informações, consulte Curvas Elípticas Nomeadas do CNG. As curvas nomeadas não estão disponíveis em versões anteriores do Windows, exceto para três curvas no Windows 7.
3 A exportação com parâmetros de curva explícitos requer suporte à biblioteca do sistema operacional, que não está disponível em plataformas Apple ou versões anteriores do Windows.
4 O suporte Android para algumas curvas depende da versão Android. Os distribuidores Android também podem optar por adicionar ou remover curvas da sua compilação Android.
Interoperabilidade Nativa ECDSA
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o código de criptografia do .NET usa. Os tipos envolvidos não traduzem entre plataformas e só devem ser usados diretamente quando necessário.
| Tipo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| ECDsaOpenSsl | ❌ | ✔️ | ❌* | ❌ | ❌ |
* No macOS, antes do .NET 10, ECDsaOpenSsl funcionava se o OpenSSL estivesse instalado e um dylib libcrypto apropriado pudesse ser encontrado através do carregamento dinâmico da biblioteca. Esse suporte foi removido no .NET 10.
ECDH
A geração de chaves ECDH (Elliptic Curve Diffie-Hellman) é feita pelas bibliotecas do sistema operacional e está sujeita às suas limitações de tamanho e características de desempenho.
A ECDiffieHellman classe suporta o valor "bruto" da computação ECDH, bem como através das seguintes funções de derivação chave:
- HASH(Z)
- HASH(prepend || Z || acrescentar)
- HMAC (chave, Z)
- HMAC(chave, prepend || Z || anexar)
- HMAC (Z, Z)
- HMAC(Z, prefixar || Z || sufixar)
- Tls11Prf (rótulo, semente)
As curvas de teclas ECDH são definidas pelas bibliotecas do SO e estão sujeitas às suas limitações.
| Curva Elíptica | Windows 10+ | Windows 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|---|
| NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Curvas Brainpool (designadas como curvas) | ✔️ | ❌ | ⚠ ️ 1 | ❌ | ❌ | ⚠ ️ 4 |
| Outras curvas com nome | ⚠ ️ 2 | ❌ | ⚠ ️ 1 | ❌ | ❌ | ⚠ ️ 4 |
| Curvas explícitas | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
| Exportar ou importar conforme explícito | ✔️ | ❌ 3 | ✔️ | ❌ 3 | ❌ 3 | ✔️ |
1 As distribuições Linux não têm suporte para as mesmas curvas nomeadas.
2 O suporte para curvas nomeadas foi adicionado ao Windows CNG no Windows 10. Para obter mais informações, consulte Curvas Elípticas Nomeadas do CNG. As curvas nomeadas não estão disponíveis em versões anteriores do Windows, exceto para três curvas no Windows 7.
3 A exportação com parâmetros de curva explícitos requer suporte à biblioteca do sistema operacional, que não está disponível em plataformas Apple ou versões anteriores do Windows.
4 O suporte Android para algumas curvas depende da versão Android. Os distribuidores Android também podem optar por adicionar ou remover curvas da sua compilação Android.
Interoperabilidade nativa do ECDH
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o .NET usa. Os tipos envolvidos não traduzem entre plataformas e só devem ser usados diretamente quando necessário.
| Tipo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| ECDiffieHellmanOpenSsl | ❌ | ✔️ | ❌* | ❌ | ❌ |
* No macOS, antes do .NET 10, ECDiffieHellmanOpenSsl funcionava se o OpenSSL estivesse instalado e um dylib libcrypto apropriado pudesse ser encontrado através do carregamento dinâmico da biblioteca. Esse suporte foi removido no .NET 10.
DSA
A geração de chaves DSA (Digital Signature Algorithm) é realizada pelas bibliotecas do sistema e está sujeita às suas limitações de tamanho e características de desempenho.
| Função | Windows CNG | Linux | macOS | Windows CAPI | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|---|
| Criação de chaves (<= 1024 bits) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
| Criação de chaves (> 1024 bits) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
| Carregando chaves (<= 1024 bits) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| Teclas de carregamento (> 1024 bits) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
| FIPS 186-2 (Norma Federal de Processamento de Informação 186-2) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| FIPS 186-3 (assinaturas SHA-2) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* O macOS carrega chaves DSA maiores que 1024 bits, mas o comportamento dessas chaves é indefinido. Eles não se comportam de acordo com o FIPS 186-3.
DSA no Windows
- Windows CryptoAPI (CAPI) é usado sempre que
new DSACryptoServiceProvider()é usado. - A API de Criptografia do Windows Next Generation (CNG) é usada sempre que
new DSACng()é usada. - O objeto retornado por DSA.Create é alimentado internamente pelo Windows CNG. Este uso do Windows CNG é um detalhe de implementação e está sujeito a alterações.
- O GetDSAPublicKey método de extensão para X509Certificate2 retorna uma DSACng instância. Este uso de DSACng é um detalhe de implementação e está sujeito a alterações.
- O GetDSAPrivateKey método de extensão para X509Certificate2 prefere uma DSACng instância, mas se DSACng não puder abrir a chave, DSACryptoServiceProvider será tentado. O provedor preferencial é um detalhe de implementação e está sujeito a alterações.
Interoperabilidade nativa do DSA
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o código de criptografia do .NET usa. Os tipos envolvidos não traduzem entre plataformas e só devem ser usados diretamente quando necessário.
| Tipo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| DSACryptoServiceProvider | ✔️ | ⚠ ️ 1 | ⚠ ️ 1 | ❌ | ⚠ ️ 1 |
| DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
| DSAOpenSsl | ❌ | ✔️ | ❌ 2 | ❌ | ❌ |
1 Em não-Windows, DSACryptoServiceProvider pode ser usado para compatibilidade com programas existentes. Nesse caso, qualquer método que exija interoperabilidade do sistema, como abrir uma chave nomeada, lança um PlatformNotSupportedException.
2 No macOS, antes do .NET 10, DSAOpenSsl funcionava se o OpenSSL estivesse instalado e um dylib libcrypto apropriado pudesse ser encontrado através do carregamento dinâmico da biblioteca. Esse suporte foi removido no .NET 10.
Criptografia pós-quântica
Algoritmos pós-quânticos estão disponíveis a partir do .NET 10. Eles também estão disponíveis para o .NET Framework usando o pacote NuGet Microsoft.Bcl.Cryptography. A tabela de suporte a seguir indica o suporte da plataforma para os componentes criptográficos internos do sistema operacional, como aqueles criados a partir de Generate ou ImportFromPem. As implementações que derivam da classe base podem ter comportamentos de suporte diferentes.
Para os algoritmos internos, uma IsSupported propriedade estática está disponível para determinar se a plataforma suporta qualquer um dos conjuntos de parâmetros.
Os tipos de interoperabilidade nativos para algoritmos pós-quânticos não suportam geração ou importação de chaves. Eles existem especificamente para cenários de interoperabilidade com os tipos de plataforma nativa, como um EVP_PKEY no OpenSSL ou CngKey no Windows.
ML-KEM
| Algoritmo | Windows | Linux | Maçã | Android | Navegador |
|---|---|---|---|---|---|
| ML-KEM-512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-KEM-768 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-KEM-1024 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
Interoperabilidade nativa ML-KEM
- MLKemOpenSsl: OpenSSL 3.5.0+
- MLKemCng: Windows 11 Insiders (Mais recente)
ML-DSA
ML-DSA tem uma variante pura e pré-hashizada (HashML-DSA). A tabela a seguir reflete ambas as variantes pura e pré-hash.
| Algoritmo | Windows | Linux | Maçã | Android | Navegador |
|---|---|---|---|---|---|
| ML-DSA-44 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-65 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-87 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-44 Mu Externo (μ)1 | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-65 Mu Externo (μ)1 | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| ML-DSA-87 Mu Externo (μ)1 | ❌ | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
1 O suporte externo de Mu destina-se apenas a assinar e verificar Mu. A computação de Mu não é suportada.
Interoperabilidade nativa ML-DSA
- MLDsaOpenSsl: OpenSSL 3.5.0+
- MLDsaCng: Windows 11 Insiders (mais recente)
SLH-DSA
SLH-DSA tem uma variante pura e outra variante pré-hash (HashSLH-DSA). A tabela a seguir reflete ambas as variantes pura e pré-hash.
| Algoritmo | Windows | Linux | Maçã | Android | Navegador |
|---|---|---|---|---|---|
| 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+ | ❌ | ❌ | ❌ |
Interoperabilidade nativa SLH-DSA
- SlhDsaOpenSsl: OpenSSL 3.5.0+
- SlhDsaCng: Não suportado
Composto ML-DSA
| Algoritmo | Windows | Linux | Maçã | Android | Navegador |
|---|---|---|---|---|---|
| MLDSA44-RSA2048-PSS-SHA256 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA44-RSA2048-PKCS15-SHA256 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA44-Ed25519-SHA512 | ❌ | ❌ | ❌ | ❌ | ❌ |
| MLDSA44-ECDSA-P256-SHA256 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA3072-PSS-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA3072-PKCS15-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA4096-PSS-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-RSA4096-PKCS15-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-ECDSA-P256-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-ECDSA-P384-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-ECDSA-brainpoolP256r1-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA65-Ed25519-SHA512 | ❌ | ❌ | ❌ | ❌ | ❌ |
| MLDSA87-ECDSA-P384-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-ECDSA-brainpoolP384r1-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-Ed448-SHAKE256 | ❌ | ❌ | ❌ | ❌ | ❌ |
| MLDSA87-RSA3072-PSS-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-RSA4096-PSS-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
| MLDSA87-ECDSA-P521-SHA512 | Windows 11 Insiders (Mais recente) | OpenSSL 3.5.0+ | ❌ | ❌ | ❌ |
Composto de interoperabilidade nativa ML-DSA
- CompositeMLDsaCng: Não suportado
Certificados X.509
A maioria do suporte para certificados X.509 no .NET vem de bibliotecas do sistema operacional. Para carregar um certificado numa instância X509Certificate2 ou X509Certificate no .NET, o certificado deve ser carregado pela biblioteca do sistema operativo subjacente.
Ler uma PKCS12/PFX
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Vazio | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Um certificado, sem chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Um certificado, com chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Vários certificados, sem chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Vários certificados, uma chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Vários certificados, várias chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Criar um PKCS12/PFX
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Vazio | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Um certificado, sem chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Um certificado, com chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Vários certificados, sem chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Vários certificados, uma chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Vários certificados, várias chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Carregamento efêmero | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
O macOS não pode carregar chaves privadas de certificado sem um objeto de chaveiro, o que requer gravação em disco. As chaves são criadas automaticamente para carregamento PFX e são excluídas quando não estão mais em uso. Como a opção X509KeyStorageFlags.EphemeralKeySet significa que a chave privada não deve ser gravada no disco, afirmar essa flag no macOS resulta em PlatformNotSupportedException.
Escrever uma coleção de certificados PKCS7
Windows e Linux emitem blobs PKCS7 codificados por DER. O macOS emite objetos PKCS7 codificados em CER de comprimento indefinido.
Armazém X509
No Windows, a X509Store classe é uma representação das APIs do Repositório de Certificados do Windows. Essas APIs funcionam da mesma forma no .NET que no .NET Framework.
Em sistemas não Windows, a classe X509Store é uma projeção das decisões de confiança do sistema (somente leitura), das decisões de confiança do utilizador (leitura-gravação) e do armazenamento das chaves do utilizador (leitura-gravação).
As tabelas a seguir mostram quais cenários são suportados em cada plataforma. Para cenários sem suporte (❌ nas tabelas), um CryptographicException é gerado.
A minha loja
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Abrir CurrentUser\My (Somente leitura) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Abrir CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Abra CurrentUser\My (ExistingOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
| Abrir LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
No Linux, os armazenamentos são criados na primeira gravação e não há armazenamentos de utilizador por padrão, portanto, abrir CurrentUser\My com ExistingOnly pode falhar.
No macOS, a CurrentUser\My loja é o porta-chaves padrão do usuário, que é login.keychain por padrão. A LocalMachine\My loja é System.keychain.
O repositório raiz
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Abra CurrentUser\Root (somente leitura) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| Abra CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Abra "CurrentUser\Root (ExistingOnly)" | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ✔️ (se ReadOnly) |
| Abrir LocalMachine\Root (Apenas leitura) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| Abrir LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
| Abrir LocalMachine\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ✔️ (se ReadOnly) |
No Linux, o LocalMachine\Root repositório é uma interpretação do conjunto de CA no caminho padrão para OpenSSL.
No macOS, a CurrentUser\Root loja é uma interpretação dos resultados para o domínio de confiança do SecTrustSettings usuário. A loja LocalMachine\Root é uma interpretação dos resultados SecTrustSettings para os domínios de confiança de administração e do sistema.
Localizações de certificados raiz de confiança no Linux
No Linux, o .NET utiliza OpenSSL (libssl) para localizar certificados raiz de confiança. O OpenSSL determina a localização do armazenamento de certificados usando variáveis de ambiente (SSL_CERT_FILE e SSL_CERT_DIR) e caminhos padrão específicos da distribuição. Quando o diretório da loja raiz configurado para OpenSSL não contém certificados, o .NET volta a verificar /etc/ssl/certs. Esta alternativa garante compatibilidade com distribuições como o SUSE Linux Enterprise Server (SLES), onde o diretório especificado por SSL_CERT_DIR pode conter apenas certificados com o BEGIN TRUSTED CERTIFICATE formato, que o .NET não suporta como certificados raiz.
Este recuo só ocorre quando:
- A
SSL_CERT_DIRvariável ambiente não está explicitamente definida. - O diretório padrão de certificados não contém certificados utilizáveis.
Se os seus certificados não estiverem a carregar corretamente, verifique que:
- Os seus ficheiros de certificado estão em formato PEM com o
BEGIN CERTIFICATEmarcador (nãoBEGIN TRUSTED CERTIFICATE). - As
SSL_CERT_DIRvariáveis de ambiente eSSL_CERT_FILEapontam para as localizações corretas, se definidas. - O ficheiro ou diretório do pacote de certificados tem as permissões de leitura apropriadas.
A loja intermediária
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Abrir CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
| Abra CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Abra CurrentUser\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ❌ |
| Abrir LocalMachine\Intermediate (em modo de só leitura) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
| Abrir LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
| Abrir LocalMachine\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ❌ |
No Linux, a CurrentUser\Intermediate loja é usada como um cache ao baixar CAs intermediárias por seus registros de acesso a informações de autoridade em compilações X509Chain bem-sucedidas. O LocalMachine\Intermediate repositório é uma interpretação do pacote CA no caminho padrão para OpenSSL.
No macOS, a CurrentUser\Intermediate loja é tratada como uma loja personalizada. Os certificados adicionados a este repositório não afetam a construção da cadeia X.509.
A loja não permitida
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Abrir CurrentUser\Disallowed (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
| Abrir CurrentUser\Disallowed (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
| Abre CurrentUser\Disallowed (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) |
| Abrir LocalMachine\Disallowed (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
| Abrir LocalMachine\Não permitido (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
| Abrir LocalMachine\Disallowed (ExistingOnly) | ✔️ | ❌ | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) |
No Linux, a Disallowed loja não é usada na construção de cadeias, e tentar adicionar conteúdo a ela resulta em um CryptographicException. A CryptographicException é lançado ao abrir a Disallowed loja se já tiver adquirido conteúdos.
No macOS, os repositórios CurrentUser\Disallowed e LocalMachine\Disallowed são interpretações dos resultados SecTrustSettings apropriados para certificados cuja confiança está definida como Always Deny.
Loja inexistente
| Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
|---|---|---|---|---|---|
| Abrir loja inexistente (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
| Abrir armazenamento inexistente CurrentUser (ReadWrite) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
| Abrir repositório inexistente LocalMachine (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
No macOS, a criação de lojas personalizadas com a API X509Store é suportada apenas para CurrentUser localização. Ele criará um novo porta-chaves sem senha no diretório de chaves do usuário (~/Library/Keychains). Para criar um porta-chaves com senha, um P/Invoke para SecKeychainCreate pode ser usado. Da mesma forma, SecKeychainOpen poderia ser usado para abrir chaveiros em diferentes locais. O resultado IntPtr pode ser passado para new X509Store(IntPtr) para obter um armazenamento com capacidade de leitura/gravação, sujeito às permissões do utilizador atual.
Cadeia X509
O macOS não suporta a utilização de CRL offline, por isso X509RevocationMode.Offline é tratado como X509RevocationMode.Online.
O macOS não suporta um limite de tempo definido pelo utilizador para o download de CRL (Lista de Revogação de Certificados) / OCSP (Online Certificate Status Protocol) / AIA (Authority Information Access), portanto X509ChainPolicy.UrlRetrievalTimeout é ignorado.
Certificados de criptografia pós-quântica e PKCS12/PFX
O suporte a certificados pós-quânticos também requer suporte do algoritmo primitivo.
| Funcionamento | Algoritmo | Windows | Linux | Maçã | Android | Navegador |
|---|---|---|---|---|---|---|
| Importação PKCS#12 | ML-DSA | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Exportação PKCS#12 | ML-DSA | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Associação de Chaves Privadas | ML-DSA | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Importação PKCS#12 | ML-KEM | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Exportação PKCS#12 | ML-KEM | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Associação de Chaves Privadas | ML-KEM | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Importação PKCS#12 | SLH-DSA | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Exportação PKCS#12 | SLH-DSA | ❌ | ✔️ | ❌ | ❌ | ❌ |
| Associação de Chaves Privadas | SLH-DSA | ❌ | ✔️ | ❌ | ❌ | ❌ |