Share via


Não há suporte para a criação de instâncias de implementações padrão de abstrações de criptografia

As sobrecargas sem parâmetros do Create() em abstrações criptográficas são obsoletas como aviso a partir do .NET 5.0.

Descrição das alterações

No .NET Framework 2.0 - 4.8, as fábricas primitivas criptográficas abstratas, como HashAlgorithm.Create(), podem ser configuradas para retornar algoritmos diferentes. Por exemplo, em uma instalação padrão do .NET Framework 4.8, o método estático sem parâmetros HashAlgorithm.Create() retorna uma instância do algoritmo SHA1, conforme mostrado no snippet a seguir.

Somente .NET Framework

// Return an instance of the default hash algorithm (SHA1).
HashAlgorithm alg = HashAlgorithm.Create();
// Prints 'System.Security.Cryptography.SHA1CryptoServiceProvider'.
Console.WriteLine(alg.GetType());

// Change the default algorithm to be SHA256, not SHA1.
CryptoConfig.AddAlgorithm(typeof(SHA256CryptoServiceProvider), typeof(HashAlgorithm).FullName);
alg = HashAlgorithm.Create();
// Prints 'System.Security.Cryptography.SHA256CryptoServiceProvider'.
Console.WriteLine(alg.GetType());

Você também pode usar a configuração em todo o computador para alterar o algoritmo padrão sem precisar chamar programaticamente CryptoConfig.

No .NET Core 2.0 – 3.1, as fábricas primitivas criptográficas abstratas, como HashAlgorithm.Create(), sempre geram uma PlatformNotSupportedException.

// Throws PlatformNotSupportedException on .NET Core.
HashAlgorithm alg = HashAlgorithm.Create();

No .NET 5 e versões posteriores, fábricas primitivas criptográficas abstratas como HashAlgorithm.Create() são marcadas como obsoletas e produzem um aviso de tempo de compilação com a ID SYSLIB0007. No tempo de execução, esses métodos continuam a gerar uma PlatformNotSupportedException.

// Throws PlatformNotSupportedException.
// Also produces compile-time warning SYSLIB0007 on .NET 5+.
HashAlgorithm alg = HashAlgorithm.Create();

Essa é uma alteração somente de tempo de compilação. Não há nenhuma alteração em tempo de execução das versões anteriores do .NET Core.

Observação

  • Somente as sobrecargas sem parâmetros dos métodos Create() são obsoletas. As sobrecargas parametrizadas não são obsoletas e ainda funcionam conforme o esperado.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Sobrecargas sem parâmetros de famílias de algoritmos específicas (não abstrações) não são obsoletas, e continuarão funcionando conforme o esperado.

    // Call a specific algorithm family's parameterless Create() ctor.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    Aes aesAlg = Aes.Create();
    

Motivo da alteração

O sistema de configuração criptográfica presente no .NET Framework não está mais presente no .NET Core e no .NET 5+, pois esse sistema herdado não permite a agilidade criptográfica adequada. Os requisitos de compatibilidade com versões anteriores do .NET também proíbem a estrutura de atualizar determinadas APIs criptográficas para acompanhar os avanços na criptografia. Por exemplo, o método HashAlgorithm.Create() foi introduzido no .NET Framework 1.0, quando o algoritmo de hash SHA-1 era de última geração. Vinte anos se passaram, e agora o SHA-1 é considerado desfeito, mas não podemos mudar HashAlgorithm.Create() para retornar um algoritmo diferente. Isso introduziria uma alteração significativa interruptiva no consumo dos aplicativos.

A prática recomendada determina que as bibliotecas que consomem primitivos criptográficos (como AES, SHA-*e RSA) devem ter o controle total sobre como consomem esses primitivos. Os aplicativos que exigem durabilidade devem utilizar bibliotecas de nível superior que encapsulam esses primitivos e adicionam recursos de agilidade criptográfica e de gerenciamento de chaves. Essas bibliotecas geralmente são fornecidas pelo ambiente de hospedagem. Um exemplo é a biblioteca de Proteção de Dados ASP.NET, que lida com essas questões em nome do aplicativo de chamada.

Versão introduzida

5,0

  • O curso de ação recomendado é substituir as chamadas às APIs já obsoletas por chamadas para métodos de fábrica para algoritmos específicos, por exemplo, Aes.Create(). Isso fornece controle total sobre os algoritmos que são instanciados.

  • Caso precise manter a compatibilidade com o conteúdo existente gerado por aplicativos .NET Framework que usam as APIs já obsoletas, use as substituições sugeridas na tabela a seguir. A tabela fornece um mapeamento dos algoritmos padrão do .NET Framework para os equivalentes do .NET 5 e superior.

    .NET Framework Substituição compatível com o .NET Core/o .NET 5+ Comentários
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() O algoritmo SHA-1 é considerado desfeito. Considere o uso de um algoritmo mais forte, se possível. Consulte seu orientador de segurança para obter mais diretrizes.
    HMAC.Create() HMACSHA1() O algoritmo HMACSHA1 não é recomendado para a maioria dos aplicativos modernos. Considere o uso de um algoritmo mais forte, se possível. Consulte seu orientador de segurança para obter mais diretrizes.
    KeyedHashAlgorithm.Create() HMACSHA1() O algoritmo HMACSHA1 não é recomendado para a maioria dos aplicativos modernos. Considere o uso de um algoritmo mais forte, se possível. Consulte seu orientador de segurança para obter mais diretrizes.
    SymmetricAlgorithm.Create() Aes.Create()
  • Se precisar continuar a chamar as sobrecargas obsoletas sem parâmetros Create(), você poderá suprimir o aviso SYSLIB0007 no código.

    #pragma warning disable SYSLIB0007 // Disable the warning.
    HashAlgorithm alg = HashAlgorithm.Create(); // Still throws PNSE.
    #pragma warning restore SYSLIB0007 // Re-enable the warning.
    

    Você também pode suprimir o aviso no arquivo de projeto. Isso desabilita o aviso para todos os arquivos de origem dentro do projeto.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below suppresses SYSLIB0007 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0007</NoWarn>
      </PropertyGroup>
    </Project>
    

    Observação

    Suprimir SYSLIB0007 desabilita apenas os avisos de obsolescência para as APIs de criptografia listadas aqui. Ela não desabilita nenhum outro aviso. Além disso, mesmo que você suprima o aviso, essas APIs obsoletas ainda gerarão uma PlatformNotSupportedException no tempo de execução.

APIs afetadas