Aikido

Ne plus utiliser MD5 et SHA-1 : le hachage moderne pour la sécurité

Sécurité

Règle
Ne pas utiliser obsolètes de hachage périmés à moins qu'ils ne soient contexte 
contexte.Évitez d'utiliser obsolètes hachage périmés (MD5, SHA-1)
dans tout contexte sécurité. Ces sont cryptographiques
cassés, faciles facile brute-force, et nuire système la maintenabilité du système.

Langues prises en charge : 45+

Introduction

MD5 et SHA-1 restent très répandus dans les bases de code de production bien qu'ils soient cryptographiquement cassés depuis des décennies. MD5 est considéré comme non sécurisé depuis 2004, et SHA-1 depuis 2017. Pourtant, les développeurs continuent de les utiliser pour le hachage de mots de passe, les signatures numériques et la vérification de l'intégrité, alors que les attaques par collision et les attaques par préimage posent de réels risques pour la sécurité. Le coût de calcul pour générer des collisions MD5 est désormais trivial, et les attaques par collision SHA-1 sont pratiques avec les ressources de l'informatique en nuage.

Pourquoi c'est important

Implications en matière de sécurité : MD5 et SHA-1 sont vulnérables aux attaques par collision lorsque deux entrées différentes produisent le même résultat de hachage. Les attaquants exploitent ce phénomène pour créer des fichiers malveillants dont le hachage est identique à celui de fichiers légitimes, contournant ainsi les contrôles d'intégrité. Pour le stockage des mots de passe, ces algorithmes sont catastrophiquement faibles parce qu'ils sont rapides, rendant triviales les attaques par force brute et par table arc-en-ciel. Un GPU moderne peut calculer des milliards de hachages MD5 par seconde, ce qui signifie qu'un mot de passe de 8 caractères peut être déchiffré en quelques heures.

Conformité et risque juridique : Les normes de sécurité telles que PCI DSS, HIPAA et SOC 2 interdisent explicitement l'utilisation de MD5 et SHA-1 à des fins cryptographiques. Leur utilisation dans des environnements réglementés entraîne des échecs d'audit et une responsabilité juridique. Les principaux navigateurs avertissent désormais les utilisateurs lorsqu'ils rencontrent des certificats SHA-1, ce qui nuit à la confiance et risque de bloquer l'accès à vos services.

Maintenabilité du code : Lorsque des algorithmes de hachage obsolètes sont découverts dans le code, il faut immédiatement y remédier. Cela crée une dette technique qui s'alourdit au fil du temps, car la migration devient plus difficile à mesure que les données s'accumulent. L'adoption précoce d'algorithmes sécurisés permet d'éviter les migrations futures coûteuses et les correctifs de sécurité d'urgence.

Extension de la surface d'attaque : Les algorithmes de hachage faibles créent de multiples vecteurs d'attaque. Les bases de données de mots de passe deviennent vulnérables au craquage hors ligne. Les signatures numériques peuvent être falsifiées. Les systèmes d'intégrité des fichiers peuvent être contournés. Chaque utilisation de MD5 ou SHA-1 est un incident de sécurité potentiel qui ne demande qu'à se produire.

Exemples de code

❌ Non conforme :

const crypto = require('crypto');

function hashPassword(password) {
  return crypto.createHash('md5')
    .update(password)
    .digest('hex');
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha1')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Pourquoi ce n'est pas sûr : MD5 pour le hachage des mots de passe n'offre aucune sécurité contre les outils de piratage modernes. SHA-1 pour l'intégrité des fichiers peut être déjoué par des attaques par collision, ce qui permet à des fichiers malveillants de passer la vérification. Les deux algorithmes sont peu coûteux en termes de calcul et peuvent être forcés de manière brute.

✅ Conforme :

const crypto = require('crypto');

async function hashPassword(password) {
  const salt = crypto.randomBytes(16);
  return new Promise((resolve, reject) => {
    crypto.pbkdf2(password, salt, 310000, 32, 'sha256', (err, key) => {
      if (err) reject(err);
      resolve({ salt: salt.toString('hex'), hash: key.toString('hex') });
    });
  });
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha256')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Pourquoi c'est sûr : PBKDF2 avec SHA-256 et un nombre élevé d'itérations (310 000) rend le craquage de mots de passe exponentiellement plus lent. SHA-256 pour l'intégrité des fichiers est résistant aux collisions et ne fait l'objet d'aucune attaque pratique connue. Les deux algorithmes répondent aux normes de sécurité actuelles et aux exigences de conformité.

Conclusion

MD5 et SHA-1 n'ont pas leur place dans les codes sensibles à la sécurité. Leurs vulnérabilités sont bien documentées, les moyens de les exploiter sont accessibles au public et il existe des alternatives sûres dans tous les principaux langages. La voie de migration est claire : utilisez bcrypt, scrypt ou Argon2 pour les mots de passe, et SHA-256 ou SHA-3 pour la vérification de l'intégrité. Chaque jour où ces algorithmes faibles restent en production augmente votre surface d'attaque.

FAQ

Vous avez des questions ?

Quand est-il acceptable d'utiliser MD5 ou SHA-1 ?

Uniquement dans des contextes non sécurisés où la résistance aux collisions n'est pas nécessaire : clés de cache, ETags pour la distribution de contenu non sensible, ou sommes de contrôle pour détecter une corruption accidentelle des données (et non une altération malveillante). Même dans ce cas, il convient d'expliquer pourquoi l'algorithme le plus faible est acceptable. Ces algorithmes ne sont jamais acceptables pour l'authentification, l'autorisation, la vérification de l'intégrité ou la signature cryptographique.

Que dois-je utiliser à la place de MD5 et SHA-1 pour le hachage des mots de passe ?

Utilisez bcrypt, scrypt ou Argon2. Il s'agit de fonctions de hachage de mots de passe spécialement conçues, qui incluent le salage et sont volontairement lentes pour résister aux attaques par force brute. Argon2 est la norme moderne et a remporté la Password Hashing Competition en 2015. Évitez d'utiliser des fonctions de hachage générales telles que SHA-256 directement pour les mots de passe, car elles sont trop rapides. Si vous devez utiliser SHA-256, intégrez-le dans PBKDF2 avec au moins 310 000 itérations.

Qu'en est-il de SHA-256 ou SHA-3 pour l'intégrité des fichiers ?

SHA-256 est actuellement sûr et largement soutenu. SHA-3 (Keccak) offre des garanties de sécurité encore plus fortes avec une structure interne différente, fournissant une défense en profondeur si SHA-2 est cassé. Pour la plupart des applications, SHA-256 est suffisant. Utilisez SHA-512 pour une marge de sécurité supplémentaire ou lorsque vous travaillez avec de très grands ensembles de données. Les deux systèmes sont résistants aux attaques connues de collision et de préimage.

Comment migrer les hachages MD5/SHA-1 existants sans tout casser ?

Pour les mots de passe, mettez en place un double hachage pendant la migration : conservez temporairement les anciens hachages, mais lorsque les utilisateurs se connectent avec succès, réorganisez leur mot de passe avec le nouvel algorithme et mettez à jour la base de données. Pour les jetons d'API ou les hachages d'intégrité, modifiez votre format de hachage (par exemple, md5:abc123 contre sha256:def456) afin que les systèmes puissent gérer les deux pendant la transition. Fixez une date limite de migration et obligez les utilisateurs restants à réinitialiser leurs données après cette date.

Existe-t-il des différences de performance entre ces algorithmes ?

Oui, mais pas d'une manière qui soit importante pour la sécurité. MD5 est plus rapide que SHA-256, ce qui est exactement le problème pour le hachage de mots de passe où la lenteur est une caractéristique. Pour l'intégrité des fichiers, la différence de performance est négligeable sur le matériel moderne. SHA-256 ajoute des microsecondes à des opérations qui impliquent généralement des E/S sur disque mesurées en millisecondes. L'avantage en termes de sécurité l'emporte largement sur le coût en termes de performances.

Qu'en est-il de HMAC avec MD5 ou SHA-1 ?

Les fonctions HMAC-MD5 et HMAC-SHA-1 sont plus résistantes aux attaques que les fonctions de hachage de base, car HMAC offre des propriétés de sécurité supplémentaires. Cependant, elles sont toujours déconseillées dans la plupart des normes de sécurité. Utilisez plutôt HMAC-SHA-256. La différence de performance est minime et vous évitez les problèmes de conformité. HMAC-SHA-256 est approuvé pour une utilisation fédérale (FIPS 198-1) et répond à toutes les principales normes de sécurité.

Comment trouver toutes les instances de MD5/SHA-1 dans ma base de code ?

Recherche de motifs courants : md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Vérifier les configurations des dépendances pour les paramètres SSL/TLS utilisant des certificats SHA-1. Examinez les intégrations d'API avec des tiers qui pourraient nécessiter ces algorithmes. Les outils d'analyse automatisée du code peuvent détecter ces schémas dans plusieurs langues et les signaler pour examen.

Obtenir la sécurité gratuitement

Sécurisez votre code, votre cloud et votre environnement d'exécution dans un système central.
Trouvez et corrigez rapidement et automatiquement les vulnérabilités.

Aucune carte de crédit n'est requise | Scanner les résultats en 32sec.