Hachage de fichiers : MD5, SHA-1, SHA-256 et vérification des téléchargements

Un hachage de fichier est une valeur de longueur fixe calculée à partir du contenu d’un fichier, couramment utilisée pour comparer un fichier téléchargé avec une copie de référence. Les mêmes octets et le même algorithme produisent le même résultat, mais différents fichiers peuvent théoriquement partager un hachage. Pour la vérification courante des fichiers, préférez SHA-256 lorsque l’éditeur le fournit et vérifiez la provenance de la valeur de référence.

Que représente le hachage d'un fichier ?

Une fonction de hachage calcule un résumé appelé valeur de hachage ou condensé. MD5, SHA-1 et SHA-256 ont chacun une longueur de sortie fixe : un petit document et un gros programme d'installation produisent des condensés de même longueur lorsqu'on utilise le même algorithme. Un condensé n'est pas une copie compressée à partir de laquelle vous pouvez reconstruire le fichier. L'aperçu des fonctions de hachage du NIST explique ces propriétés et les exigences de sécurité pertinentes.

Les outils ordinaires de hachage de fichiers lisent les octets à l'intérieur d'un fichier, plutôt que son nom ou son emplacement dans un dossier. Renommer un fichier sans changer son contenu laisse le hachage inchangé. À l'inverse, deux documents affichant le même texte peuvent contenir des octets différents en raison des fins de ligne, de l'encodage des caractères ou des métadonnées stockées à l'intérieur du fichier.

On peut décrire un hachage comme une empreinte digitale, mais ce n'est pas un identifiant absolument unique. Une collision se produit lorsque des entrées différentes produisent le même résumé. Un hachage cryptographique sécurisé est conçu pour rendre la recherche de telles entrées peu pratique. Les MD5 et SHA-1 ne répondent plus aux exigences de sécurité pour les applications résistantes aux collisions.

MD5 vs SHA-1 vs SHA-256

MD5 signifie Message-Digest Algorithm 5 ; SHA signifie Secure Hash Algorithm. SHA-256 appartient à la famille SHA-2 et produit 256 bits. Les outils affichent généralement le résultat sous forme de texte hexadécimal. Chaque caractère hexadécimal représente quatre bits, donnant les longueurs suivantes :

Algorithme Taille du digest Longueur hexadécimale Choix pour la vérification de fichiers
MD5 128 bits · 16 octets 32 caractères Peut être nécessaire pour comparer un ancienne somme de contrôle, mais ne doit pas établir une protection contre la falsification malveillante.
SHA-1 160 bits · 20 octets 40 caractères Peut être comparé aux références héritées ; éviter de le choisir pour de nouvelles applications de sécurité.
SHA-256 256 bits · 32 octets 64 caractères Un choix pratique pour les vérifications d'intégrité de téléchargement courantes lorsque l'éditeur fournit une valeur SHA-256.

Les limitations de taille et de résistance aux collisions de MD5 sont discutées dans considérations de sécurité de MD5 dans la RFC 6151. Les spécifications SHA apparaissent dans norme Secure Hash Standard du NIST. La détection d'une erreur de transmission accidentelle et la défense contre un attaquant capable de modifier un fichier sont des exigences différentes.

Comparez toujours les hachages provenant du même algorithme. Une valeur SHA-256 calculée localement ne peut pas être vérifiée contre une valeur MD5 publiée. De plus, une sortie de 256 bits n'implique pas une force de 256 bits contre tous les types d'attaques. Voir recommandations du NIST sur les algorithmes et leur sécurité pour les limitations de SHA-1 et les distinctions entre les types d'attaques.

Que se passe-t-il lorsqu'un caractère change ?

Cet exemple Python calcule le SHA-256 pour les octets ASCII abc et abC. Seul le dernier caractère change, et aucune des entrées ne contient de retour à la ligne final. La sortie montrée a été vérifiée avec Python 3.12 ; les deux empreintes contiennent 64 caractères hexadécimaux.

import hashlib

for data in (b"abc", b"abC"):
    print(data.decode("ascii") + ": " + hashlib.sha256(data).hexdigest())

Sortie :

abc: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abC: 0a2432a1e349d8fdb9bfca91bba9e9f2836990fe937193d84deef26c6f3b8f76

Ces entrées qui se ressemblent produisent des empreintes très différentes. L'exemple ne prouve pas que chaque paire d'entrées différentes doit avoir des hachages différents. La sortie déterministe pour la même entrée, les collisions possibles et la résistance aux attaques délibérées sont des propriétés distinctes.

Comment vérifier un fichier téléchargé

La vérification d'intégrité détermine si les données diffèrent d'une référence. Le calcul d'un nouveau condensé seul n'est pas une vérification : vous avez besoin d'un condensé de référence fiable pour le comparer.

  1. Obtenez le condensé de référence depuis la page de téléchargement officielle de l'éditeur ou un autre canal de distribution fiable.
  2. Confirmez que le système d'exploitation, l'architecture du processeur, la version et le nom de fichier correspondent au téléchargement. Vérifiez quel algorithme la référence utilise.
  3. Attendez que le téléchargement soit terminé, puis calculez son condensé avec le même algorithme. Ne modifiez pas et n'écrasez pas le fichier pendant qu'il est en cours de lecture.
  4. Pour SHA-256, comparez les 64 caractères hexadécimaux, plutôt que seulement le début. Les lettres hexadécimales majuscules et minuscules représentent les mêmes valeurs.
  5. Si les valeurs diffèrent, n'exécutez ni n'installez le fichier. Vérifiez à nouveau la cible de comparaison, puis téléchargez-la à nouveau depuis le canal officiel et répétez la vérification.

Si un attaquant peut remplacer à la fois un fichier et son hash de référence, des valeurs correspondantes n'établissent pas qui l'a fourni. Une correspondance est une comparaison avec les données de référence, pas une preuve que le fichier est exempt de logiciels malveillants. Lorsque des sommes de contrôle signées ou des signatures numériques sont fournies, suivez les instructions de l'éditeur et vérifiez-les à l'aide d'une clé publique de confiance.

Commandes SHA-256 pour Windows, Linux et macOS

example.iso ci-dessous est un nom de fichier illustratif. Remplacez-le ainsi que le chemin par votre téléchargement réel, et mettez entre guillemets les chemins contenant des espaces. Ces commandes lisent le fichier pour calculer son empreinte ; elles ne modifient pas son contenu.

Windows : Get-FileHash dans PowerShell

Ouvrez PowerShell depuis le menu Démarrer et exécutez la commande suivante. -LiteralPath considère le chemin littéralement plutôt que d'interpréter les caractères génériques. -Algorithm SHA256 sélectionne explicitement l'algorithme.

Get-FileHash -LiteralPath 'C:\Downloads\example.iso' -Algorithm SHA256 | Format-List

Vérifiez les champs Algorithm, Hash et Path. SHA-256 est la valeur par défaut, mais le spécifier rend la comparaison plus claire. La documentation Get-FileHash de Microsoft décrit les algorithmes pris en charge et la sortie. Si le fichier ne peut pas être trouvé, vérifiez son chemin réel et son extension dans l’Explorateur de fichiers.

Linux : sha256sum

Dans un environnement avec GNU Coreutils sha256sum installé, ouvrez un terminal et exécutez cette commande. La sortie habituelle comprend le condensé suivi du nom de fichier.

sha256sum "/home/user/Downloads/example.iso"

Si l'éditeur fournit un fichier SHA256SUMS au format GNU, placez-le à côté des fichiers à vérifier, ouvrez un terminal dans ce dossier et vérifiez la liste avec la commande ci-dessous. Les chemins nommés dans la liste doivent exister. Une liste complète peut signaler des fichiers manquants si vous n'avez téléchargé que certaines de ses entrées.

sha256sum --check SHA256SUMS

Les entrées correspondantes sont signalées comme OK ; les divergences sont signalées comme des échecs. La liste de sommes de contrôle elle-même doit également provenir d'une source fiable. Consultez le manuel des utilitaires SHA-2 de GNU pour la commande et les options de vérification. Si la commande est manquante, vérifiez si Coreutils est installé pour votre distribution.

macOS : shasum

Si shasum est disponible dans votre terminal, sélectionnez explicitement SHA-256 avec -a 256. Sans cette option, shasum utilise par défaut SHA-1, ce qui peut provoquer un décalage d’algorithme.

shasum -a 256 "/Users/user/Downloads/example.iso"

Pour une liste de sommes de contrôle compatible, utilisez shasum -a 256 -c SHA256SUMS. La documentation du mainteneur de shasum explique la sélection de l’algorithme et -c. Ces instructions macOS sont basées sur la documentation de l’outil plutôt que sur une exécution sur macOS ; la méthode Python ci-dessous est une alternative lorsque l’outil n’est pas disponible.

Calculer le SHA-256 d’un gros fichier avec Python

Avec Python 3 installé, vous pouvez utiliser le module hashlib de la bibliothèque standard. Enregistrez ce code sous hash-file.py. Il ouvre le fichier en mode binaire, rb, et lit un mébioctet (MiB) à la fois au lieu de charger tout le fichier en mémoire. Sa syntaxe d'expression d'affectation nécessite Python 3.8 ou version ultérieure.

import hashlib
import sys

if len(sys.argv) != 2:
    raise SystemExit("Usage: python hash-file.py FILE")

digest = hashlib.sha256()
with open(sys.argv[1], "rb") as file:
    while chunk := file.read(1024 * 1024):
        digest.update(chunk)

print(digest.hexdigest())

Depuis le dossier du script, passez le chemin de votre fichier réel comme suit. Si votre commande Python 3 est python3 ou py, utilisez cette commande à la place de python.

python hash-file.py "example.iso"

La sortie est un condensé SHA-256 hexadécimal de 64 caractères. Des octets identiques donnent le même résultat que PowerShell et les autres outils, même si la casse des lettres peut différer. La documentation officielle du module hashlib de Python explique update() et hexdigest(). Des fichiers petits, vides et traités en plusieurs blocs ont été vérifiés sous Windows avec Python 3.12.14 et PowerShell 7.6.5 ; leurs résultats concordaient.

Ce qu'il faut vérifier lorsque les hachages ne correspondent pas

  • Fichiers de versions différents : vérifier x64 contre ARM64, installateurs contre archives, ou différentes versions.
  • Algorithmes différents : MD5, SHA-1 et SHA-256 produisent des digests différents. Vérifiez à nouveau les noms des algorithmes.
  • Téléchargements incomplets : confirmez que le téléchargement est terminé et que l’outil de téléchargement n’a signalé aucune erreur.
  • Extraction ou conversion : le hash de référence d’une archive ne s’applique pas à un fichier extrait de celle-ci. Enregistrer dans un éditeur, convertir les fins de ligne et recomprimer des images peut modifier les octets.
  • Erreurs de chemin ou de copie : vérifiez le fichier effectivement lu par la commande et l’intégralité de la valeur de référence copiée. Évitez un digest tronqué ou copié à partir d’un fichier différent.

Ne remplacez pas une valeur de référence inexpliquée par votre propre valeur calculée pour forcer une correspondance. Vérifiez d’abord le canal de distribution et la cible. Si un téléchargement récent diffère encore, consultez les instructions de l’éditeur ou vérifiez si la version a été corrigée.

Ce que les hachages peuvent et ne peuvent pas faire

Utilisation Rôle du hachage Exigences supplémentaires
Intégrité des fichiers Comparer le contenu actuel du fichier avec un condensé de référence. La source et l'algorithme de référence doivent être appropriés.
Détection de doublons Grouper les fichiers avec des hachages identiques comme candidats aux doublons. Tenir compte des collisions et comparer les octets lorsque l'égalité exacte est essentielle.
Signatures numériques Un schéma de signature peut utiliser un condensé des données. Calculer un hash seul ne crée pas de signature ni n'authentifie l'auteur.
Stockage de mot de passe La vérification des mots de passe utilise également des mécanismes basés sur le hash. Utilisez une méthode dédiée de stockage des mots de passe au lieu d'un simple hachage de fichier SHA-256.

Le hachage n'est pas un chiffrement. Le chiffrement est destiné à permettre la récupération du texte en clair avec la clé appropriée ; un hash n'est pas un format pour reconstruire son entrée. Cependant, des entrées courtes ou prévisibles peuvent être devinées et leurs hashes comparés, donc le simple fait de hacher des données ne garantit pas la confidentialité.

Pour les mots de passe, choisissez une implémentation fiable d'un schéma de hachage de mot de passe dédié tel qu'Argon2id, avec un coût approprié et un sel unique, au lieu de MD5, SHA-1 ou SHA-256 simples. Un sel est une valeur propre à chaque mot de passe qui rend les attaques par devinette précalculées moins efficaces. La OWASP Password Storage Cheat Sheet explique pourquoi le stockage des mots de passe et le hachage de fichiers nécessitent des conceptions différentes. Pour les vérifications de téléchargement, les étapes essentielles sont de calculer SHA-256, d'obtenir une référence fiable, et de comparer le digest complet.