Quand je fais des téléchargements de gros fichiers, comme des distributions Linux, j'aime savoir si l'intégrité de mon fichier est préservée. Pour le savoir, j'ai recours aux sommes de contrôle.

Qu'est ce qu'une somme de contrôle [1] ou empreinte?

C'est le résultat, de longueur fixe, de la transformation d'un fichier par une fonction de hachage [2]. Selon la théorie des codes, à chaque empreinte correspond un seul et unique fichier. Mais ce n'est que de la théorie, car la recherche faisant des progrès, ce n'est plus tout à fait vrai [3].

De ce fait, il est facile ensuite de vérifier si le fichier est bien ce qu'il prétend être en comparant son empreinte réelle avec son empreinte théorique.

Il existe différentes fonctions de hachages, mais les plus courantes (en tout cas sur GNU/Linux) sont MD5, SHA1 et SHA256. On préfèrera l'utilisation de l'algorithme SHA pour des raisons évidentes de sécurité (voir annexes).

Vérification de l'intégrité d'un fichier

D'abord, téléchargeons un fichier ainsi que son empreinte. On peux prendre l'exemple de l'ISO de la version 13 de Fedora et de son empreinte SHA256. Dans ce fichier, ce qui nous intéresse, c'est la ligne suivante

47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso
Première méthode : la mauvaise

On peux calculer l'empreinte de notre fichier de la manière suivante :

sha256sum Fedora-13-i686-Live.iso

et on obtiendra l'empreinte à comparer (manuellement) avec l'empreinte originale. C'est très chiant rébarbatif et source d'erreurs. On préfèrera donc l'une des 2 méthodes suivantes.

Deuxième méthode : en 1 seule commande

En fait, dans la première méthode, on a utilisé le programme sha1sum pour générer une empreinte, alors qu'il y a moyen de lui fournir un fichier et une empreinte afin qu'il nous dise si le fichier correspond à l'empreinte.
Il y a plusieurs syntaxes différentes, je vous en propose 2 :

echo "47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso" | sha256sum -c -
sha256sum -c - <<< "47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso"

Je préfère la seconde syntaxe car il y a moins à écrire et qu'il n'y a qu'un seul programme appelé. Mais les 2 sont équivalentes.

Notons que le paramètre -c indique que la commande va vérifier un fichier et son empreinte, que le paramètre - indique que la commande attend la chaîne de caractères formatée sur son entrée standard.

L'inconvénient de cette méthode, c'est que l'on ne peut traiter qu'un seul fichier à la fois. Pour traiter plusieurs fichiers à la fois, on utilise la troisième méthode.

Troisième méthode : en 1 commande et un fichier

La syntaxe est assez similaire et doit ressembler à ça :

sha256sum -c FICHIER_DE_CONTROLE

où FICHIER_DE_CONTROLE est le nom du fichier contenant 1 chaîne de caractères formatée par ligne.

La chaîne de caractères formatée [4]

Elle est composée de 4 éléments :

  • l'empreinte du fichier à vérifier
  • un espace
  • une étoile ou astérisque (*)
  • le nom du fichier à vérifier