Pourquoi un hachage MD5 créé par Python est-il différent de celui créé en utilisant echo et md5sum dans le shell?

109

Un hachage Python MD5 est différent de celui créé par la commande md5sum sur le shell. Pourquoi?

>>> import hashlib
>>> h = hashlib.md5()
>>> h.update("mystringforhash")
>>> print h.hexdigest()
86b6423cb6d211734fc7d81bbc5e11d3 # Result from Python


$ echo mystringforhash | md5sum
686687dd68c5de717b34569dbfb8d3c3  - # Result on the shell
mailGO
la source

Réponses:

198

echoajoute un \ncar vous ne voulez généralement pas que les lignes ne se terminent pas par un saut de ligne dans votre shell (cela semble vraiment moche si l'invite ne commence pas à l'extrême gauche).
Utilisez l' -nargument pour omettre le saut de ligne de fin et il affichera la même somme de contrôle que votre script python:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -
ThiefMaster
la source
53
En fait, c'est l'un des grands exemples que j'utilise lorsque je dis aux gens d'utiliser plus de langages Python ou de plus haut niveau au lieu de scripts shell pour un travail généralement considéré comme mieux fait dans les scripts shell. La nature des données et du code mixtes, et une syntaxe différente pour chaque commande rendent tous les scripts shell invisiblement sujets aux erreurs
jsbueno
7
Si la seule chose donnée est "un shell", vous ne pouvez pas avoir confiance echopour avoir un -nindicateur fonctionnel . POSIX dit ce qui suit à propos de echo: "Si le premier opérande est -n, ou si l'un des opérandes contient un <backslash>caractère, les résultats sont définis par l'implémentation." (source: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Utilisez printfplutôt.
Mikko Rantalainen
Le problème n'est pas en écho, mais en md5sum (maintenant md5 sur Mac) et shasum qui ajoute \ n à la fin
Punnerud
@Punnerud: Non. La sortie de md5sumn'a pas d'importance ici. L'entrée le fait. Et sans -n, echo ajoute un saut de ligne, ce qui entraîne un hachage différent.
ThiefMaster