Tablettes archaïques

Valider l’intégrité de ses fichiers via le MD5


Il est des systèmes ou l’intégrité des fichiers écrits est primordiale alors même que l’altération de ces fichiers est fortement probable (coupure de courant lors de l’écriture, …). Pour ce genre de système, il est important de pouvoir valider ces fichiers avant même leur lecture. Dans cet article, je vais tacher d’expliquer une solution que j’utilise pour valider l’intégrité de différents fichiers (la nature des fichiers n’influent en rien sur la vérification de leurs intégrités).

Qu’est ce que l’intégrité d’un fichier ?

On peut considérer un contenu intègre à partir du moment où celui-ci correspond exactement au contenu écrit au départ. Je parle bien de contenu car le contenant n’est pas forcément sous forme de fichier. Le contenant pouvant être un fichier, une trame transmise via un support quelconque (filaire, hertzien ou encore électro-magnétique), une tablette préhistorique ou tout autre forme de communication.

En informatique pour valider l’intégrité d’un contenu, nous utilisons la signature de ce contenu (aussi appelé empreinte). Une signature est réalisée via des fonctions de hachage pouvant être de type CRC, MD5 ou encore SHA, ce sont la quelques fonctions courantes. Le choix du type de signature dépendra de la puissance de calcul de vos équipements (PC, ARM, PIC, …) et de la résistance aux collisions voulue. La résistance aux collisions est le pourcentage de risque que 2 contenus différents produisent la même empreinte. En effet, plus l’empreinte est courte plus le risque de collision est grand.

Comment produire une empreinte ?

Cela va dépendre de votre langage. En Bash, la production et la vérification d’une empreinte MD5 se fait via le logiciel md5sum. Il est en général inclue dans toutes les distributions Linux.

# Génération et enregistrement de l'empreinte du fichier file.bin
$ md5sum -b file.bin > file.md5
$ cat file.md5
afe315b2b6f567842ee61b9bbe71ad7b *file.bin

# Vérification de l'intégrité du fichier
$ md5sum -c file.md5 
file.bin: Réussi

# Modification du fichier
echo '0' >> file.bin

# Vérification de l'empreinte
$ md5sum -c file.md5 
file.bin: Échec
md5sum: Attention : la somme de contrôle 1 ne correspond pas
$ md5sum -b file.bin
9cfbb1aa8fe6382aa4ceee92b797f594 *file.bin

Comme vous pouvez le voir, la modification du fichier entraîne une différence entre l’empreinte générée au départ et celle du fichier finale. C’est comme cela que l’on va savoir si notre fichier est intègre ou non.

Comme je vous le disais un peu plus haut, une empreinte peut être de type MD5, SHA ou autre. Des programmes sur le même principe que md5sum existent pour le SHA. Ces programmes sont sha1sum pour faire du SHA1 (160 bits), sha224sum pour le SHA224 (224 bits), sha256sum pour SHA256 (256 bits), …

Toujours en Bash, vous pouvez aussi généré l’empreinte en live, sans passer par un fichier.

echo "contenu" | md5sum 

En python, la génération de l’empreinte se fait comme ceci :

import hashlib

hash = hashlib.md5(b"Ceci est mon contenu").hexdigest()
# hash = 'a83b4780cf70cf07df7dc2894632f5d3'

hash = hashlib.sha256(b"Ceci est mon contenu").hexdigest()
# hash = 'd862b30f4e406e169809c6062345f72ff98f895c3b819b441b7029bcc3b19e00'

En PHP :

<?php
$hash = md5("Ceci est mon contenu");
echo "$hash\n";

En Ruby :

require 'digest/md5'

puts Digest::MD5.hexdigest('Ceci est mon contenu')

Comment valider mes fichiers ?

Vous savez comment générer l’empreinte de votre fichier. Je vais maintenant vous présenter la procédure que j’utilise pour être sure de mes fichiers.

Pour écrire mes fichiers, j’utilise la procédure suivante :

  1. Écriture du contenu dans un fichier filename.0
  2. Écriture de la signature dans un fichier filename.md5
  3. Synchronisation du système de fichier avec le support de stockage
  4. Renomme le fichier filename.0 en filename
  5. Copie du fichier filename dans filename.1
  6. Synchronisation du système de fichier avec le support de stockage

Cela donne en Bash

echo "Ceci est mon contenu" > filename.0
md5sum filename.0 > filename.md5
sync
mv filename.0 filename
cp filename filename.1
sync

La synchronisation est nécessaire pour que les données soient écrites sur le support de stockage. Attention à ne pas abuser de son utilisation, cela aurait pour conséquence d’user prématurément le support.

Pour la lecture des fichiers, je procède de la sorte :

  1. Vérification de la signature
  2. Si la signature est bonne, récupération du contenu de filename
  3. Sinon, récupération du contenu de filename.1
  4. Réécriture de filename selon la méthode ci-dessus.

En bash :

file="filename"

md5sum -cs filename.md5
if [[ $? != 0 ]]; then
    file="filename.1"
fi
cat $file

Je pourrais vous en parler encore des heures mais pour les quelques courageux qui m’auront lus jusqu’ici, je vais m’abstenir.

Pour plus d’information, voici quelques sources :
* Wikipedia notamment les pages sur MD5, les fonctions de hachage
* Les différentes pages de man suivantes : md5sum, sync.
* Les pages de documentation des différents langages: PHP, Python
* Internet dans sa globalité

Commentaires

  • jef

    bonjour, j’utilise les fonctions de hachage pour gérer les broderies de mon épouse. J’utilisais sha1sum, mais récemment j’ai mis les broderies sous git et j’utilise désormais git hash-object. Cela m’a permis d’écrire une petite fonction bash pour tester si une broderie récemment téléchargée était déjà présente sous git:

    function gitexist { if git --git-dir=/home/jef/broderie/.git cat-file -t $(git hash-object "$1") > /dev/null 2>&1 ; then echo "$1" found ; fi }
    

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.