Leçons 1/4 · 25 min
L'empreinte : un condensé de taille fixe
Comment vérifier 700 Mo sans les relire ?
Awa télécharge un logiciel de 700 Mo. Le site indique : « SHA-256 : ba78… ». Comment savoir que le fichier reçu est exactement celui publié, sans le comparer octet par octet avec un original qu'elle n'a pas ? Elle calcule une empreinte (en anglais digest ou hash) du fichier reçu et la compare à l'empreinte publiée : 64 caractères à comparer au lieu de 700 millions d'octets.
Qu'est-ce qu'une fonction de hachage ?
Une fonction de hachage prend des données de n'importe quelle taille (une suite d'octets) et renvoie une valeur de taille fixe. SHA-256, de la famille SHA-2 définie par la norme FIPS 180-4, renvoie toujours 256 bits, soit 32 octets. On les écrit en hexadécimal (base 16 : chiffres 0 à 9 puis lettres a à f), où chaque caractère représente 4 bits : 256 ÷ 4 = 64 caractères.
| Entrée (texte, codé en UTF-8) | Empreinte SHA-256 (64 caractères hexadécimaux) |
|---|---|
| (texte vide) | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
abc | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
Tapez abc dans le widget ci-dessous : vous devez retrouver la deuxième ligne. Un fichier de 700 Mo, lui aussi, donne 64 caractères.
Deux familles de fonctions « de hachage »
À l'atelier 102, la fonction de hachage d'une table sert à répartir des clés dans des cases : il suffit qu'elle soit rapide et bien répartie. Une fonction de hachage cryptographique doit en plus résister à quelqu'un qui cherche activement à la mettre en défaut. On utilise la première pour des structures de données, la seconde pour la sécurité. Quand on dit « hachage » sans précision dans la suite du cursus, on parle de la seconde.
Un piège de débutant : ce qu'on hache vraiment
On hache des octets. Pour un texte, ce sont les octets de son codage (ici UTF-8). Un espace en trop ou un retour à la ligne caché change l'empreinte :
printf 'hello' | sha256sum
# 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
echo hello | sha256sum
# 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03La seconde commande hache hello suivi d'un retour à la ligne (la commande echo en ajoute un). Ce n'est pas la même donnée, donc pas la même empreinte. Quand deux personnes ne trouvent pas la même empreinte pour « le même texte », c'est presque toujours une différence invisible de ce genre.
À quoi sert une empreinte ?
- Vérifier l'intégrité d'un fichier téléchargé ou copié (leçon 4).
- Identifier un contenu par son empreinte : le système de versions Git nomme ainsi chaque objet.
- S'engager sur une donnée sans la révéler tout de suite : on publie l'empreinte, on dévoile la donnée plus tard.
- Lier des blocs : chaque bloc contient l'empreinte du précédent (leçon 4, puis les ateliers de blockchain).
Ce que cela ne garantit pas
- Une empreinte seule ne dit pas qui a produit le fichier : n'importe qui peut calculer le SHA-256 de n'importe quoi. Prouver l'auteur demande une signature (atelier 105).
- Elle ne cache pas forcément la donnée (leçon 3).
- Deux fichiers dont les empreintes sont égales sont, en pratique, identiques ; l'inverse « empreintes différentes ⇒ fichiers différents » est, lui, absolument certain.
À retenir
Fonction de hachage : octets de taille quelconque → empreinte de taille fixe (SHA-256 : 256 bits, 64 caractères hexadécimaux). Elle porte sur les octets, au caractère près. L'empreinte identifie un contenu, mais n'en identifie pas l'auteur.
Outil interactif
Empreinte SHA-256
Tapez un texte : l'empreinte se met à jour à chaque caractère. Comparez avec un second texte pour mesurer l'effet d'avalanche.
Empreinte (64 caractères hexadécimaux)
…Empreinte du second texte
…Les caractères différents sont soulignés et en gras. Le texte est encodé en UTF-8 sans ajout d'espace ni de retour à la ligne.
