Analyse Stratégique des Algorithmes de Hachage de Mots de Passe

Analyse Stratégique des Algorithmes de Hachage de Mots de Passe

La Sécurité des Mots de Passe, un combat en évolution

Dans notre monde numérique, la sécurité des données personnelles repose en grande partie sur la robustesse du stockage des mots de passe. Pourtant, derrière cette étape apparemment simple se cache une guerre technologique et stratégique, où chaque avancée en cryptographie doit faire face à des attaquants toujours plus ingénieux et équipés. La question n’est plus seulement de choisir un algorithme, mais de comprendre comment déployer une stratégie de défense qui évolue avec le temps, en intégrant à la fois la technique, l’économie et la psychologie des acteurs.

Malgré leurs faiblesses inhérentes et l'émergence de nouvelles méthodes d'authentification, les mots de passe demeurent la principale forme d'authentification pour la grande majorité des services en ligne. 

 

Comprendre pour mieux défendre

La sélection d'un algorithme de hachage approprié ne se limite pas à choisir le nom le plus récent ou le plus populaire. Elle nécessite une compréhension claire de ses principes de fonctionnement et des caractéristiques qui le rendent résistant aux attaques modernes. 

Hachage vs Chiffrement

Bien que souvent confondus, le hachage et le chiffrement sont deux processus cryptographiques distincts avec des objectifs différents. Le chiffrement est un processus bidirectionnel et réversible. Il transforme des données en clair (plaintext) en un format brouillé (ciphertext) à l'aide d'un algorithme et d'une clé. L'information originale peut être retrouvée en appliquant un processus de déchiffrement avec la clé correspondante. Le chiffrement est utilisé lorsque les données doivent être protégées au repos ou en transit, mais qu'un accès ultérieur à l'information originale est nécessaire. Le hachage, en revanche, est une fonction mathématique unidirectionnelle et irréversible. Il transforme une entrée de longueur variable en une sortie de longueur fixe, appelée "hash" ou "condensat". Il est conçu pour être pratiquement impossible de retrouver l'entrée originale à partir du hash seul.

Pour le stockage des mots de passe, le hachage est la méthode la plus appropriée. Lorsqu'un utilisateur s'authentifie, le système hache le mot de passe fourni et compare le résultat avec le hash stocké dans la base de données. Si les deux correspondent, l'accès est accordé. À aucun moment, le système n'a besoin de stocker ou de retrouver le mot de passe en clair, ce qui limite considérablement les risques en cas de compromission de la base de données.

Caractéristiques d’un bon algorithme de hachage

Un bon algorithme doit être :

  • Unidirectionnel : Cette irréversibilité empêche un attaquant d'extraire directement les mots de passe à partir des hashes volés.
  • Lent : un algorithme de hachage de mot de passe doit être intentionnellement lent. Cette lenteur rend les attaques par force brute, où un attaquant teste des milliards de mots de passe potentiels, extrêmement coûteuses en temps et en ressources de calcul.
  • Paramétrable : La puissance de calcul du matériel évolue constamment, conformément à la loi de Moore. Un algorithme robuste doit permettre d'ajuster sa complexité (son "facteur de travail") au fil du temps. En augmentant le nombre d'itérations ou le coût de calcul, nous pouvons nous assurer que le hachage reste suffisamment lent pour dissuader les attaquants.
  • Memory-hard : Cette caractéristique le rend particulièrement résistant aux attaques parallèles menées avec du matériel spécialisé comme les GPU (processeurs graphiques) ou les ASIC (circuits intégrés spécifiques à une application). Il nécessite une quantité importante de mémoire vive (RAM) pour être calculé. 
  • Salage : Le salage consiste à ajouter une chaîne de caractères aléatoire et unique pour chaque utilisateur (le "sel" ou “salt”) au mot de passe avant de le hacher. Cette technique simple mais efficace a deux avantages majeurs : elle empêche les attaques par tables arc-en-ciel ("rainbow tables"), qui sont des tables de hashes précalculés, et elle garantit que deux utilisateurs avec le même mot de passe auront des hashes complètement différents
     

Paradoxalement, plus un algorithme est lent, plus il est efficace pour la sécurité. La lenteur limite la vitesse des attaques par force brute, transformant une attaque coûteuse en une opération peu rentable. C’est une véritable course de vitesse et de ressources, où chaque milliseconde compte.

Les Algorithmes

un combat de générations


bcrypt

Créé en 1999 par Niels Provos et David Mazières, bcrypt est un classique (un peu vintage). Son principe repose sur le chiffrement Blowfish, avec un facteur de coût ajustable. Facile à implémenter, il a fait ses preuves dans des millions de systèmes. Cependant, sa faiblesse réside dans sa consommation mémoire limitée (environ 4 Ko), ce qui le rend vulnérable face aux attaques modernes utilisant des GPU ou des ASIC dédiés. Il reste une option valable pour des systèmes legacy ou des déploiements simples.

scrypt 

Créé en 2009 par Colin Percival, scrypt a été conçu pour rendre les attaques par matériel coûteuses en mémoire (Memory-hard). Son atout majeur est sa capacité à exiger une grande quantité de RAM, ce qui limite la puissance des GPU et ASIC, qui sont limités en mémoire par cœur de calcul. Toutefois, cette consommation élevée peut poser problème dans certains environnements. Son utilisation est recommandée dans des contextes où la sécurité maximale contre les attaques matérielles est une priorité, comme dans certaines cryptomonnaies (Litecoin) ou applications sensibles.

Argon2
Vainqueur de la Password Hashing Competition en 2015, Argon2 (Conçu par Alex Biryukov, Daniel Dinu et Dmitry Khovratovich) représente la crème de la cryptographie moderne. Avec ses trois variantes (Argon2d, Argon2i, Argon2id), il offre un équilibre entre résistance aux attaques par GPU, aux attaques par canaux auxiliaires**, et une grande flexibilité de configuration. Sa conception hybride Argon2id est aujourd’hui la référence pour le stockage sécurisé des mots de passe, combinant performance et sécurité. Étant plus récent, il peut avoir un support de bibliothèque moins universel que bcrypt et ne pas être disponible nativement dans les systèmes (disponible à l'installation sur Debian).

PBKDF2

Bien que PBKDF2 soit un algorithme établi et sûr lorsqu'il est bien configuré, il est généralement considéré comme le moins sécurisé des quatre principaux algorithmes modernes (Argon2, bcrypt, scrypt, PBKDF2) pour le hachage de mots de passe. Il est le plus rapide des quatre principaux algorithmes, ce qui est en fait un inconvénient pour le hachage de mots de passe. Il ne dispose pas de protection “memory-hard” ce qui le rend plus vulnérable aux attaques par GPU.

Au-delà de la technique

La puissance de la stratégie. Il ne suffit pas de choisir un algorithme robuste pour assurer la sécurité de ses mots de passes. La véritable force réside dans la capacité à anticiper et à modéliser le comportement de l’attaquant. La théorie des jeux, notamment le modèle de Stackelberg, permet de concevoir des stratégies où le défenseur (le système) agit en premier, en choisissant ses paramètres, et l’attaquant réagit en optimisant ses efforts. Cela conduit à des systèmes où l’attaque devient économiquement non rentable, même avec des ressources considérables.

Le rôle du "peppering" et du coût asymétrique
Cette technique consiste à ajouter un secret partagé, le "pepper", au processus de hachage en plus du sel ("salt"), ce qui complique la tâche de l’attaquant en augmentant le coût de chaque tentative. Contrairement au sel, qui est stocké avec le hash, le pepper est une valeur secrète globale qui doit être protégée (HSM ou un coffre-fort de secrets). Cette méthode doit être utilisée avec précaution : un pepper mal géré peut réduire l’efficacité de la défense, surtout si l’attaquant peut deviner ou compromettre cette valeur secrète.

Une approche plus sophistiquée, le "Cost-Asymmetric Memory Hard Password Hashing", ajuste dynamiquement le coût en fonction de l’adversaire, en choisissant des points d’arrêt aléatoires ("Time-even breakpoints") ou stratégiques ("Cost-even breakpoints") pour rendre chaque attaque spécifique plus coûteuse. Cela transforme la défense en une stratégie proactive, où chaque mot de passe devient une forteresse adaptée à son contexte.

Une stratégie efficace ne se limite pas à la sélection d’un algorithme. Elle doit prévoir la migration progressive vers des standards plus sûrs, en stockant les paramètres et en re-hachant les mots de passe lors de leur prochaine utilisation. La compatibilité avec des formats standardisés, comme ceux de la Password Hashing Competition, facilite cette transition.

Recommandations 

Le choix de l'algorithme doit être guidé par le contexte de l'application : sa modernité, ses contraintes et ses exigences de sécurité. Privilégier Argon2id avec des paramètres adaptés pour les nouveaux systèmes. Utiliser bcrypt si Argon2 ou scrypt ne sont pas disponibles ou si l'intégration se révèle trop fastidieuse. bcrypt reste un choix solide et éprouvé. Il est largement préférable aux algorithmes obsolètes comme MD5 ou SHA-1.

Recommandation de l'OWASP pour garantir un niveau de sécurité adéquat :

Algorithme Paramètres Minimaux Recommandés
Argon2id m (mémoire) = 19456 (19 MiB), t (itérations) = 2, p (parallélisme) = 1
bcrypt work factor (facteur de travail) ≥ 10. Note : l'entrée est limitée à 72 octets.
scrypt N (coût CPU/mémoire) = 2^17, r (taille de bloc) = 8, p (parallélisme) = 1
PBKDF2 Itérations ≥ 600,000 pour HMAC-SHA256 (NIST)

 

Dans les environnements qui exigent une conformité avec la norme FIPS-140 (Federal Information Processing Standards), PBKDF2-HMAC-SHA256 doit être utilisé, car il dispose d'implémentations validées.


Le choix d’un algorithme n’est qu’un début. La véritable sécurité réside dans la capacité à anticiper, à moduler et à faire évoluer ses défenses en fonction des menaces. Argon2, avec sa conception moderne, offre une protection robuste contre les attaques matérielles et par canaux auxiliaires. Mais la stratégie ne s’arrête pas là : il faut penser en termes d’économie, de psychologie et de gestion des risques. En combinant une sélection judicieuse d’algorithmes, une configuration adaptée, une gestion proactive des migrations, et une modélisation économique de l’adversaire, on construit une défense qui ne peut pas seulement être difficile à briser, mais qui devient aussi économiquement inviable à attaquer.

la sécurité n'est pas un état statique mais un processus dynamique

** Une attaque par canaux auxiliaires est une méthode par laquelle un acteur malveillant tente d'obtenir des informations sur un mot de passe ou un hachage en analysant des données indirectes résultant du processus de calcul, plutôt qu'en attaquant l'algorithme lui-même ou le résultat (le hachage). Ces attaques exploitent les propriétés physiques et les implémentations logicielles de l'algorithme sur le matériel.

Read more