Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As sobrecargas sem parâmetros Create() em abstrações criptográficas tornam-se obsoletas como uma advertência a partir do .NET 5.0.
Alterar descrição
No .NET Framework 2.0 - 4.8, as fábricas abstratas de primitivas criptográficas, 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 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 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 em tempo de compilação com ID SYSLIB0007. Em tempo de execução, estes métodos continuam a lançar um PlatformNotSupportedException.
// 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á qualquer alteração em tempo de execução em relação às versões anteriores do .NET Core.
Observação
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();
Motivo da mudança
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. Fazer isso introduziria uma alteração disruptiva inaceitável nas aplicações consumidoras.
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 é a Biblioteca de Proteção de Dados do ASP.NET, que lida com estas questões em nome da aplicação chamadora.
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 uso do algoritmo HMACSHA1 é desaconselhado 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 uso do algoritmo HMACSHA1 é desaconselhado 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 tiver de continuar a chamar as sobrecargas obsoletas sem parâmetros
Create(), pode suprimir o avisoSYSLIB0007no 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>Observação
A supressão
SYSLIB0007desativa apenas os avisos de obsolescência para as APIs de criptografia listadas aqui. Não desativa nenhum outro aviso. Além disso, mesmo que suprimares o aviso, estas APIs obsoletas continuarão a lançar um PlatformNotSupportedException em tempo de execução.