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