Bien que pour tout ce qui touche à la sécurité (comme les mots de passe ou les signatures) il vaille mieux préférer des fonctions plus sécurisées comme SHA-2, MD5 reste très pratique pour vérifier l’intégrité d’un fichier ou pour éviter les doublons.
Bash
echo -n "chaine à hasher" | md5sum |
(N’oubliez pas -n
sinon vous aurez un saut de ligne ajouté à la chaîne.)
ou
md5sum /fichier/a/hasher |
Python
>>> import hashlib >>> hashlib.md5('chaine à hasher').hexdigest() |
ou
>>> import hashlib >>> hashlib.md5(open("/fichier/a/hasher").read()).hexdigest() |
La lib hashlib
contient également des fonctions pour les hashs sha1, sha224, sha256, sha384 et sha512.
PHP
echo md5("chaine a hasher"); |
ou
echo md5(fread(fopen('/fichier/a/hasher', 'r'), TAILLE_DU_FICHIER)); |
A noter que l’encodage du terminal et code jouent sur le résultat. Rappelez-vous aussi que PHP et Python n’utilisent pas UTF-8 par défaut.
Javascript
Il n’existe pas de fonction cross-browser qui permette de récuperer le hash MD5 d’une chaîne, mais on peut utiliser des bibliothèques externes. La plus connue est celle de Paul Johnston que nous utilisons pour créer les hashs visuels de Vizhash.js, et donc dans 0bin.
On insère le code:
<script type="text/javascript" src="md5.js"></script> |
Puis:
alert(hex_md5('chaine a hasher')); |
Comme Javascript n’a pas normalement accès au système de fichiers, il n’y a pas de version qui permette de calculer la somme de contrôle d’un fichier directement.
UPDATE après commantaires:
Pour éviter les problèmes liés à l’encoding, il vaut mieux ouvrir le fichier en mode binaire: fopen('fichier', rb')
et open('fichier', 'rb')
en PHP et Python.
Pour PHP, peut utiliser directement md5_file
pour calculer le MD5 d’un fichier.
Pour Python, dans le cas de gros fichiers, utiliser read() charde tout le contenu en mémoire. On peut éviter ça en utilisant une approche par morceaux, telle que:
hash = md5() with open('fichier') as f: for chunk in f.read(500): hash.update(chunk) print hash.hexdigest() |
Sinon en php il y a la fonction md5_file() qui est bien plus simple pour les fichiers.
Si vous tenez vraiment a utiliser fopen(), “rb” serait plus adapté comme mode pour éviter les ennuis d’encodage justement.
Pour PHP, pour le MD5 d’un fichier, il y a la fonction md5_file($filename)
http://fr.php.net/manual/fr/function.md5-file.php
Marche aussi pour Sha1.
Note pour Python et les fichiers: ne pas utiliser tel-quel pour les BD-Rip, le code ci-dessus charge tout en RAM.
PS: pas de preview des commentaires ?
@All-o et @le hollandais volant:
md5_file est non seulement plus facile, mais également plus performant puisque comme Oko le souligne, lire le fichier d’un coup charge tout en mémoire.
@oki:
Oui, pour les gros fichiers en Python il vaut mieux faire un truc du genre:
“On peut éviter ça en utilisant une appache par morceaux”
une approche
Non, on prend un serveur Apache, on le découpe en petits morceaux, et pour, un md5 !