Il est bien connu que SHA1 est recommandé plus que MD5 pour le hachage car MD5 est pratiquement cassé car de nombreuses collisions ont été trouvées. Avec l'attaque d'anniversaire, il est possible d'obtenir une collision dans MD5 avec 264 complexité et avec 280 complexité dans SHA1
Il est connu qu'il existe des algorithmes capables de casser ces deux en moins de temps qu'il n'en faut pour une attaque d'anniversaire.
Ma question est: le MD5 est-il considéré comme non sûr uniquement pour cette raison qu'il est facile de produire des collisions? Parce qu'en regardant les deux, produire des collisions dans SHA1 n'est pas si difficile non plus. Alors, qu'est-ce qui rend SHA1 meilleur?
Mise à jour 02/2017 - https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html
Produire des collisions SHA-1 n'est pas si facile. Il semble raisonnable que l'attaque avec a été décrite sur SHA-1 fonctionne vraiment avec un coût moyen de 261, beaucoup plus rapide que l'attaque générique d'anniversaire (qui est en 280), mais toujours assez difficile ( faisable , mais cher).
Cela étant dit, nous ne savons pas vraiment ce qui rend les fonctions de hachage résistantes (voir par exemple cette réponse pour une discussion détaillée). Avec beaucoup d'ondulations de la main, je pourrais affirmer que SHA-1 est plus robuste que MD5 parce qu'il a plus de tours et parce que la dérivation des 80 mots de message dans SHA-1 est beaucoup plus "mélangée" que celle de MD5 (dans en particulier la rotation de 1 bit, qui, soit dit en passant, est la seule différence entre SHA-0 et SHA-1, et des collisions SHA-0 ont été produites).
Pour plus de la même chose, regardez SHA-256, qui est beaucoup plus "massif" (beaucoup plus d'opérations que SHA-1, mais avec une structure similaire), et actuellement ininterrompu. C'est comme s'il y avait un minimum d'opérations pour qu'une fonction de hachage soit sécurisée, pour une structure donnée (mais là, je bouge mes mains à une vitesse incroyable, alors ne croyez pas que j'ai dit quelque chose de vraiment scientifique ou profond).
Non. Ce n'est pas seulement la longueur de la sortie. Il existe des différences significatives dans leur niveau de sécurité contre les attaques cryptanalytiques.
Il y a des attaques dévastatrices par collision sur MD5. (Le article Wikipedia sur MD5 contient quelques détails.) Ces attaques signifient que MD5 n'offre essentiellement aucune sécurité contre les collisions: il est facile de trouver des collisions dans MD5.
En revanche, SHA1 semble être beaucoup plus sûr. Bien qu'il existe des attaques connues contre SHA1, elles sont beaucoup moins graves que les attaques contre MD5. (Le article Wikipedia sur SHA1 a un aperçu.) Pour cette raison, SHA1 est un bien meilleur choix que MD5 dans de nombreux contextes.
De nos jours, au lieu d'utiliser MD5 ou SHA1, vous êtes probablement encore mieux à utiliser l'une des fonctions de hachage les plus modernes, comme SHA256. Ceux-ci n'ont pas d'attaques connues ayant une pertinence pratique.
Mais n'utilisez certainement pas MD5 dans un environnement où une résistance aux collisions est nécessaire, car cet aspect de MD5 est complètement rompu.
Le niveau de sécurité fourni par une fonction de hachage est basé sur la difficulté de générer un texte brut qui produira une signature de hachage donnée (la sortie du hachage). Un hachage est une méthode rapide de simplification d'un ensemble de données pour indiquer qu'un utilisateur possède les données d'origine sans réellement révéler les données. Cela peut être utile à la fois pour valider que quelqu'un est ce qu'il dit être (en comparant un hachage de quelque chose que vous savez qu'il connaît à la valeur stockée) ainsi que pour valider qu'un message n'a pas été modifié. Parce qu'un hachage est plusieurs pour un (plusieurs valeurs produiront la même valeur de hachage), il est théoriquement difficile de travailler d'un hachage à la valeur d'origine. En raison du nombre élevé de valeurs de hachage possibles, il DEVRAIT être difficile d'obtenir un hachage pour produire une sortie donnée.
Ce n'est malheureusement pas toujours vrai. L'attente que certaines valeurs correspondent à une entrée lisible par l'homme permet des attaques par dictionnaire appelées tables Rainbow contre un hachage pour tenter de découvrir la valeur d'origine. Le salage (l'ajout d'une entrée non lisible par l'homme au début ou à la fin d'une entrée) est une tentative d'empêcher les tables Rainbow de fonctionner car elles devraient être faites pour chaque sel différent.
L'autre problème, et celui qui se rapporte à votre question, est celui des collisions de hachage. Une collision de hachage se produit chaque fois que deux entrées données produisent la même sortie de hachage. Afin de valider que les données n'ont pas été modifiées, il ne doit pas être facilement possible de générer un hachage pour un ensemble de données modifié correspondant au hachage de l'original. Malheureusement, MD5 est complètement compromis à cet égard, car il existe plusieurs façons de trouver relativement facilement les modifications qui peuvent être apportées à la fin ou au début d'une charge utile pour la faire apparaître comme valide. SHA-1 a également quelques compromis mineurs à cet égard qui ont été récemment découverts, mais ils sont moins graves que les problèmes MD5. L'utilisation de quelque chose comme SHA256 est encore plus sûre car elle n'a actuellement aucune attaque connue contre les collisions de hachage.