CA5379 : vérifiez que l’algorithme de la fonction de dérivation de clés est suffisamment fort

Propriété Value
Identificateur de la règle CA5379
Titre Vérifier que l'algorithme de la fonction de dérivation de clés est suffisamment fort
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Utilisation de l’un des algorithmes suivants lors de l’instanciation de System.Security.Cryptography.Rfc2898DeriveBytes :

Description de la règle

La classe Rfc2898DeriveBytes utilise par défaut l’algorithme SHA1. Lors de l’instanciation d’un objet Rfc2898DeriveBytes, vous devez spécifier un algorithme de hachage de SHA256 ou supérieur. Notez que la propriété Rfc2898DeriveBytes.HashAlgorithm n’a qu’un accesseur get.

Comment corriger les violations

Puisque MD5 ou SHA1 sont vulnérables aux collisions, utilisez SHA256 ou supérieur pour la classe Rfc2898DeriveBytes.

Les versions antérieures de .NET Framework ou .NET Core peuvent ne pas vous permettre de spécifier un algorithme de hachage de fonction de dérivation de clé. Dans ce cas, vous devez mettre à niveau la version de l’infrastructure cible de .NET pour utiliser un algorithme plus fort.

Quand supprimer les avertissements

Il n’est pas recommandé de supprimer cette règle, sauf pour des raisons de compatibilité des applications.

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 CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379

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.CA5379.severity = none

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

Exemples de pseudo-code

Spécifiez l’algorithme de hachage en infraction du constructeur

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

Spécifiez l’algorithme de hachage dans l’infraction du constructeur de la classe dérivée

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

Définissez la propriété d’algorithme de hachage dans l’infraction des classes dérivées

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }

    public HashAlgorithmName HashAlgorithm { get; set;}
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
        derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
    }
}

Solution

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
    }
}