La creazione di istanze di implementazioni predefinite di astrazioni crittografiche non è supportata

Gli overload Create() senza parametri nelle astrazioni crittografiche sono obsoleti e generano un avviso a partire da .NET 5.0.

Descrizione delle modifiche

In .NET Framework 2.0 - 4.8 è possibile configurare factory primitive crittografiche astratte, ad esempio HashAlgorithm.Create(), in modo che restituiscano algoritmi diversi. Ad esempio, in un'installazione predefinita di .NET Framework 4.8, il metodo statico HashAlgorithm.Create() senza parametri restituisce un'istanza dell'algoritmo SHA1, come illustrato nel frammento di codice seguente.

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

È anche possibile usare la configurazione a livello di computer per cambiare l'algoritmo predefinito senza la necessità di effettuare una chiamata in CryptoConfig a livello di codice.

In .NET Core 2.0 - 3.1 le factory primitive crittografiche astratte come HashAlgorithm.Create() generano sempre un'eccezione PlatformNotSupportedException.

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

In .NET 5 e versioni successive le factory primitive crittografiche astratte come HashAlgorithm.Create() sono contrassegnate come obsolete e generano un avviso in fase di compilazione con ID SYSLIB0007. In fase di esecuzione questi metodi continuano a generare un'eccezione PlatformNotSupportedException.

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

Questa modifica riguarda solo la fase di compilazione. Non è stata apportata alcuna modifica in fase di esecuzione rispetto alle versioni precedenti di .NET Core.

Nota

  • Solo gli overload senza parametri dei metodi Create() sono obsoleti. Gli overload con parametri non sono obsoleti e funzionano ancora come previsto.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Gli overload senza parametri di specifiche famiglie di algoritmi (non astrazioni) non sono obsoleti e continueranno a funzionare come previsto.

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

Motivo della modifica

Il sistema di configurazione della crittografia presente in .NET Framework non è più presente in .NET Core e .NET 5+, poiché tale sistema legacy non consente una corretta agilità crittografica. I requisiti di compatibilità con le versioni precedenti di .NET impediscono inoltre al framework di aggiornare determinate API crittografiche per tenere il passo con i progressi della crittografia. Ad esempio, in .NET Framework 1.0 è stato introdotto il metodo HashAlgorithm.Create() quando l'algoritmo hash SHA-1 era all'avanguardia. Sono passati vent'anni e ora SHA-1 è considerato obsoleto, ma non è possibile cambiare HashAlgorithm.Create() in modo che restituisca un algoritmo diverso. In caso contrario, si introdurrebbe una modifica che causa un'interruzione inaccettabile nelle applicazioni consumer.

Secondo la procedura consigliata, le librerie che utilizzano primitive crittografiche, come AES, SHA-*e RSA, dovrebbero avere il controllo completo sul modo in cui le utilizzano. Le applicazioni predisposte per il futuro dovranno utilizzare librerie di livello più alto che incapsulino queste primitive e aggiungano funzionalità chiave di agilità crittografica e di gestione. Queste librerie vengono spesso fornite dall'ambiente di hosting. Un esempio è la libreria Data Protection di ASP.NET, che gestisce questi aspetti per conto dell'applicazione chiamante.

Versione introdotta

5.0

  • Il corso d'azione consigliato consiste nel sostituire le chiamate alle API ormai obsolete con chiamate a metodi factory per algoritmi specifici, ad esempio Aes.Create(). In questo modo si ottiene il controllo completo sugli algoritmi di cui viene creata un'istanza.

  • Se è necessario mantenere la compatibilità con i payload esistenti generati dalle app .NET Framework che usano le API obsolete, usare le sostituzioni suggerite nella tabella seguente. La tabella fornisce un mapping dagli algoritmi predefiniti di .NET Framework ai rispettivi equivalenti di .NET 5+.

    .NET Framework Sostituzione compatibili di .NET Core/.NET 5+ Osservazioni:
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() L'algoritmo SHA-1 viene considerato obsoleto. È consigliabile usare un algoritmo più avanzato, se possibile. Per altre indicazioni, rivolgersi al consulente per la sicurezza.
    HMAC.Create() HMACSHA1() L'uso dell'algoritmo HMACSHA1 è sconsigliato per la maggior parte delle applicazioni moderne. È consigliabile usare un algoritmo più avanzato, se possibile. Per altre indicazioni, rivolgersi al consulente per la sicurezza.
    KeyedHashAlgorithm.Create() HMACSHA1() L'uso dell'algoritmo HMACSHA1 è sconsigliato per la maggior parte delle applicazioni moderne. È consigliabile usare un algoritmo più avanzato, se possibile. Per altre indicazioni, rivolgersi al consulente per la sicurezza.
    SymmetricAlgorithm.Create() Aes.Create()
  • Se è necessario continuare a chiamare gli overload Create() senza parametri obsoleti, è possibile eliminare l'avviso SYSLIB0007 nel codice.

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

    È anche possibile eliminare l'avviso nel file di progetto. In questo modo l'avviso viene disabilitato per tutti i file di origine all'interno del progetto.

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

    Nota

    L'eliminazione di SYSLIB0007 comporta solo la disabilitazione degli avvisi di obsolescenza per le API di crittografia elencate qui. Nessun altro avviso viene disabilitato. Inoltre, anche se si elimina l'avviso, queste API obsolete continueranno a generare un'eccezione PlatformNotSupportedException in fase di esecuzione.

API interessate