Das Instanziieren von Standardimplementierungen kryptografischer Abstraktionen wird nicht unterstützt

Die Create()-Überladungen ohne Parameter in kryptografischen Abstraktionen gelten ab .NET 5.0 als Warnung als veraltet.

Änderungsbeschreibung

In .NET Framework 2.0–4.8 können abstrakte kryptografische Primitivfactorys wie HashAlgorithm.Create() so konfiguriert werden, dass sie verschiedene Algorithmen zurückgegeben. In einer Standardinstallation von .NET Framework 4.8 gibt die statische Methode HashAlgorithm.Create() ohne Parameter beispielsweise eine Instanz des SHA1-Algorithmus zurück. Sehen Sie sich dazu den folgenden Codeausschnitt an.

Nur für .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());

Sie können auch eine computerweite Konfiguration verwenden, um den Standardalgorithmus zu ändern, ohne CryptoConfig programmgesteuert aufrufen zu müssen.

In .NET Core 2.0–3.1 führen abstrakte kryptografische Primitivfactorys wie HashAlgorithm.Create() immer zu einer PlatformNotSupportedException-Ausnahme.

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

In .NET 5 und höheren Versionen sind abstrakte kryptografische Primitivfactorys wie HashAlgorithm.Create() als veraltet gekennzeichnet und führen zu einer Kompilierzeitwarnung mit der ID SYSLIB0007. Zur Laufzeit wird für diese Methoden weiterhin eine PlatformNotSupportedException-Ausnahme zurückgegeben.

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

Dies ist eine Änderung, die nur die Kompilierzeit betrifft. Hinsichtlich der Laufzeit gibt es keine Änderung im Vergleich zu früheren Versionen von .NET Core.

Hinweis

  • Nur die Überladungen der Create()-Methoden ohne Parameter sind veraltet. Parametrisierte Überladungen sind nicht veraltet und funktionieren weiterhin wie zu erwarten.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Überladungen ohne Parameter aus bestimmten Algorithmusfamilien (keine Abstraktionen) sind nicht veraltet und funktionieren weiterhin wie zu erwarten.

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

Grund für die Änderung

Das in .NET Framework vorhandene kryptografische Konfigurationssystem ist in .NET Core und .NET 5 und höher nicht mehr vorhanden, da das Legacysystem nicht die erforderliche kryptografische Agilität bieten kann. Die Anforderungen von .NET an die Abwärtskompatibilität hindern das Framework außerdem daran, bestimmte kryptografische APIs zu aktualisieren, um bei den Fortschritten der Kryptografie auf dem aktuellen Stand zu bleiben. Die HashAlgorithm.Create()-Methode wurde beispielsweise in .NET Framework 1.0 eingeführt, als der SHA-1-Hashalgorithmus aktuell war. Seitdem sind zwanzig Jahre vergangen, und SHA-1 gilt heute als nicht mehr funktionsfähig. HashAlgorithm.Create() kann aber nicht so geändert werden, dass ein anderer Algorithmus zurückgegeben wird. Diese Änderung würde einen nicht akzeptablen Breaking Change für das Verwenden von Anwendungen mit sich führen.

Laut Best Practices müssen Bibliotheken, die Kryptografieprimitive wie AES, SHA-* und RSA verwenden, die volle Kontrolle darüber haben, wie diese Primitive verwendet werden. Anwendungen, für die zukünftige Überprüfungen erforderlich sind, sollten höhere Bibliotheken verwenden, die diese Primitive einschließen, und Funktionen für Schlüsselverwaltung und kryptografische Agilität hinzufügen. Diese Bibliotheken werden oft von der Hostingumgebung bereitgestellt. Ein Beispiel ist die Datenschutzbibliothek von ASP.NET, die diese Bedenken für die aufrufende Anwendung auflösen kann.

Eingeführt in Version

5.0

  • Es wird empfohlen, Aufrufe der jetzt veralteten APIs für bestimmte Algorithmen, z. B. Aes.Create(), durch Aufrufe von Factorymethoden zu ersetzen. So haben Sie die vollständige Kontrolle darüber, welche Algorithmen instanziiert werden.

  • Wenn Sie die Kompatibilität mit vorhandenen von .NET Framework-Apps generierten Payloads aufrechterhalten müssen, die die nun veralteten APIs verwenden, verwenden Sie die in der folgenden Tabelle vorgeschlagenen Ersetzungen. Die Tabelle liefert Ihnen eine Zuordnung von Standardalgorithmen des .NET Frameworks zu ihren Entsprechungen in .NET 5 und höher.

    .NET Framework Mit .NET Core/.NET 5 und höher kompatible Ersetzung Bemerkungen
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() Der SHA-1-Algorithmus gilt als nicht mehr nutzbar. Sie sollten wenn möglich einen stärkeren Algorithmus verwenden. Wenden Sie sich an Ihren Sicherheitsberater, um weitere Schritte abzusprechen.
    HMAC.Create() HMACSHA1() Der HMACSHA1-Algorithmus sollte für die meisten modernen Anwendungen nicht verwendet werden. Sie sollten wenn möglich einen stärkeren Algorithmus verwenden. Wenden Sie sich an Ihren Sicherheitsberater, um weitere Schritte abzusprechen.
    KeyedHashAlgorithm.Create() HMACSHA1() Der HMACSHA1-Algorithmus sollte für die meisten modernen Anwendungen nicht verwendet werden. Sie sollten wenn möglich einen stärkeren Algorithmus verwenden. Wenden Sie sich an Ihren Sicherheitsberater, um weitere Schritte abzusprechen.
    SymmetricAlgorithm.Create() Aes.Create()
  • Wenn Sie die veralteten Create()-Überladungen ohne Parameter weiterhin aufrufen müssen, können Sie die SYSLIB0007-Warnung im Code unterdrücken.

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

    Sie können die Warnung auch in der Projektdatei unterdrücken. Wenn Sie dies tun, wird die Warnung für alle Quelldateien im Projekt deaktiviert.

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

    Hinweis

    Ein Unterdrücken von SYSLIB0007 deaktiviert nur die Veraltungswarnungen für die hier aufgeführten Kryptografie-APIs. Andere Warnungen werden nicht deaktiviert. Zusätzlich lösen diese veralteten APIs zur Laufzeit weiterhin eine PlatformNotSupportedException-Ausnahme aus, selbst wenn Sie die Warnung unterdrücken.

Betroffene APIs