Condividi tramite


L'istanza delle implementazioni predefinite delle astrazioni crittografiche non è supportata

Gli overload senza Create() parametri nelle astrazioni crittografiche generano un avviso di obsolescenza a partire da .NET 5.0.

Descrizione delle modifiche

In .NET Framework 2.0 - 4.8, è possibile configurare factory di primitive crittografiche astratte, come HashAlgorithm.Create(), per restituire algoritmi diversi. Ad esempio, in un'installazione predefinita di .NET Framework 4.8, il metodo HashAlgorithm.Create() statico 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 modificare l'algoritmo predefinito senza interagire a livello di codice con CryptoConfig.

In .NET Core 2.0 - 3.1, le fabbriche di primitivi crittografici astratti 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();

Si tratta di una modifica solo in fase di compilazione. Non sono state apportate modifiche di runtime rispetto alle versioni precedenti di .NET Core.

Annotazioni

  • Solo gli overload senza parametri delle metodi Create() sono obsoleti. I sovraccarichi parametrizzati 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 famiglie di algoritmi specifici (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 crittografico 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 anche al framework di aggiornare determinate API crittografiche per mantenere il passo con i progressi nella crittografia. Ad esempio, il HashAlgorithm.Create() metodo è stato introdotto in .NET Framework 1.0, quando l'algoritmo hash SHA-1 era all'avanguardia. Vent'anni sono passati, e ora SHA-1 è considerato rotto, ma non possiamo cambiare HashAlgorithm.Create() per restituire un algoritmo diverso. In questo modo si potrebbe introdurre una modifica che causa un'interruzione inaccettabile nell'utilizzo delle applicazioni.

La procedura consigliata determina che le librerie che usano primitive crittografiche (ad esempio AES, SHA-*e RSA) devono avere il controllo completo sul modo in cui usano queste primitive. Le applicazioni che devono essere adatte al futuro dovrebbero utilizzare librerie di livello superiore che incapsulano queste primitive e aggiungono funzionalità di gestione delle chiavi e agilità crittografica. Queste librerie vengono spesso fornite dall'ambiente di hosting. Un esempio è la libreria di protezione dei dati di ASP.NET, che gestisce questi problemi per conto dell'applicazione chiamante.

Versione introdotta

5.0

  • Il corso d'azione consigliato è sostituire le chiamate alle API ormai obsolete con chiamate a metodi di creazione per algoritmi specifici, ad esempio Aes.Create(). In questo modo è possibile controllare completamente gli 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 .NET 5+.

    .NET Framework Sostituzione compatibile con .NET Core/ .NET 5+ Osservazioni:
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() L'algoritmo SHA-1 viene considerato interrotto. Prendere in considerazione l'uso di un algoritmo più avanzato, se possibile. Per altre indicazioni, consultare il consulente per la sicurezza.
    HMAC.Create() HMACSHA1() L'algoritmo HMACSHA1 è sconsigliato per la maggior parte delle applicazioni moderne. Prendere in considerazione l'uso di un algoritmo più avanzato, se possibile. Per altre indicazioni, consultare il consulente per la sicurezza.
    KeyedHashAlgorithm.Create() HMACSHA1() L'algoritmo HMACSHA1 è sconsigliato per la maggior parte delle applicazioni moderne. Prendere in considerazione l'uso di un algoritmo più avanzato, se possibile. Per altre indicazioni, consultare il consulente per la sicurezza.
    SymmetricAlgorithm.Create() Aes.Create()
  • Se è necessario continuare a chiamare gli overload obsoleti senza parametri Create(), è possibile sopprimere 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 viene disabilitato l'avviso 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>
    

    Annotazioni

    SYSLIB0007 La soppressione disabilita solo gli avvisi di obsolescenza per le API di crittografia elencate qui. Non disabilita altri avvisi. Inoltre, anche se si elimina l'avviso, queste API obsolete genereranno comunque un'eccezione PlatformNotSupportedException in fase di esecuzione.

Le API interessate