Application Security

Pourquoi MD5 est mort : Plongée dans les stratégies modernes de hachage de mots de passe

Pendant des décennies, la règle d'or de la sécurité des mots de passe était simple : ne jamais stocker les mots de passe en texte clair. Cependant, à mesure que la puissance de calcul augmentait de manière exponentielle, les méthodes utilisées pour protéger ces mots de passe sont devenues obsolètes. Si vous utilisez encore MD5, SHA-1 ou même SHA-256 nu pour hacher les mots de passe dans votre application, les données de vos utilisateurs sont probablement en danger. Dans cet article, nous explorerons l'évolution du hachage de mots de passe, pourquoi les attaques par force brute et les tables arc-en-ciel rendent les algorithmes hérités dangereux, et comment mettre en œuvre des stratégies de hachage modernes et résilientes comme Argon2 et bcrypt.

L'évolution du hachage : De la fonction de hachage à la dérivation de clé

Il est crucial de distinguer une fonction de hachage cryptographique d'une fonction de dérivation de clé (KDF). Les fonctions de hachage à usage général comme SHA-256 sont conçues pour la vitesse et la vérification de l'intégrité. Elles sont déterministes ; une entrée identique produit toujours la même sortie. Bien que SHA-256 soit plus coûteux en calcul pour les attaquants par rapport à MD5, il est encore trop rapide. Un GPU moderne peut calculer des milliards de hachages SHA-256 par seconde, rendant les attaques par force brute réalisables même pour des mots de passe longs.

Le hachage de mots de passe nécessite une KDF. Ces fonctions sont spécifiquement conçues pour être lentes et gourmandes en ressources, en incorporant un sel et des paramètres configurables pour résister aux attaques accélérées par le matériel. La norme de l'industrie a évolué vers des algorithmes qui ne sont pas seulement lents, mais aussi résistants à la mémoire, rendant difficile pour les attaquants d'utiliser du matériel spécialisé comme les ASIC ou les FPGA.

Pourquoi les algorithmes hérités échouent

Regardons pourquoi les stratégies plus anciennes sont insuffisantes. MD5 est cryptographiquement cassé et criblé de vulnérabilités de collision. Il est essentiellement inutile pour la sécurité. SHA-1 partage des faiblesses similaires et est déprécié par le NIST. SHA-256, bien que toujours mathématiquement solide, manque des mécanismes de ralentissement intégrés (comme les itérations ou l'utilisation de mémoire) requis pour le stockage des mots de passe.

Une autre idée fausse courante est qu'ajouter un "sel" à un hachage rapide comme SHA-256 est suffisant. Bien que le salage empêche les attaques par tables arc-en-ciel en s'assurant que les mots de passe identiques ont des hachages différents, il ne ralentit pas le processus de force brute. Un attaquant peut toujours deviner des millions de mots de passe par seconde par GPU, même si chaque mot de passe est unique.

Stratégies recommandées : bcrypt et Argon2

Actuellement, les deux algorithmes les plus recommandés pour le hachage de mots de passe sont bcrypt et Argon2. bcrypt est la norme de l'industrie depuis plus d'une décennie et est bien pris en charge dans tous les langages majeurs. Il utilise le chiffrement Blowfish et vous permet de définir un facteur de coût (facteur de travail) pour déterminer la charge de calcul.

Cependant, Argon2 est le gagnant du Concours de hachage de mots de passe (PHC) et devient de plus en plus la nouvelle norme d'excellence. Argon2 est résistant à la mémoire, ce qui signifie qu'il nécessite une quantité significative de mémoire pour calculer le hachage. Cette caractéristique neutralise l'avantage des attaques matérielles parallélisées. Il existe trois variantes : Argon2id (recommandé pour le hachage de mots de passe), Argon2i et Argon2d.

Exemple pratique : Implémentation d'Argon2 en Python

Implémenter Argon2 est simple en utilisant la bibliothèque argon2-cffi. Voici un exemple pratique de la manière de hacher un mot de passe et de le vérifier de manière sécurisée.

import argon2

# Initialiser le hacheur avec les paramètres par défaut recommandés pour Argon2id
ph = argon2.PasswordHasher(
    time_cost=3,
    memory_cost=65536,
    parallelism=4,
    hash_len=16,
    salt_len=16
)

# Hacher un mot de passe
password = "user_secure_password_123"
hashed_password = ph.hash(password)

print(f"Mot de passe haché : {hashed_password}")

# Vérifier un mot de passe
try:
    is_valid = ph.verify(hashed_password, password)
    print(f"Le mot de passe est valide : {is_valid}")
except argon2.exceptions.VerifyMismatchError:
    print("Mot de passe invalide")

Dans cet exemple, time_cost représente le nombre d'itérations, memory_cost est la mémoire utilisée en KiB, et parallelism est le nombre de threads. Vous devez ajuster ces valeurs en fonction de la capacité de votre serveur pour vous assurer que le hachage prend environ 0,5 seconde sur votre matériel spécifique, ce qui est l'équilibre recommandé entre l'expérience utilisateur et la sécurité.

Bonnes pratiques au-delà de l'algorithme

Choisir le bon algorithme n'est que la moitié du travail. Voici d'autres bonnes pratiques pour assurer une sécurité robuste :

  1. Toujours saler : Les bibliothèques modernes comme Argon2 gèrent le salage automatiquement. Assurez-vous de ne jamais créer votre propre génération de sel.
  2. Re-hacher à la connexion : Si vous mettez à niveau vos facteurs de coût ou changez d'algorithme, re-hachez le mot de passe après une connexion réussie. Cela garantit que tous les mots de passe migrent éventuellement vers des paramètres plus forts.
  3. Limitation du débit : Mettez en œuvre une limitation du débit sur vos points de terminaison d'authentification pour empêcher les attaques par force brute en ligne.
  4. Audits réguliers : Passez périodiquement en revue vos dépendances de sécurité et respectez les directives de l'OWASP pour le stockage des mots de passe.

Conclusion

Le hachage de mots de passe n'est pas une tâche "réglez et oubliez". À mesure que la technologie évolue, les méthodes utilisées par les attaquants pour compromettre les données des utilisateurs évoluent également. En s'éloignant des fonctions de hachage génériques rapides et en adoptant des algorithmes résistants à la mémoire comme Argon2 ou le bcrypt éprouvé, vous élevez considérablement la barrière d'entrée pour les acteurs malveillants. Rappelez-vous, l'objectif du hachage de mots de passe n'est pas de rendre les mots de passe incassables, mais de rendre leur cracking prohibitivement coûteux et chronophage. Restez vigilant, maintenez vos bibliothèques à jour et priorisez la sécurité des utilisateurs à chaque couche de votre application.

Share: