L’instanciation des implémentations par défaut des abstractions de chiffrement n’est pas prise en charge

Les surcharges sans paramètre Create() sur les abstractions de chiffrement sont obsolètes en tant qu’avertissement à partir de .NET 5.0.

Description de la modification

Dans .NET Framework 2,0 - 4,8, des fabriques primitives de chiffrement abstraites comme HashAlgorithm.Create() peuvent être configurées pour retourner différents algorithmes. Par exemple, sur une installation par défaut de .NET Framework 4.8, la méthode statique HashAlgorithm.Create() sans paramètre retourne une instance de l’algorithme SHA1, comme indiqué dans l’extrait de code suivant.

.NET Framework uniquement

// 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());

Vous pouvez également utiliser la configuration à l’échelle de l’ordinateur pour modifier l’algorithme par défaut sans avoir à appeler CryptoConfig par programmation.

Dans .NET Core 2.0 - 3,1, les fabriques primitives de chiffrement abstraites comme HashAlgorithm.Create() lèvent toujours PlatformNotSupportedException.

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

Dans .NET 5 et versions ultérieures, les fabriques primitives de chiffrement abstraites comme HashAlgorithm.Create() sont marquées comme obsolètes et produisent un avertissement au moment de la compilation avec l’ID SYSLIB0007. Au moment de l’exécution, ces méthodes continuent à lever PlatformNotSupportedException.

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

Il s’agit d’une modification au moment de la compilation uniquement. Il n’y a aucune modification au moment de l’exécution par rapport aux versions précédentes de .NET Core.

Notes

  • Seules les surcharges sans paramètre des méthodes Create() sont obsolètes. Les surcharges paramétrables ne sont pas obsolètes et fonctionnent toujours comme prévu.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Les surcharges sans paramètre de familles d’algorithmes spécifiques (et non les abstractions) ne sont pas obsolètes et continueront à fonctionner comme prévu.

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

Raison du changement

Le système de configuration de chiffrement présent dans .NET Framework n’est plus présent dans .NET Core et .NET 5+, car ce système hérité ne permet pas une agilité de chiffrement appropriée. Les exigences de compatibilité descendante de .NET empêchent également le framework de mettre à jour certaines API de chiffrement pour suivre les progrès du chiffrement. Par exemple, la méthode HashAlgorithm.Create() a été introduite dans .NET Framework 1,0, lorsque l’algorithme de hachage SHA-1 était à la pointe de la technologie. Vingt ans se sont écoulés, et maintenant SHA-1 est considéré comme obsolète, mais nous ne pouvons pas changer HashAlgorithm.Create() pour retourner un autre algorithme. Cela entraînerait un changement cassant inacceptable dans la consommation des applications.

Les meilleures pratiques dictent que les bibliothèques qui consomment des primitives de chiffrement (comme AES, SHA-* et RSA) doivent avoir un contrôle total sur la façon dont elles consomment ces primitives. Les applications qui nécessitent d’être prêtes pour l’avenir doivent utiliser des bibliothèques de niveau supérieur qui encapsulent ces primitives et ajoutent des fonctionnalités de gestion des clés et d’agilité de chiffrement. Ces bibliothèques sont souvent fournies par l’environnement d’hébergement. La bibliothèque de protection des données de ASP.NET en est un exemple ; elle gère ces problèmes pour le compte de l’application appelante.

Version introduite

5,0

  • Le plan d’action recommandé consiste à remplacer les appels aux API désormais obsolètes par des appels aux méthodes de fabrique pour des algorithmes spécifiques, par exemple Aes.Create(). Cela vous donne un contrôle total sur les algorithmes instanciés.

  • Si vous devez maintenir la compatibilité avec les charges utiles existantes générées par les applications .NET Framework qui utilisent les API désormais obsolètes, utilisez les remplacements suggérés dans le tableau suivant. Le tableau fournit un mappage entre les algorithmes par défaut de .NET Framework et leurs équivalents .NET 5+.

    .NET Framework Remplacement compatible .NET Core/.NET 5+ Remarques
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() L’algorithme SHA-1 est considéré comme rompu. Envisagez d’utiliser un algorithme plus fort si possible. Pour obtenir des conseils supplémentaires, contactez votre conseiller en sécurité.
    HMAC.Create() HMACSHA1() L’algorithme HMACSHA1 est déconseillé pour la plupart des applications modernes. Envisagez d’utiliser un algorithme plus fort si possible. Pour obtenir des conseils supplémentaires, contactez votre conseiller en sécurité.
    KeyedHashAlgorithm.Create() HMACSHA1() L’algorithme HMACSHA1 est déconseillé pour la plupart des applications modernes. Envisagez d’utiliser un algorithme plus fort si possible. Pour obtenir des conseils supplémentaires, contactez votre conseiller en sécurité.
    SymmetricAlgorithm.Create() Aes.Create()
  • Si vous devez continuer à appeler les surcharges obsolètes sans paramètre Create(), vous pouvez supprimer l’avertissement SYSLIB0007 dans le code.

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

    Vous pouvez également supprimer l’avertissement dans votre fichier projet. Cela désactive l’avertissement pour tous les fichiers sources au sein du projet.

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

    Notes

    La suppression de SYSLIB0007 désactive uniquement les avertissements d’obsolescence pour les API de chiffrement répertoriées ici. Cela ne désactive aucun autre avertissement. En outre, même si vous supprimez l’avertissement, ces API obsolètes lèveront toujours PlatformNotSupportedException au moment de l’exécution.

API affectées