Tworzenie wystąpień domyślnych implementacji abstrakcji kryptograficznych nie jest obsługiwane

Przeciążenia bez Create() parametrów w abstrakcjach kryptograficznych są przestarzałe jako ostrzeżenie na platformie .NET 5.0.

Opis zmiany

W programie .NET Framework 2.0 — 4.8 można skonfigurować abstrakcyjne fabryki pierwotne kryptograficzne, takie jak HashAlgorithm.Create() można skonfigurować tak, aby zwracały różne algorytmy. Na przykład w przypadku domyślnej instalacji programu .NET Framework 4.8 metoda HashAlgorithm.Create() bez parametrów zwraca wystąpienie algorytmu SHA1, jak pokazano w poniższym fragmencie kodu.

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

Możesz również użyć konfiguracji całej maszyny, aby zmienić domyślny algorytm bez konieczności programowego wywoływania CryptoConfig .

W programie .NET Core 2.0 — 3.1 abstrakcyjne fabryki pierwotne kryptograficzne, takie jak HashAlgorithm.Create() zawsze zgłaszają element PlatformNotSupportedException.

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

W wersjach .NET 5 i nowszych abstrakcyjne fabryki kryptograficzne, takie jak HashAlgorithm.Create() są oznaczone jako przestarzałe i generują ostrzeżenie dotyczące czasu kompilacji z identyfikatorem SYSLIB0007. W czasie wykonywania te metody nadal zgłaszają wartość PlatformNotSupportedException.

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

Jest to zmiana tylko w czasie kompilacji. Nie ma zmian w czasie wykonywania z poprzednich wersji platformy .NET Core.

Uwaga

  • Tylko bez parametrów przeciążenia Create() metod są przestarzałe. Przeciążenia sparametryzowane nie są przestarzałe i nadal działają zgodnie z oczekiwaniami.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Przeciążenia bez parametrów określonych rodzin algorytmów (nie abstrakcji) nie są przestarzałe i będą nadal działać zgodnie z oczekiwaniami.

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

Przyczyna wprowadzenia zmiany

System konfiguracji kryptograficznych obecny w programie .NET Framework nie jest już obecny w programach .NET Core i .NET 5+, ponieważ starszy system nie zezwala na właściwą elastyczność kryptograficzną. . Wymagania dotyczące zgodności z poprzednimi wersjami platformy również uniemożliwiają aktualizację niektórych interfejsów API kryptograficznych, aby nadążyć za postępami kryptografii. Na przykład HashAlgorithm.Create() metoda została wprowadzona w programie .NET Framework 1.0, gdy algorytm wyznaczania wartości skrótu SHA-1 był najnowocześniejsze. Minęły dwadzieścia lat, a teraz algorytm SHA-1 jest uznawany za uszkodzony, ale nie możemy zmienić HashAlgorithm.Create() , aby zwrócić inny algorytm. W ten sposób wprowadzono niedopuszczalną zmianę powodującą niezgodność w aplikacjach zużywających aplikacje.

Najlepsze rozwiązanie nakazuje, aby biblioteki, które używają kryptograficznych elementów pierwotnych (takich jak AES, SHA-*i RSA), powinny mieć pełną kontrolę nad sposobem korzystania z tych elementów pierwotnych. Aplikacje wymagające przyszłego sprawdzania powinny korzystać z bibliotek wyższego poziomu, które opakowujące te elementy pierwotne i dodają funkcje zarządzania kluczami i elastyczności kryptograficzne. Te biblioteki są często udostępniane przez środowisko hostingu. Jednym z przykładów jest asp. Biblioteka ochrony danych platformy NET, która obsługuje te problemy w imieniu aplikacji wywołującej.

Wprowadzona wersja

5,0

  • Zalecanym przebiegiem akcji jest zastąpienie wywołań do przestarzałych interfejsów API wywołaniami metod fabrycznych dla określonych algorytmów, na przykład Aes.Create(). Zapewnia to pełną kontrolę nad tym, które algorytmy są tworzone.

  • Jeśli musisz zachować zgodność z istniejącymi ładunkami wygenerowanymi przez aplikacje programu .NET Framework, które korzystają z przestarzałych interfejsów API, użyj zamian sugerowanych w poniższej tabeli. Tabela zawiera mapowanie z domyślnych algorytmów programu .NET Framework na odpowiedniki platformy .NET 5+.

    .NET Framework Wymiana zgodna z platformą .NET Core/.NET 5+ Uwagi
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() Algorytm SHA-1 jest uznawany za uszkodzony. Rozważ użycie silniejszego algorytmu, jeśli jest to możliwe. Aby uzyskać więcej wskazówek, zapoznaj się z doradcą ds. zabezpieczeń.
    HMAC.Create() HMACSHA1() Algorytm HMACSHA1 jest odradzany w przypadku większości nowoczesnych aplikacji. Rozważ użycie silniejszego algorytmu, jeśli jest to możliwe. Aby uzyskać więcej wskazówek, zapoznaj się z doradcą ds. zabezpieczeń.
    KeyedHashAlgorithm.Create() HMACSHA1() Algorytm HMACSHA1 jest odradzany w przypadku większości nowoczesnych aplikacji. Rozważ użycie silniejszego algorytmu, jeśli jest to możliwe. Aby uzyskać więcej wskazówek, zapoznaj się z doradcą ds. zabezpieczeń.
    SymmetricAlgorithm.Create() Aes.Create()
  • Jeśli musisz nadal wywoływać przestarzałe przeciążenia bez Create() parametrów, możesz pominąć SYSLIB0007 ostrzeżenie w kodzie.

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

    Możesz również pominąć ostrzeżenie w pliku projektu. Spowoduje to wyłączenie ostrzeżenia dla wszystkich plików źródłowych w projekcie.

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

    Uwaga

    Pomijanie SYSLIB0007 wyłącza tylko ostrzeżenia dotyczące obsoletionu dla interfejsów API kryptografii wymienionych tutaj. Nie wyłącza żadnych innych ostrzeżeń. Ponadto nawet jeśli pominiesz ostrzeżenie, te przestarzałe interfejsy API nadal będą zgłaszać PlatformNotSupportedException w czasie wykonywania.

Dotyczy interfejsów API