CA5388 : Vérifier que le nombre d’itérations est suffisant lors de l’utilisation de la fonction de dérivation de clés faibles
Propriété | Value |
---|---|
Identificateur de la règle | CA5388 |
Titre | Vérifier que le nombre d’itérations est suffisant lors de l’utilisation de la fonction de dérivation de clés faibles |
Catégorie | Sécurité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Le nombre d’itérations peut être inférieur à 100 000 lors de la dérivation de la clé de chiffrement par System.Security.Cryptography.Rfc2898DeriveBytes.GetBytes.
Par défaut, cette règle analyse l’intégralité du codebase, mais elle est configurable.
Description de la règle
Cette règle vérifie si une clé de chiffrement a été générée par Rfc2898DeriveBytes avec un nombre d’itérations qui peut être inférieur à 100 000. Un nombre d’itérations plus élevé peut aider à atténuer les attaques de dictionnaire qui tentent de deviner la clé de chiffrement générée.
Cette règle est similaire à CA5387, mais l’analyse ne peut pas déterminer si le nombre d’itérations est inférieur à 100 000.
Comment corriger les violations
Définissez le nombre d’itérations sur une valeur supérieure ou égale à 100 000 avant d’appeler GetBytes explicitement.
Quand supprimer les avertissements
Vous pouvez sans risque supprimer les avertissements de cette règle si :
- Vous devez utiliser un nombre d’itérations plus petit à des fins de compatibilité avec les données existantes.
- Vous êtes sûr que le nombre d’itérations est défini sur une valeur supérieure à 100 000.
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 CA5388
// The code that's violating the rule is on this line.
#pragma warning restore CA5388
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.CA5388.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Configurer le code à analyser
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer ces options pour cette règle uniquement, pour toutes les règles auxquelles elles s’appliquent ou pour toutes les règles de cette catégorie (Sécurité) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Exclure des symboles spécifiques
Vous pouvez exclure de l’analyse des symboles spécifiques, comme des types et des méthodes. Par exemple, pour spécifier que la règle ne doit pas s’exécuter sur du code dans des types nommés MyType
, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du symbole uniquement (inclut tous les symboles avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole. Chaque nom de symbole nécessite un préfixe de type symbole, comme
M:
pour les méthodes,T:
pour les types etN:
pour les espaces de noms. .ctor
pour les constructeurs et.cctor
pour les constructeurs statiques.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Correspond à tous les symboles nommés MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Correspond à tous les symboles nommés MyType1 ou MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Correspond à une méthode MyMethod spécifique avec la signature complète spécifiée. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Correspond à des méthodes MyMethod1 et MyMethod2 spécifiques avec la signature complète spécifiée. |
Exclure des types spécifiques et leurs types dérivés
Vous pouvez exclure de l’analyse des types spécifiques et leurs types dérivés. Par exemple, pour spécifier que la règle ne doit s’exécuter sur aucune méthode dans des types nommés MyType
et leurs types dérivés, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du type uniquement (inclut tous les types avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole, avec un préfixe
T:
facultatif.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Correspond à tous les types nommés MyType et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Correspond à tous les types nommés MyType1 ou MyType2 , et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Correspond à un type MyType spécifique avec un nom complet donné et tous ses types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Correspond à des types MyType1 ou MyType2 spécifiques avec leur nom complet respectif et tous leurs types dérivés. |
Exemples de pseudo-code
Violation
using System;
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(string password, byte[] salt, int cb)
{
var iterations = 100;
Random r = new Random();
if (r.Next(6) == 4)
{
iterations = 100000;
}
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations);
rfc2898DeriveBytes.GetBytes(cb);
}
}
Solution
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(string password, byte[] salt, int cb)
{
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt);
rfc2898DeriveBytes.IterationCount = 100000;
rfc2898DeriveBytes.GetBytes(cb);
}
}