MD5, l'algorithme de hachage utilisé pour comparer des fichiers

Tout le monde connaît la somme MD5 qui permet de savoir si un fichier est authentique et intègre : on compare l'empreinte MD5 du dit fichier avec une valeur de référence ; s'il y a égalité, alors le fichier est intègre.

A une époque, l'algorithme MD5 était utilisé pour la cryptographie (notamment le stockage des mots de passe - dans Debian 5.0, les mots de passe sont par défaut conservés sous forme d'empreinte MD5 dans le /etc/shadow - avec Debian 6.0, le standard est passé à SHA-512). Toutefois, il a été démontré que l'empreinte MD5 n'était pas infaillible (pour des raisons que nous ne détaillerons pas ici) et le monde cryptographique s'en est détourné pour notamment les algorithmes SHA.

En revanche, l'algorithme MD5 continue à être utilisé (sans que cela ne pose de risque ni ne soit un problème) pour comparer des fichiers.

Curieux, je me suis livré aujourd'hui à un petit test : je voulais m'assurer que l'algorithme MD5 permettait effectivement de repérer des différences même minimes dans des fichiers - l'algorithme décrit sur Wikipedia par exemple rassure également sur ce point.

Je suis donc parti d'un document .odt :

42b0f02e6f5e1ebcbd59741d8650b0a3  fichier.odt

J'ai modifié une lettre de ce même fichier :

4e53f713ec0abedd31f6674ff8a69038  fichier.odt

La modification est bien visible

J'ai alors re-modifié le document afin de revenir à la version initiale :

f02e188d6bc72b69ca153e7d1e0e2e27  fichier.odt

Conclusion : sans doute d'autres parties du fichier odt ont été modifiées, par exemple (mais cela reste à découvrir exactement) un historique des opérations ou un marqueur des dernières modifications.

Evidemment, si j'effectue les mêmes opérations sur un fichier texte, alors je constate bien que l'on retrouve la somme MD5 quand on revient à la version initiale (contenu identique) du fichier.

Question subsidiaire : si je souhaite vous prouver que je ne modifie pas un document sans vous envoyer son contenu (qui est peut-être confidentiel), je vous envoie la somme MD5 du document à l'instant t, que l'on notera MD5(fichier, temps t). A t+1, si vous constatez que MD5(fichier, temps t+1) est différent de MD5(fichier, temps t) alors pouvez-vous conclure que le document a été modifié ? Et, plus important, si vous constatez que MD5(fichier, temps t+1) = MD5(fichier, temps t), êtes-vous certain que je n'ai pas modifié le document ? Question ouverte, je n'ai pas la réponse pour ma part - j'ai déposé la question sur un journal LinuxFr pour la soumettre à la sagacité des internautes.

http://linuxfr.org/users/pab/journaux/md5-et-garantie-de-non-modification

Mise à jour : les mêmes raisons qui ont fait abandonné MD5 en cryptographie (i.e. la non résistance aux collisions c'est-à-dire la possibilité de générer des contenus différents qui ont la même clé MD5) semblent faire dire que le MD5 ne convient pas - il faut lui préférer pour cet usage les algorithmes SHA (e.g. SHA-256). En fait, si on ajoute un coup de crypto assymétrique avec clé publique/privée, alors on obtient a priori la signature numérique.