md5_file()
Découvrez la fonction PHP md5_file(), qui calcule le hachage MD5 d'un fichier et sert à la vérification d'intégrité et à la déduplication.
La fonction PHP md5_file() lit un fichier et retourne le hachage MD5 de son contenu sous la forme d'une chaîne hexadécimale de 32 caractères. Contrairement à md5(), qui hache une chaîne déjà chargée en mémoire, md5_file() lit le fichier en flux depuis le disque — vous pouvez ainsi obtenir l'empreinte d'un fichier de n'importe quelle taille sans avoir à le charger entièrement dans une variable au préalable.
Cette page couvre la syntaxe, les deux modes de sortie, les usages pratiques pour lesquels md5_file() est adapté (vérification d'intégrité, détection de modifications, déduplication), les pièges à éviter, et les cas où MD5 n'est pas le bon outil.
Syntaxe
md5_file(string $filename, bool $binary = false): string|false| Paramètre | Description |
|---|---|
$filename | Chemin vers le fichier à hacher. Peut être un chemin local ou une URL de flux (http://, php://, etc.) lorsque les wrappers sont activés. |
$binary | Quand false (par défaut), retourne une chaîne hexadécimale minuscule de 32 caractères. Quand true, retourne les 16 octets binaires bruts. |
Valeur de retour : le hachage MD5 en cas de succès, ou false si le fichier ne peut pas être lu. (Avant PHP 8.0, le second argument s'appelait $raw_output.)
Exemple de base
Le hachage est calculé à partir des octets du fichier, donc un fichier contenant exactement le texte Hello, World! (sans saut de ligne final) produira toujours le même condensé :
Sortie :
65a8e27d8879283831b664bd8b7f0ad4MD5 étant déterministe, hacher le même contenu n'importe où — sur n'importe quelle machine, dans n'importe quel langage — produit cette valeur identique. C'est cette propriété qui le rend utile dans les cas décrits ci-dessous.
Vérification de l'intégrité d'un fichier
L'utilisation la plus courante consiste à confirmer qu'un fichier téléchargé correspond à une somme de contrôle publiée. Comparez le hachage que vous calculez avec la valeur attendue via hash_equals() (une comparaison à temps constant) plutôt qu'avec == :
<?php
$expected = "65a8e27d8879283831b664bd8b7f0ad4";
$actual = md5_file("example.txt");
if ($actual === false) {
echo "Could not read the file.";
} elseif (hash_equals($expected, $actual)) {
echo "File is intact.";
} else {
echo "File is corrupted or has been modified.";
}
?>Détection de modifications et déduplication
Stocker le hachage d'un fichier permet de détecter facilement s'il a été modifié ultérieurement : il suffit de le re-hacher et de comparer avec la valeur enregistrée. Deux fichiers ayant le même hachage sont (avec une probabilité écrasante) identiques octet par octet, ce qui rend md5_file() pratique pour repérer les doublons :
<?php
$a = md5_file("photo1.jpg");
$b = md5_file("photo2.jpg");
echo ($a === $b) ? "Duplicate files\n" : "Different files\n";
?>Sortie binaire brute
Passez true comme second argument pour obtenir les 16 octets bruts au lieu des 32 caractères hexadécimaux. C'est utile lorsque vous devez stocker le hachage de manière compacte dans une colonne de base de données BINARY(16) à largeur fixe :
<?php
$raw = md5_file("example.txt", true);
echo strlen($raw); // 16 (bytes) instead of 32 (hex chars)
echo bin2hex($raw); // 65a8e27d8879283831b664bd8b7f0ad4
?>Gestion des erreurs
Si le chemin est manquant ou illisible, md5_file() retourne false et émet un avertissement. Vérifiez toujours l'existence du fichier avant de le hacher afin de pouvoir signaler une erreur claire :
<?php
$filename = "example.txt";
if (!is_readable($filename)) {
echo "File not found or not readable.";
} else {
echo md5_file($filename);
}
?>Quand ne pas utiliser MD5
MD5 est rapide et tout à fait adapté aux tâches non liées à la sécurité comme la détection de modifications, les clés de cache et la déduplication. Il est compromis sur le plan de la sécurité : des attaquants peuvent concevoir deux fichiers différents ayant le même hachage MD5 (une collision). Ne l'utilisez pas pour :
- stocker des mots de passe (utilisez
password_hash()), - protéger contre la falsification d'un fichier par un tiers malveillant.
Pour des empreintes résistantes à la falsification, préférez un condensé de la famille SHA-2 via hash_file() :
<?php
echo hash_file("sha256", "example.txt");
?>Fonctions associées
md5()— hacher une chaîne plutôt qu'un fichier.sha1_file()— hachage SHA-1 du contenu d'un fichier.crc32()— somme de contrôle 32 bits rapide pour la détection d'erreurs.file_get_contents()— lire l'intégralité d'un fichier dans une chaîne.
Résumé
md5_file() retourne le condensé MD5 du contenu d'un fichier — une chaîne hexadécimale par défaut, ou des octets binaires bruts avec $binary = true. Elle est idéale pour la vérification d'intégrité, la détection de modifications et la déduplication, mais ne doit jamais être utilisée pour des travaux sensibles à la sécurité, où un hachage SHA-2 via hash_file() est le bon choix.