Perché un hash MD5 creato da Python è diverso da uno creato usando echo e md5sum nella shell?


109

Un hash Python MD5 è diverso da quello creato dal comando md5sum sulla shell. Perché?

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


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

Risposte:


198

echoaggiunge un \npoiché di solito non si desidera che le righe non finiscano con un'interruzione di riga nella shell (sembra davvero brutto se il prompt non inizia all'estrema sinistra).
Usa l' -nargomento per omettere l'interruzione di riga finale e stamperà lo stesso checksum del tuo script python:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -

53
In realtà questo è uno dei grandi esempi che uso quando dico alle persone di utilizzare più Python o linguaggi di livello superiore invece di script di shell per il lavoro che è generalmente ritenuto migliore negli script di shell. La natura dei dati e del codice misti e una sintassi diversa per ogni comando rendono gli script della shell invisibilmente soggetti a errori
jsbueno

7
Se l'unica cosa che viene data è "una shell" non puoi fidarti echodi avere un -nflag funzionante . POSIX dice quanto segue su echo: "Se il primo operando è -n, o se uno qualsiasi degli operandi contiene un <backslash>carattere, i risultati sono definiti dall'implementazione." (fonte: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Usa printfinvece.
Mikko Rantalainen

Il problema non è in eco, ma in md5sum (ora md5 su Mac) e shasum che si aggiunge \ n alla fine
Punnerud

@Punnerud: No. L'output di md5sumnon ha importanza qui. L'input fa. E senza -n, echo aggiunge un'interruzione di riga, che si traduce in un hash diverso.
ThiefMaster
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.