CA5373 : Ne pas utiliser la fonction de dérivation de clé obsolète

Propriété Value
Identificateur de la règle CA5373
Titre Ne pas utiliser la fonction de dérivation de clé obsolète
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Les méthodes de dérivation de clé faible par chiffrement System.Security.Cryptography.PasswordDeriveBytes et/ou Rfc2898DeriveBytes.CryptDeriveKey sont utilisées pour générer une clé.

Description de la règle

Cette règle détecte l’appel des méthodes System.Security.Cryptography.PasswordDeriveBytes et Rfc2898DeriveBytes.CryptDeriveKey de dérivation de clé faible. System.Security.Cryptography.PasswordDeriveBytes a utilisé un algorithme faible PBKDF1. Rfc2898DeriveBytes.CryptDeriveKey n’utilise pas le nombre d’itérations et le sel de l’objet Rfc2898DeriveBytes, ce qui le rend faible.

Comment corriger les violations

La dérivation de clé basée sur mot de passe doit utiliser l’algorithme PBKDF2 avec hachage SHA-2. Rfc2898DeriveBytes.GetBytes peut être utilisé pour y parvenir.

Quand supprimer les avertissements

Supprimez l’avertissement si le risque associé à l’utilisation de PBKDF1 est soigneusement examiné et accepté.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA5373.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemples de pseudo-code

Violation

Au moment de l’écriture de cet article, l’exemple de pseudo-code suivant illustre le schéma détecté par cette règle.

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes, string algname, string alghashname, int keySize, byte[] rgbIV)
    {
        rfc2898DeriveBytes.CryptDeriveKey(algname, alghashname, keySize, rgbIV);
    }
}

Solution

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes)
    {
        rfc2898DeriveBytes.GetBytes(1);
    }
}