CA5351 N’utilisez pas les algorithmes de chiffrement cassés

Propriété Value
Identificateur de la règle CA5351
Titre N’utilisez pas les algorithmes de chiffrement cassés
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Notes

Cet avertissement a été mis à jour pour la dernière fois en novembre 2015.

Cause

Les fonctions de hachage telles que MD5 et les algorithmes de chiffrement tels que DES et RC2 peuvent présenter un risque substantiel et provoquer l’exposition d’informations sensibles au moyen de techniques d’attaque triviales telles que les collisions de hachage et les attaques par force brute.

Les algorithmes de chiffrement répertoriés ci-dessous sont soumise aux attaques cryptographiques. L’algorithme de hachage de chiffrement MD5 est soumis aux attaques par collision de hachage. En fonction de l’utilisation, une collision de hachage peut entraîner un emprunt d’identité, une falsification ou d’autres types d’attaques sur les systèmes qui reposent sur la sortie de chiffrement unique d’une fonction de hachage. Les algorithmes de chiffrement DES et RC2 sont soumis aux attaques de chiffrement qui peuvent entraîner une divulgation involontaire de données chiffrées.

Description de la règle

Les algorithmes de chiffrement cassés ne sont pas considérés comme sécurisés, et leur utilisation doit être déconseillée. L’algorithme de hachage MD5 est vulnérable à des attaques par collision connues, bien que la vulnérabilité varie en fonction du contexte d’utilisation. Les algorithmes de hachage utilisés pour garantir l’intégrité des données (par exemple une signature de fichier ou un certificat numérique) sont particulièrement vulnérables. Dans ce contexte, des personnes malveillantes peuvent générer deux éléments distincts de données (et donc remplacer des données ordinaires par des données malveillantes) sans modifier la valeur de hachage ou invalider une signature numérique associée.

Pour les algorithmes de chiffrement :

  • Le chiffrementDES contient une clé de petite taille qui peut être cassée par la force brute en moins d’une journée.

  • Le chiffrementRC2 est vulnérable à une attaque par clé associée, où le pirate recherche les relations mathématiques entre toutes les valeurs de clés.

Cette règle se déclenche quand elle détecte l’une des fonctions de chiffrement ci-dessus dans le code source et elle affiche un avertissement à l’utilisateur.

Comment corriger les violations

Utilisez des options de chiffrement plus fortes :

  • Pour MD5, utilisez des hachages de la famille SHA-2 (par exemple SHA512, SHA384, SHA256).

  • Pour DES et RC2, utilisez le chiffrement Aes .

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle, sauf s’il a été examiné par un expert en chiffrement.

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

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

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

Exemples de pseudo-code

L’exemple de pseudo-code suivant illustre le modèle détecté par cette règle et les alternatives possibles.

Violation de hachage MD5

using System.Security.Cryptography;
...
var hashAlg = MD5.Create();

Solution :

using System.Security.Cryptography;
...
var hashAlg = SHA256.Create();

Violation de chiffrement RC2

using System.Security.Cryptography;
...
RC2 encAlg = RC2.Create();

Solution :

using System.Security.Cryptography;
...
using (AesManaged encAlg = new AesManaged())
{
  ...
}

Violation de chiffrement DES

using System.Security.Cryptography;
...
DES encAlg = DES.Create();

Solution :

using System.Security.Cryptography;
...
using (AesManaged encAlg = new AesManaged())
{
  ...
}