Dela via


Instansiering av standardimplementeringar av kryptografiska abstraktioner stöds inte

De parameterlösa Create() överlagringarna på kryptografiska abstraktioner är föråldrade som varning från och med .NET 5.0.

Ändra beskrivning

I .NET Framework 2.0– 4.8 kan abstrakta kryptografiska primitiva fabriker som HashAlgorithm.Create() kan konfigureras för att returnera olika algoritmer. Vid en standardinstallation av .NET Framework 4.8 returnerar till exempel den parameterlösa statiska metoden HashAlgorithm.Create() en instans av SHA1-algoritmen, som visas i följande kodfragment.

Endast .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());

Du kan också använda datoromfattande konfiguration för att ändra standardalgoritmen utan att behöva anropa programmatiskt CryptoConfig .

I .NET Core 2.0 – 3.1 genererar abstrakta kryptografiska primitiva fabriker som HashAlgorithm.Create() alltid en PlatformNotSupportedException.

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

I .NET 5 och senare versioner markeras abstrakta kryptografiska primitiva fabriker som HashAlgorithm.Create() föråldrade och skapar en kompileringstidsvarning med ID SYSLIB0007. Vid körning fortsätter dessa metoder att utlösa en PlatformNotSupportedException.

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

Det här är en kompileringstidsändring. Det finns ingen körningsändring från tidigare versioner av .NET Core.

Kommentar

  • Endast de parameterlösa överlagringarna av Create() metoderna är föråldrade. Parametriserade överlagringar är inte föråldrade och fungerar fortfarande som förväntat.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Parameterlösa överlagringar av specifika algoritmfamiljer (inte abstraktioner) är inte föråldrade och fortsätter att fungera som förväntat.

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

Orsak till ändringen

Det kryptografiska konfigurationssystemet som finns i .NET Framework finns inte längre i .NET Core och .NET 5+, eftersom det äldre systemet inte tillåter korrekt kryptografisk flexibilitet. . NET:s krav på bakåtkompatibilitet förbjuder också ramverket från att uppdatera vissa kryptografiska API:er för att hålla jämna steg med framstegen inom kryptografi. Metoden introducerades till exempel HashAlgorithm.Create() i .NET Framework 1.0 när SHA-1-hashalgoritmen var toppmodern. Tjugo år har gått och nu anses SHA-1 vara bruten, men vi kan inte ändra HashAlgorithm.Create() för att returnera en annan algoritm. Om du gör det skulle en oacceptabel icke-bakåtkompatibel ändring av användningsprogram införas.

Bästa praxis kräver att bibliotek som använder kryptografiska primitiver (till exempel AES, SHA-*och RSA) ska ha fullständig kontroll över hur de använder dessa primitiver. Program som kräver framtidssäkrande bör använda bibliotek på högre nivå som omsluter dessa primitiver och lägger till funktioner för nyckelhantering och kryptografisk flexibilitet. Dessa bibliotek tillhandahålls ofta av värdmiljön. Ett exempel är ASP. NET:s dataskyddsbibliotek, som hanterar dessa problem för det anropande programmets räkning.

Version introducerad

5,0

  • Den rekommenderade åtgärden är att ersätta anrop till nu föråldrade API:er med anrop till fabriksmetoder för specifika algoritmer, Aes.Create()till exempel . Detta ger dig fullständig kontroll över vilka algoritmer som instansieras.

  • Om du behöver upprätthålla kompatibiliteten med befintliga nyttolaster som genereras av .NET Framework-appar som använder de nu föråldrade API:erna använder du de ersättningar som föreslås i följande tabell. Tabellen innehåller en mappning från .NET Framework-standardalgoritmer till deras .NET 5+-motsvarigheter.

    .NET Framework .NET Core/.NET 5+ kompatibel ersättning Kommentarer
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() SHA-1-algoritmen anses vara bruten. Överväg att använda en starkare algoritm om det är möjligt. Kontakta din säkerhetsrådgivare för ytterligare vägledning.
    HMAC.Create() HMACSHA1() Algoritmen HMACSHA1 rekommenderas inte för de flesta moderna program. Överväg att använda en starkare algoritm om det är möjligt. Kontakta din säkerhetsrådgivare för ytterligare vägledning.
    KeyedHashAlgorithm.Create() HMACSHA1() Algoritmen HMACSHA1 rekommenderas inte för de flesta moderna program. Överväg att använda en starkare algoritm om det är möjligt. Kontakta din säkerhetsrådgivare för ytterligare vägledning.
    SymmetricAlgorithm.Create() Aes.Create()
  • Om du måste fortsätta att anropa föråldrade parameterlösa Create() överlagringar kan du utelämna varningen SYSLIB0007 i koden.

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

    Du kan också ignorera varningen i projektfilen. Om du gör det inaktiveras varningen för alla källfiler i projektet.

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

    Kommentar

    Om du utelämnar SYSLIB0007 inaktiveras endast obsoletionsvarningarna för kryptografi-API:erna som anges här. Inga andra varningar inaktiveras. Även om du undertrycker varningen utlöser dessa föråldrade API:er fortfarande en PlatformNotSupportedException vid körning.

Berörda API:er