Het instantiëren van standaard implementaties van cryptografische abstracties wordt niet ondersteund
De parameterloze Create()
overbelasting van cryptografische abstracties is verouderd als waarschuwing vanaf .NET 5.0.
Wijzigingsbeschrijving
In .NET Framework 2.0 - 4.8 kunnen abstracte cryptografische primitieve factory's, zoals HashAlgorithm.Create() kunnen worden geconfigureerd om verschillende algoritmen te retourneren. Bij een standaardinstallatie van .NET Framework 4.8 retourneert de statische methode HashAlgorithm.Create() zonder parameters bijvoorbeeld een exemplaar van het SHA1-algoritme, zoals wordt weergegeven in het volgende fragment.
Alleen .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());
U kunt ook de configuratie voor de hele machine gebruiken om het standaardalgoritmen te wijzigen zonder programmatisch aan CryptoConfig
te roepen.
In .NET Core 2.0 - 3.1 abstracte cryptografische primitieve fabrieken zoals HashAlgorithm.Create() altijd een PlatformNotSupportedException.
// Throws PlatformNotSupportedException on .NET Core.
HashAlgorithm alg = HashAlgorithm.Create();
In .NET 5 en latere versies zijn abstracte cryptografische primitieve factory's zoals HashAlgorithm.Create() verouderd gemarkeerd en produceren ze een waarschuwing over de compilatietijd met id SYSLIB0007
. Tijdens runtime blijven deze methoden een PlatformNotSupportedException.
// Throws PlatformNotSupportedException.
// Also produces compile-time warning SYSLIB0007 on .NET 5+.
HashAlgorithm alg = HashAlgorithm.Create();
Dit is alleen een compilatietijdwijziging. Er is geen runtimewijziging ten opzichte van eerdere versies van .NET Core.
Notitie
Alleen de parameterloze overbelastingen van de
Create()
methoden zijn verouderd. Geparameteriseerde overbelastingen zijn niet verouderd en werken nog steeds zoals verwacht.// Call Create(string), providing an explicit algorithm family name. // Works in .NET Framework, .NET Core, and .NET 5+. HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
Parameterloze overbelastingen van specifieke algoritmefamilies (geen abstracties) zijn niet verouderd en blijven werken zoals verwacht.
// Call a specific algorithm family's parameterless Create() ctor. // Works in .NET Framework, .NET Core, and .NET 5+. Aes aesAlg = Aes.Create();
Reden voor wijziging
Het cryptografische configuratiesysteem dat aanwezig is in .NET Framework, is niet langer aanwezig in .NET Core en .NET 5+, omdat dat verouderde systeem geen juiste cryptografische flexibiliteit toestaat. . De vereisten voor achterwaartse compatibiliteit van NET verbieden ook dat het framework bepaalde cryptografische API's bijwerkt om bij te blijven met de ontwikkelingen in cryptografie. De methode is HashAlgorithm.Create() bijvoorbeeld geïntroduceerd in .NET Framework 1.0, toen het SHA-1-hashalgoritme state-of-the-art was. Twintig jaar zijn verstreken en nu wordt SHA-1 beschouwd als gebroken, maar we kunnen niet veranderen HashAlgorithm.Create() om een ander algoritme te retourneren. Dit zou leiden tot een onacceptabele wijziging die fouten veroorzaken bij het gebruik van toepassingen.
Best practice bepaalt dat bibliotheken die cryptografische primitieven gebruiken (zoals AES, SHA-*en RSA) volledige controle moeten hebben over hoe ze deze primitieven gebruiken. Toepassingen die toekomstbestendig moeten zijn, moeten gebruikmaken van bibliotheken op hoger niveau die deze primitieven verpakken en sleutelbeheer en cryptografische flexibiliteitsmogelijkheden toevoegen. Deze bibliotheken worden vaak geleverd door de hostingomgeving. Een voorbeeld is ASP. De gegevensbeschermingsbibliotheek van NET, die deze problemen namens de aanroepende toepassing afhandelt.
Versie geïntroduceerd
5,0
Aanbevolen actie
De aanbevolen procedure is het vervangen van aanroepen naar de nu verouderde API's door aanroepen naar factory-methoden voor specifieke algoritmen, bijvoorbeeld Aes.Create(). Dit geeft u volledige controle over welke algoritmen worden geïnstantieerd.
Als u compatibiliteit wilt behouden met bestaande nettoladingen die worden gegenereerd door .NET Framework-apps die gebruikmaken van de nu verouderde API's, gebruikt u de vervangingen die in de volgende tabel worden voorgesteld. De tabel biedt een toewijzing van standaardalgoritmen van .NET Framework aan hun .NET 5+ equivalenten.
.NET Framework .NET Core / .NET 5+ compatibele vervanging Opmerkingen AsymmetricAlgorithm.Create() RSA.Create() HashAlgorithm.Create() SHA1.Create() Het SHA-1-algoritme wordt beschouwd als verbroken. Overweeg indien mogelijk een sterker algoritme te gebruiken. Neem contact op met uw beveiligingsadviseur voor verdere begeleiding. HMAC.Create() HMACSHA1() Het HMACSHA1 algoritme wordt afgeraden voor de meeste moderne toepassingen. Overweeg indien mogelijk een sterker algoritme te gebruiken. Neem contact op met uw beveiligingsadviseur voor verdere begeleiding. KeyedHashAlgorithm.Create() HMACSHA1() Het HMACSHA1 algoritme wordt afgeraden voor de meeste moderne toepassingen. Overweeg indien mogelijk een sterker algoritme te gebruiken. Neem contact op met uw beveiligingsadviseur voor verdere begeleiding. SymmetricAlgorithm.Create() Aes.Create() Als u de verouderde overbelasting zonder
Create()
parameters moet blijven aanroepen, kunt u deSYSLIB0007
waarschuwing in code onderdrukken.#pragma warning disable SYSLIB0007 // Disable the warning. HashAlgorithm alg = HashAlgorithm.Create(); // Still throws PNSE. #pragma warning restore SYSLIB0007 // Re-enable the warning.
U kunt de waarschuwing ook onderdrukken in uw projectbestand. Als u dit doet, wordt de waarschuwing voor alle bronbestanden in het project uitgeschakeld.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- NoWarn below suppresses SYSLIB0007 project-wide --> <NoWarn>$(NoWarn);SYSLIB0007</NoWarn> </PropertyGroup> </Project>
Notitie
Als u
SYSLIB0007
onderdrukt, worden alleen de obsoletion-waarschuwingen voor de cryptografie-API's die hier worden vermeld, uitgeschakeld. Er worden geen andere waarschuwingen uitgeschakeld. Zelfs als u de waarschuwing onderdrukt, worden deze verouderde API's nog steeds tijdens runtime uitgevoerd PlatformNotSupportedException .