MD5, SHA-1, mais qu’est-ce que c’est ?

closeCet article a été publié il y a 9 ans 6 mois 25 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Vous avez forcément déjà vu ces deux termes, surtout si vous avez déjà regardé de près par exemple la page de téléchargement d’une distribution Linux « pour les noobs » qui vous propose de vérifier l’image DVD. Ce sont deux algorithmes de somme de contrôle, qui remplissent à peu près la même fonction : vérifier que votre téléchargement est conforme à ce que vous attendez. Alors, kézako ? et comment utiliser ses sommes ?

Un (tout petit) peu de maths et de définitions

Oui désolé, mais parfois on y coupe pas. Je ne vais pas non plus rentrer beaucoup dans les détails. Pour ça, il y a Wikipedia (MD5 et SHA-1). Pour la faire court, ce sont deux fonctions de hashage (à ne pas confondre avec du chiffrement), qui consistent à lire un fichier de n’importe quelle taille pour produire une chaîne de caractères hexadécimaux de taille fixe, et à priori unique. Je dis « à priori » parce des chercheurs ont trouvé quelques cas de concurrence dans MD5 : deux messages différents produisent le même hash. D’où l’utilisation de SHA-1 en parallèle ou en remplacement la plupart du temps.

md5sha1-math

MD5 produit une chaîne sur 128 bits, SHA-1 sur 160 bits, ce qui doit rendre ce dernier plus solide. Dans la pratique, si l’on doit considérer SHA-1 comme plus fiable, MD5 reste malgré tout très utilisé, la probabilité de tomber sur un concurrent étant diablement faible. Pour la petite histoire, MD5 a été inventé par Ronald Rivest, un cryptologue qui est aussi connu pour être le ‘R’ de RSA, qui à l’heure actuelle représente probablement la solution la plus solide pour chiffrer fortement des données. On lui doit aussi le RC4, qui est utilisé dans le chiffrement WPA de nos connexions WiFi. SHA-1, lui, a été publié par la NSA. Je sais, parler sécurité et NSA dans la même phrase, depuis les révélations d’Edward Snowden, c’est un peu contradictoire. M’enfin…

Et donc je rappelle que le hashage n’est pas du chiffrement. Un chiffrement implique de pouvoir retrouver le message/fichier d’origine, ce que ne permet pas le hashage, qui est définitif. C’est d’ailleurs un outil de choix pour le stockage de mot de passe, j’y reviendrais à la fin. Petit exemple rapide de ce que fait md5sum (en changeant un seul caractère) :

 Les outils pour vérifier/calculer les sommes de contrôle

Sous Linux (du moins sous Debian et Manjaro), il m’a semblé que les moyens de calculer les sommes MD5 et SHA-1 sont directement fournis de base (dans le paquet coreutils). Je vous invite à me corriger si jamais je dis une énorme connerie sur ce sujet. Bien évidemment, sous Windows, impossible de calculer tout ça sans installer des outils tiers. Pour les drogués à la souris, j’ai testé et vous propose donc QuickHash, qui permet de calculer les deux hashs qui nous intéressent aujourd’hui, mais aussi d’autres moins courants. Pour la ligne de commande, Microsoft fournit directement un outil, FCIV, disponible à cette adresse. Comme d’hab, j’envoie les végétariens se débrouiller tous seuls, il parait que tout est simple pour eux.

Il reste ensuite à choisir un bon exemple d’utilisation. Ça tombe bien, on va récupérer l’image ISO de Manjaro dans sa version KDE, pour laquelle les sommes MD5 et SHA-1 sont fournies.

Démonstration du hash pour un téléchargement

md5sha1-filelist

Donc sur la page de Sourceforge, j’ai récupéré l’image manjaro-kde-0.8.10-x86_64.iso, ainsi que les fichiers textes manjaro-kde-0.8.10-md5sum.txt et manjaro-kde-0.8.10-sha1sum.txt qui contiennent respectivement les sommes MD5 et SHA-1. Pour la suite, je vous conseille d’avoir ces trois fichiers dans le même dossier, on verra vite pourquoi.

L’outil de Microsoft porte bien son nom et démontre bien l’intérêt de ces sommes : vérifier l’intégrité d’un fichier, et donc qu’on a téléchargé EXACTEMENT la même version du fichier qui est sur le serveur. Car la réalité est là : il est possible de tomber sur un fichier frelaté/vérolé, ou bien, même si c’est moins fréquent à l’ère de l’ADSL, d’avoir des glitches lors de gros téléchargements et donc d’avoir parfois quelques bits de différences. On l’a vu en exemple, le moindre bit change la somme de contrôle, et dans le cas d’une image disque, un seul bit de différence peut la rendre inutilisable.

Bref, une fois l’iso récupérée, sous Linux, la méthode est très simple :

 Le fichier texte contient les sommes MD5 pour les deux images 32 et 64 bits. Comme l’on n’a récupéré que cette dernière, il alerte qu’il en manque une, logique. C’est la même musique pour SHA-1 :

Notez qu’on peut directement invoquer md5sum et sha1sum sur le fichier .iso, et comparer à la main la somme retournée avec celle indiquée dans le fichier texte. Voici un exemple de comment faire :

 Sous Windows, il suffit de cliquer sur l’onglet « Hash File », ensuite sur « Select File », de sélectionner notre fichier iso, ce qui va lancer le calcul (qui prend un peu de temps, comme sous Linux). On ouvre ensuite le fichier texte correspondant pour vérifier le calcul :

Exemple pour sha-1

Exemple pour sha-1 : c’est le bon fichier !

Mais comme je l’ai évoqué plus tôt, les sommes de contrôles ont d’autres utilités, et l’une d’elles devrait être obligatoire (et vous pourrez constater que je suis un mauvais élève en analysant le code de collect) dans tous vos projets.

Stockage de mots de passe « un peu » sécurisé

En effet, vous passez votre temps à utiliser des couples login/mot de passe sur le web, que ce soit sur Facebook, Twitter, Amazon, Next INpact, votre boite mail, enfin bref, un nombre de services incalculables qui nécessitent de vous identifier. Hors, si la bonne pratique voudrait qu’on utilise un mot de passe différent pour chaque service, la réalité est que souvent, le mot de passe est le même. Et l’actualité regorge d’annonces de services populaires s’étant fait attaquer pour voler des informations, et parmi celles-ci les mots de passe.

Autant dire que ne pas les stocker en clair est une évidence. Les stocker de manière à ne pas pouvoir deviner le mot de passe original à partir de sa forme stockée est aussi une évidence. MD5 et SHA-1 représentent donc des fonctions toutes indiquées pour remplir cet objectif de sécuriser vos mots de passe. Lorsque vous vous identifiez, le seul moyen de valider est de hasher le mot de passe que vous fournissez pour le comparer au hash stocké, et si les deux hashs sont identiques (puisque normalement, aucun autre mot de passe ne peut donner le même hash), alors vous êtes autorisés à entrer.

md5sha2-loginfield

Quand j’ai dit « un peu » dans le titre de cette partie, c’est qu’avec l’évolution de la puissance de calcul de nos machines, le hash simple ne suffit plus. Il est en effet devenu facile et abordable de « brute-forcer » un mot de passe hashé en MD5 ou SHA-1, c’est à dire tester une par une toutes les possibilités pour découvrir le mot de passe correspondant au hash caché derrière. Cet article (nouveau lien, merci l’Internet Archive), qui remonte pourtant déjà à 2009, illustre bien le problème : il était déjà possible, en poussant un ordinateur portable milieu de gamme de l’époque dans ses retranchements, de calculer 124 millions de hash par seconde ! Autant dire qu’en 2014 votre mot de passe, qui est probablement déjà simple à deviner (ben oui, le nom de votre fille, celui du chat, c’est pas une bonne idée, je vous l’avais déjà dit), risque de ne pas tenir longtemps.

Rassurez vous, il existe des solutions : si le hash est toujours utilisé, en pratique généralement votre mot de passe est « salé » avant, c’est à dire altéré, mélangé avec un motif si possible généré aléatoirement, avant de passer à la moulinette MD5/SHA-1. L’idée est que même en découvrant la version « en clair » du mot de passe hashé, celui-ci sera en théorie incompréhensible. Plusieurs méthodes sont possibles, plus ou moins compliquées, plus ou moins efficaces (compliqué ne rend pas forcément efficace, c’est même facile de se planter et d’obtenir l’effet inverse). Un exemple pour mettre en place ce qu’on appelle le « salt » en anglais (le sel) en PHP est visible ici. Ça permet de bien comprendre le principe.

Malheureusement, même en ayant salé le mot de passe, quand vous en volez plusieurs millions d’un seul coup sur un seul et même site, une fois « décodé » les mots de passe déformés, il devient un peu plus facile de comparer et d’en extraire la méthode de salage, et donc potentiellement votre mot de passe, le vrai, en clair. Avec les risques que ça entraîne sur votre vie en ligne et en dehors. Ce n’est pas pour rien que lors d’un vol de données, la société touchée soit vous enjoint fortement à changer votre mot de passe (et si vous utilisez le même partout, vous êtes bon pour répéter la manœuvre sur x sites), soit carrément réinitialise le mot de passe pour vous, et donc vous oblige à en changer. Ce qui ne doit alors pas vous empêcher de changer de mot de passe partout où il est utilisé.

Conclusion

md5sha1-wtf

Vous pouvez répéter la partie sur les trucs où vous avez parlé des choses ?

Comment conclure ? Eh bien maintenant vous savez ce qu’est un hash, et ses deux usages les plus répandus. A chaque fois, l’idée de base est la même : on calcule une empreinte d’un message/fichier, pour la comparer afin de vérifier que le message/fichier est conforme. Pour les développeurs qui souhaitent les utiliser dans leurs projets, chaque langage propose au moins une manière d’en créer, manipuler. La documentation du langage de votre projet est généralement le bon point de départ, avec par exemple PHP ou encore Python.

1 Commentaire
Le plus ancien
Le plus récent
Commentaires en ligne
Afficher tous les commentaires
K-Android
K-Android
06/09/2014 16:00

Merci super article moi qui ne savais pas à quoi cela servait .