Sdílet prostřednictvím


Vytvoření instance výchozích implementací kryptografických abstrakcí se nepodporuje.

Přetížení bez Create() parametrů v kryptografických abstrakcích jsou zastaralá jako upozornění jako .NET 5.0.

Změna popisu

V rozhraní .NET Framework 2.0 – 4.8 je možné nakonfigurovat abstraktní kryptografické primitivní továrny, jako HashAlgorithm.Create() je například vrácení různých algoritmů. Například při výchozí instalaci rozhraní .NET Framework 4.8 vrátí statická metoda HashAlgorithm.Create() bez parametrů instanci algoritmu SHA1, jak je znázorněno v následujícím fragmentu kódu.

Pouze rozhraní .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());

Pomocí konfigurace pro celý počítač můžete také změnit výchozí algoritmus, aniž byste museli volat CryptoConfig programově.

V .NET Core 2.0 - 3.1 abstraktní kryptografické primitivní továrny, jako HashAlgorithm.Create() je vždy vyvolat PlatformNotSupportedException.

// Throws PlatformNotSupportedException on .NET Core.
HashAlgorithm alg = HashAlgorithm.Create();

V .NET 5 a novějších verzích abstraktní kryptografické primitivní továrny, jako HashAlgorithm.Create() jsou označené zastaralé, a vytvoří upozornění na dobu kompilace s ID SYSLIB0007. V době běhu tyto metody nadále vyvolat PlatformNotSupportedException.

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

Jedná se pouze o změnu v době kompilace. V předchozích verzích .NET Core nedošlo k žádné změně za běhu.

Poznámka:

  • Zastaralá jsou pouze přetížení Create() bez parametrů metod. Parametrizované přetížení nejsou zastaralá a stále fungují podle očekávání.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Přetížení bez parametrů konkrétních rodin algoritmů (nikoli abstrakce) nejsou zastaralá a budou nadále fungovat podle očekávání.

    // Call a specific algorithm family's parameterless Create() ctor.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    Aes aesAlg = Aes.Create();
    

Důvod změny

Kryptografický konfigurační systém, který se nachází v rozhraní .NET Framework, už v rozhraní .NET Core a .NET 5+ neexistuje, protože starší verze systému neumožňuje správnou kryptografickou flexibilitu. . Požadavky na zpětnou kompatibilitu rozhraní NET také zakazují aktualizaci určitých kryptografických rozhraní API, aby se zachovaly pokroky v kryptografii. Například metoda HashAlgorithm.Create() byla zavedena v rozhraní .NET Framework 1.0, když byl hashovací algoritmus SHA-1 nejmodernější. Uplynulo dvacet let a sha-1 je považováno za nefunkční, ale nemůžeme se změnit HashAlgorithm.Create() , abychom vrátili jiný algoritmus. Tím by se zavedla nepřijatelná změna způsobující chybu v používání aplikací.

Osvědčený postup určuje, že knihovny, které využívají kryptografické primitivy (například AES, SHA-* a RSA), by měly mít plnou kontrolu nad tím, jak tyto primitivy využívají. Aplikace, které vyžadují kontrolu pravopisu v budoucnu, by měly využívat knihovny vyšší úrovně, které tyto primitivy zabalí a přidávají možnosti správy klíčů a kryptografické flexibility. Tyto knihovny často poskytují hostitelské prostředí. Jedním z příkladů je ASP. Knihovna Ochrany dat net, která tyto obavy řeší jménem volající aplikace.

Zavedená verze

5,0

  • Doporučeným samozřejmě je nahradit volání nyní zastaralá rozhraní API voláními metod továrny pro konkrétní algoritmy, Aes.Create()například . Tím získáte úplnou kontrolu nad tím, které algoritmy se vytvoří instance.

  • Pokud potřebujete zachovat kompatibilitu s existujícími datovými částmi vygenerovanými aplikacemi rozhraní .NET Framework, které používají nyní zastaralá rozhraní API, použijte náhrady navrhované v následující tabulce. Tabulka poskytuje mapování z výchozích algoritmů rozhraní .NET Framework na jejich ekvivalenty .NET 5 nebo novější.

    .NET Framework Náhrada kompatibilní s .NET Core / .NET 5+ Poznámky
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() Algoritmus SHA-1 se považuje za poškozený. Pokud je to možné, zvažte použití silnějšího algoritmu. Další pokyny najdete v poradci pro zabezpečení.
    HMAC.Create() HMACSHA1() U většiny moderních aplikací se nedoporučuje HMACSHA1 algoritmus. Pokud je to možné, zvažte použití silnějšího algoritmu. Další pokyny najdete v poradci pro zabezpečení.
    KeyedHashAlgorithm.Create() HMACSHA1() U většiny moderních aplikací se nedoporučuje HMACSHA1 algoritmus. Pokud je to možné, zvažte použití silnějšího algoritmu. Další pokyny najdete v poradci pro zabezpečení.
    SymmetricAlgorithm.Create() Aes.Create()
  • Pokud je nutné pokračovat v volání zastaralých přetížení bez Create() parametrů, můžete potlačit SYSLIB0007 upozornění v kódu.

    #pragma warning disable SYSLIB0007 // Disable the warning.
    HashAlgorithm alg = HashAlgorithm.Create(); // Still throws PNSE.
    #pragma warning restore SYSLIB0007 // Re-enable the warning.
    

    Upozornění v souboru projektu můžete také potlačit. Tím se zakáže upozornění pro všechny zdrojové soubory v projektu.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below suppresses SYSLIB0007 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0007</NoWarn>
      </PropertyGroup>
    </Project>
    

    Poznámka:

    SYSLIB0007 Potlačení zakáže pouze upozornění na obsoletion pro zde uvedená rozhraní API kryptografie. Nezakážuje žádná další upozornění. Kromě toho, i když potlačíte upozornění, tato zastaralá rozhraní API budou za běhu stále vyvolat PlatformNotSupportedException .

Ovlivněná rozhraní API