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 :
- Écriture du contenu dans un fichier filename.0
- Écriture de la signature dans un fichier filename.md5
- Synchronisation du système de fichier avec le support de stockage
- Renomme le fichier filename.0 en filename
- Copie du fichier filename dans filename.1
- 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 :
- Vérification de la signature
- Si la signature est bonne, récupération du contenu de filename
- Sinon, récupération du contenu de filename.1
- 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: