Conclusion: SHA-1 est aussi sûr que n'importe quoi contre les attaques de pré-image, mais il est facile à calculer, ce qui signifie qu'il est plus facile de monter une attaque bruteforce ou par dictionnaire. (La même chose est vraie pour les successeurs comme SHA-256.) Selon les circonstances, une fonction de hachage conçue pour être coûteuse en calcul (comme bcrypt) pourrait être un meilleur choix.
Certaines personnes lancent souvent des remarques comme "SHA-1 est cassé", alors j'essaie de comprendre ce que cela signifie exactement. Supposons que j'ai une base de données de hachages de mots de passe SHA-1 et qu'un attaquant avec un algorithme de rupture SHA-1 de pointe et un botnet avec 100000 machines y accède. (Avoir le contrôle de plus de 100 000 ordinateurs personnels signifierait qu'ils peuvent effectuer environ 10 à 15 opérations par seconde.) Combien de temps leur faudrait-il pour
- trouver le mot de passe d'un utilisateur?
- trouver le mot de passe d'un utilisateur donné?
- connaître le mot de passe de tous les utilisateurs?
- trouver un moyen de se connecter en tant que l'un des utilisateurs?
- trouver un moyen de se connecter en tant qu'utilisateur spécifique?
Comment cela change-t-il si les mots de passe sont salés? La méthode de salage (préfixe, suffixe, les deux ou quelque chose de plus compliqué comme xor-ing) est-elle importante?
Voici ma compréhension actuelle, après quelques recherches sur Google. Veuillez corriger les réponses si j'ai mal compris quelque chose.
- S'il n'y a pas de sel, une attaque arc-en-ciel trouvera immédiatement tous les mots de passe (sauf ceux extrêmement longs).
- S'il existe un salt aléatoire suffisamment long, le moyen le plus efficace de trouver les mots de passe est une attaque par force brute ou par dictionnaire. Ni les attaques de collision ni les attaques de pré-image ne sont d'une aide pour trouver le mot de passe réel, donc les attaques cryptographiques contre SHA-1 ne sont d'aucune aide ici. L'algorithme utilisé n'a même pas beaucoup d'importance - on pourrait même utiliser MD5 ou MD4 et les mots de passe seraient tout aussi sûrs (il y a une légère différence car le calcul d'un hachage SHA-1 est plus lent).
- Pour évaluer à quel point "tout aussi sûr" est sûr, supposons qu'une seule exécution sha1 nécessite 1000 opérations et que les mots de passe contiennent des majuscules, des minuscules et des chiffres (c'est-à-dire 60 caractères). Cela signifie que l'attaquant peut tester 10 15 * 60 * 60 * 24/1000 ~ = 10 17 mots de passe potentiels par jour. Pour une attaque par force brute, cela signifierait tester tous les mots de passe jusqu'à 9 caractères en 3 heures, jusqu'à 10 caractères en une semaine, jusqu'à 11 caractères en un an. (Cela prend 60 fois plus pour chaque caractère supplémentaire.) Une attaque par dictionnaire est beaucoup, beaucoup plus rapide (même un attaquant avec un seul ordinateur pourrait la retirer en quelques heures), mais ne trouve que des mots de passe faibles.
- Pour se connecter en tant qu'utilisateur, l'attaquant n'a pas besoin de trouver le mot de passe exact; il suffit de trouver une chaîne qui donne le même hachage. C'est ce qu'on appelle une première attaque de préimage. Autant que je sache, il n'y a pas d'attaques pré-image contre SHA-1. (Une attaque bruteforce nécessiterait 2 160 opérations, ce qui signifie que notre attaquant théorique aurait besoin de 10 à 30 ans pour la réaliser. Les limites de la possibilité théorique sont d'environ 2 60 opérations, au cours desquelles l'attaque prendrait quelques années.) Il y a des attaques de pré-image contre les versions réduites de SHA-1 avec un effet négligeable (pour le SHA-1 réduit qui utilise 44 pas au lieu de 80, le temps d'attaque est passé de 2160 opérations à 2157). Il y a des attaques par collision contre SHA-1 qui sont tout à fait dans les limites des possibilités théoriques ( le meilleur que j'ai trouvé ramène le temps de 2 80 à 2 52 ), mais celles-ci sont inutiles contre les hachages de mots de passe, même sans salage.
En bref, stocker les mots de passe avec SHA-1 semble parfaitement sûr. Ai-je oublié quelque chose?
Mise à jour: Marcelo a signalé un article qui mentionne une deuxième attaque pré-image dans 2 106 opérations . ( Edit: Comme Thomas l'explique , cette attaque est une construction hypothétique qui ne s'applique pas aux scénarios de la vie réelle.) Je ne vois toujours pas comment cela représente un danger pour l'utilisation de SHA-1 comme fonction de dérivation de clé, cependant. Existe-t-il généralement de bonnes raisons de penser qu'une attaque par collision ou une seconde attaque de pré-image peut éventuellement être transformée en une première attaque de pré-image?