Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Empfohlene Aktion
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 dieSYSLIB0007
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.