Aikido

Cessez d'utiliser MD5 et SHA-1 : 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 largement utilisés dans les bases de code en production bien qu'ils soient cryptographiquement cassés depuis des décennies. MD5 est considéré comme non sécurisé depuis 2004, 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 d'intégrité, où les attaques par collision et les attaques de préimage posent de réels risques de 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 réalisables avec des ressources de cloud computing.

Pourquoi c'est important

Implications de sécurité : MD5 et SHA-1 sont vulnérables aux attaques par collision, où deux entrées différentes produisent la même sortie de hachage. Les attaquants exploitent cela pour créer des fichiers malveillants ayant le même hachage que des fichiers légitimes, contournant ainsi les vérifications d'intégrité. Pour le stockage des mots de passe, ces algorithmes sont catastrophiquement faibles car ils sont rapides, rendant les attaques par force brute et par table arc-en-ciel triviales. 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 craqué en quelques heures.

Risque de conformité et juridique : Les standards de sécurité comme 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 peut potentiellement bloquer l'accès à vos services.

Maintenabilité du code : Lorsque des algorithmes de hachage obsolètes sont découverts dans le code, ils nécessitent une remédiation immédiate. Cela crée une dette technique qui s'accumule avec le temps car la migration devient plus difficile à mesure que les données s'accumulent. L'adoption précoce d'algorithmes sécurisés prévient les migrations futures coûteuses et les correctifs de sécurité d'urgence.

Expansion 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 cassage 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 n'attend 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 de mots de passe n'offre aucune sécurité contre les outils de cassage modernes. SHA-1 pour l'intégrité des fichiers peut être contourné par des attaques par collision, permettant à des fichiers malveillants de passer la vérification. Les deux algorithmes sont peu coûteux en calcul pour une attaque par force 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) ralentit exponentiellement le cassage de mots de passe. SHA-256 pour l'intégrité des fichiers est résistant aux collisions sans attaques pratiques connues. Les deux algorithmes respectent les normes de sécurité actuelles et les exigences de conformité.

Conclusion

MD5 et SHA-1 n'ont pas leur place dans le code sensible à la sécurité. Leurs vulnérabilités sont bien documentées, des exploits sont publiquement disponibles, et des alternatives sécurisées existent dans tous les langages majeurs. 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 d'intégrité. Chaque jour où ces algorithmes faibles restent en production augmente votre surface d'attaque.

FAQ

Des questions ?

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

Uniquement dans des contextes non liés à la sécurité où la résistance aux collisions n'est pas requise : 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, documentez pourquoi l'algorithme plus faible est acceptable. Pour toute authentification, autorisation, vérification d'intégrité ou signature cryptographique, ces algorithmes ne sont jamais acceptables.

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

Utilisez bcrypt, scrypt ou Argon2. Ce sont des fonctions de hachage de mot de passe conçues spécifiquement, qui incluent le salage et sont intentionnellement lentes pour résister aux attaques par force brute. Argon2 est le standard moderne et a remporté le Password Hashing Competition en 2015. Évitez d'utiliser directement des fonctions de hachage à usage général comme SHA-256 pour les mots de passe car elles sont trop rapides. Si vous devez utiliser SHA-256, encapsulez-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écurisé et largement supporté. SHA-3 (Keccak) offre des garanties de sécurité encore plus robustes avec une structure interne différente, assurant une défense en profondeur si SHA-2 venait à être compromis. 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 sont résistants aux attaques de collision et de préimage connues.

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

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

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

Oui, mais pas d'une manière significative pour la sécurité. MD5 est plus rapide que SHA-256, ce qui est précisément 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 disque mesurées en millisecondes. Le bénéfice de sécurité l'emporte largement sur tout coût de performance.

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

HMAC-MD5 et HMAC-SHA-1 sont plus résistants aux attaques que les fonctions de hachage de base car HMAC offre des propriétés de sécurité supplémentaires. Cependant, ils sont toujours dépréciés dans la plupart des standards 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 codebase ?

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

Sécurisez-vous maintenant.

Sécuriser votre code, votre cloud et votre runtime dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Pas de carte de crédit requise | Résultats du scan en 32 secondes.