Freigeben über


Das Instanziieren von Standardimplementierungen von kryptografischen 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 Primitive-Fabriken wie HashAlgorithm.Create() so konfiguriert werden, dass verschiedene Algorithmen zurückgegeben werden. Bei einer Standardinstallation von .NET Framework 4.8 gibt die parameterlose, statische Methode HashAlgorithm.Create() eine Instanz des SHA1-Algorithmus zurück, wie im folgenden Codeausschnitt gezeigt.

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 computerweite Konfiguration verwenden, um den Standardalgorithmus zu ändern, ohne programmgesteuert aufrufen CryptoConfig 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. Es gibt keine Laufzeitänderung von früheren Versionen von .NET Core.

Hinweis

  • Nur die parameterlosen Überladungen der Create() Methoden sind veraltet. Parametrisierte Überladungen sind nicht veraltet und funktionieren weiterhin wie erwartet.

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

    // 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 Änderung

Das kryptografische Konfigurationssystem, das in .NET Framework vorhanden ist, ist nicht mehr in .NET Core und .NET 5+ vorhanden, da dieses Legacysystem keine ordnungsgemäße kryptografische Flexibilität zulässt. . Die Abwärtskompatibilitätsanforderungen von NET verhindern auch, dass das Framework bestimmte kryptografische APIs aktualisiert, um mit fortschritten bei der Kryptografie schrittzuhalten. Beispielsweise wurde die HashAlgorithm.Create() Methode in .NET Framework 1.0 eingeführt, als der SHA-1-Hashalgorithmus state-of-the-art war. Zwanzig Jahre sind vergangen, und jetzt gilt SHA-1 als fehlerhaft, aber wir können nicht ändern HashAlgorithm.Create() , um einen anderen Algorithmus zurückzugeben. Diese Änderung würde einen nicht akzeptablen Breaking Change für das Verwenden von Anwendungen mit sich führen.

Bewährte Methoden diktieren, dass Bibliotheken, die kryptografische Grundtypen (z. B. AES, SHA-* und RSA) nutzen, in voller Kontrolle darüber sein sollten, wie sie diese Grundtypen nutzen. Anwendungen, die eine zukunftssichere Gestaltung erfordern, sollten Bibliotheken auf höherer Ebene verwenden, die diese primitiven Funktionen umschließen und Schlüsselmanagement- und kryptografische Agilitätsfunktionen hinzufügen. Diese Bibliotheken werden häufig von der Hostumgebung bereitgestellt. Ein Beispiel ist die ASP.NET-Datenschutzbibliothek, die diese Bedenken im Auftrag der aufrufenden Anwendung behandelt.

Eingeführte Version

5.0

  • Der empfohlene Handlungsverlauf besteht darin, Aufrufe der jetzt veralteten APIs durch Aufrufe von Factory-Methoden für bestimmte Algorithmen zu ersetzen, z. B. Aes.Create(). Dadurch erhalten Sie die vollständige Kontrolle darüber, welche Algorithmen instanziiert werden.

  • Wenn Sie die Kompatibilität mit vorhandenen Nutzlasten beibehalten müssen, die von .NET Framework-Apps generiert werden, die die jetzt veralteten APIs verwenden, verwenden Sie die in der folgenden Tabelle vorgeschlagenen Ersetzungen. Die Tabelle enthält eine Zuordnung von .NET Framework-Standardalgorithmen zu ihren .NET 5+-Entsprechungen.

    .NET Framework (Englisch) .NET Core / .NET 5+ kompatibler Ersatz Bemerkungen
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() Der SHA-1-Algorithmus gilt als fehlerhaft. Erwägen Sie die Verwendung eines stärkeren Algorithmus, wenn möglich. Weitere Anleitungen erhalten Sie von Ihrem Sicherheitsberater.
    HMAC.Create() HMACSHA1() Die Verwendung des HMACSHA1 Algorithmus wird für die meisten modernen Anwendungen nicht empfohlen. Erwägen Sie die Verwendung eines stärkeren Algorithmus, wenn möglich. Weitere Anleitungen erhalten Sie von Ihrem Sicherheitsberater.
    KeyedHashAlgorithm.Create() HMACSHA1() Die Verwendung des HMACSHA1 Algorithmus wird für die meisten modernen Anwendungen nicht empfohlen. Erwägen Sie die Verwendung eines stärkeren Algorithmus, wenn möglich. Weitere Anleitungen erhalten Sie von Ihrem Sicherheitsberater.
    SymmetricAlgorithm.Create() Aes.Create()
  • Wenn Sie die veralteten parameterlosen Create() Überladungen 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 Ihrer Projektdatei unterdrücken. Dadurch wird die Warnung für alle Quelldateien innerhalb des Projekts deaktiviert.

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

    Hinweis

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

Betroffene APIs