Partilhar via


Não há suporte para a instanciação de implementações padrão de abstrações criptográficas

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

Alterar a descrição

No .NET Framework 2.0 - 4.8, fábricas primitivas criptográficas abstratas podem HashAlgorithm.Create() ser configuradas para retornar algoritmos diferentes. Por exemplo, em uma instalação padrão do .NET Framework 4.8, o método HashAlgorithm.Create() estático sem parâmetros retorna uma instância do algoritmo SHA1, conforme mostrado no trecho 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 de toda a máquina para alterar o algoritmo padrão sem precisar chamar CryptoConfig programaticamente.

No .NET Core 2.0 - 3.1, fábricas primitivas criptográficas abstratas, como HashAlgorithm.Create() sempre lançam um PlatformNotSupportedExceptionarquivo .

// 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 em tempo de compilação com ID SYSLIB0007. Em tempo de execução, esses métodos continuam a lançar um PlatformNotSupportedExceptionarquivo .

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

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

Nota

  • Apenas as sobrecargas sem parâmetros dos Create() métodos são obsoletas. As sobrecargas parametrizadas não são obsoletas e ainda funcionam como 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 a funcionar 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();
    

Razão para a 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+, uma vez que esse sistema herdado não permite a agilidade criptográfica adequada. . Os requisitos de compatibilidade com versões anteriores da NET também proíbem a estrutura de atualizar certas APIs criptográficas para acompanhar os avanços na criptografia. Por exemplo, o HashAlgorithm.Create() método foi introduzido no .NET Framework 1.0, quando o algoritmo de hash SHA-1 era state-of-the-art. Vinte anos se passaram, e agora o SHA-1 é considerado quebrado, mas não podemos mudar HashAlgorithm.Create() para retornar um algoritmo diferente. Fazê-lo introduziria uma mudança de quebra inaceitável no consumo de aplicações.

A prática recomendada determina que as bibliotecas que consomem primitivas criptográficas (como AES, SHA-* e RSA) devem ter controle total sobre como consomem essas primitivas. Os aplicativos que exigem preparação para o futuro devem utilizar bibliotecas de nível superior que envolvam essas primitivas e adicionem recursos de gerenciamento de chaves e agilidade criptográfica. Essas bibliotecas geralmente são fornecidas pelo ambiente de hospedagem. Um exemplo é o ASP. Biblioteca de Proteção de Dados da NET, que lida com essas preocupações em nome do aplicativo chamador.

Versão introduzida

5.0

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

  • Se você precisar manter a compatibilidade com cargas úteis existentes geradas por aplicativos do .NET Framework que usam as APIs agora obsoletas, use as substituições sugeridas na tabela a seguir. A tabela fornece um mapeamento de algoritmos padrão do .NET Framework para seus equivalentes do .NET 5+.

    .NET Framework Substituição compatível com .NET Core / .NET 5+ Observações
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() O algoritmo SHA-1 é considerado quebrado. Considere o uso de um algoritmo mais forte, se possível. Consulte o seu consultor de segurança para obter mais orientações.
    HMAC.Create() HMACSHA1() O algoritmo HMACSHA1 é desencorajado para a maioria das aplicações modernas. Considere o uso de um algoritmo mais forte, se possível. Consulte o seu consultor de segurança para obter mais orientações.
    KeyedHashAlgorithm.Create() HMACSHA1() O algoritmo HMACSHA1 é desencorajado para a maioria das aplicações modernas. Considere o uso de um algoritmo mais forte, se possível. Consulte o seu consultor de segurança para obter mais orientações.
    SymmetricAlgorithm.Create() Aes.Create()
  • Se você deve continuar a chamar as sobrecargas sem parâmetros Create() obsoletas, você pode suprimir o SYSLIB0007 aviso 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 em seu arquivo de projeto. Isso desativa 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>
    

    Nota

    A supressão SYSLIB0007 desativa apenas os avisos de obsolescência para as APIs de criptografia listadas aqui. Ele não desativa nenhum outro aviso. Além disso, mesmo se você suprimir o aviso, essas APIs obsoletas ainda lançarão um PlatformNotSupportedException em tempo de execução.

APIs afetadas