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
Ação recomendada
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 avisoSYSLIB0007
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.