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 :
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Un algorithme que la règle ne peut pas déterminer au moment de la compilation
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);
}
}