Der MD5-Hashwert unterscheidet sich von Bash und PHP

38385
Himanshu Shekhar

Ich habe versucht, die MD5- Summe (mit md5sum) einer Zeichenfolge "Hallo" zu generieren . Ich habe verschiedene Methoden als md5sum-Tool in Linux ausprobiert, die MD5 () - Funktion von PHP sowie verschiedene Online-Texte für md5sum-Übersetzer.

echo "hello" | md5sum 

und

echo "hello" > file && md5sum file 

Gab das Ergebnis b1946ac92492d2347c6235b4d2611184. Die PHP-Funktion md5 () und fast alle Online-Generatoren lieferten jedoch die Ausgabe 5D41402ABC4B2A76B9719D911017C592.

Was ist der Grund?

59
Echo -n "Hallo" Martin York vor 8 Jahren 38
http://superuser.com/questions/71554/md5-why-is-my-command-line-hash-different-von-online-md5-hash-Ergebnisse Miles vor 8 Jahren 16

2 Antworten auf die Frage

101
Jonno

@ Cyrus's Antwort ist genau darauf zu echoverstehen, wie man das Problem lösen kann. Wenn Sie es erklären, wird am Ende des Strings eine neue Zeile ausgegeben. Wie Sie auf dieser Online-Ausgabe sehen können, gibt helloein Zeilenumbruch genau den MD5 aus, den Sie zuvor erhalten haben. Wenn Sie -ndie Newline unterdrücken, erhalten Sie das erwartete Ergebnis.

enter image description here

Bearbeiten :

Sie können es deutlich sehen, wenn Sie es in ausgeben. Dort hexdumpwird das Hexadezimal der Bytes angezeigt.

$ echo "str_example" | hd 00000000 73 74 72 5f 65 78 61 6d 70 6c 65 0a |str_example.| 

Siehe 0a( \n) am Ende der Zeichenfolge

$ echo -n "str_example" | hd 00000000 73 74 72 5f 65 78 61 6d 70 6c 65 |str_example| 

Mit -necho wird \nam Ende keine neue Zeile ( ) gesetzt

Jetzt mit leerem String

$ echo "" | hd 00000000 0a |.| 

Nur der New Line Charakter

$ echo -n "" | hd 

Leere Zeichenfolge, daher hexdumpkeine Ausgabe

Wäre es interessanter, "echo hallo" und "echo -n hallo" an "hexdump -C" zu leiten;) Tom Yan vor 8 Jahren 2
Ich empfehle gegen "echo -n", da es nicht dem Standard entspricht und inkonsistent unterstützt wird (siehe [die Unix-Spezifikation für "echo"] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html) [ausführlicherer Katalog der Inkompatibilitäten von Sven Mascheck] (http://www.in-ulm.de/~mascheck/various/echo+printf/)). Wenn Sie möchten, dass es konstant funktioniert, verwenden Sie stattdessen `printf '. Die Verwendung ist etwas komplexer (Sie müssen zusätzlich zu den Daten, die Sie drucken möchten, eine Formatzeichenfolge angeben), aber IMO lohnt sich, um Probleme zu vermeiden. In diesem Fall wird `printf"% s "" hallo "` den Trick ausführen. Gordon Davisson vor 8 Jahren 19
78
Cyrus

echoFügt standardmäßig ein Zeilenvorschubzeichen am Ende der Ausgabe ein. PHP und die von Ihnen verwendeten Online-Sites enthalten jedoch keinen Newline. Um das Zeilenvorschubzeichen zu unterdrücken, verwenden Sie das -nFlag:

echo -n "hello" | md5sum 

Ausgabe:

5d41402abc4b2a76b9719d911017c592 - 

Sehen: help echo


oder mit printf:

printf "%s" "hello" | md5sum 
Ich würde vorschlagen, die allgemeiner kompatible Form * vor * derjenigen anzuzeigen, die auf von POSIX nicht spezifiziertem Verhalten angewiesen ist. Charles Duffy vor 8 Jahren 0
Vielen Dank. Ich zeige das Problem lieber zuerst mit seinem eigenen Beispiel und dem Verhalten des Echos. Cyrus vor 8 Jahren 0
Wenn Sie das Betriebssystem des OP nicht kennen, wissen Sie nicht, dass die modifizierte Version von "eigenem Beispiel" tatsächlich funktioniert. `echo -n` könnte` -n` wiedergeben, wenn ihr Linux eine abgespeckte Busybox verwendet. Charles Duffy vor 8 Jahren 7
Ich kenne das Betriebssystem von OP. Cyrus vor 8 Jahren 0
Sie spezifizieren ihren Kernel, aber wo sagen sie mehr als das? Charles Duffy vor 8 Jahren 0
@CharlesDuffy: Guter Fang. Cyrus vor 8 Jahren 0
Was ist mit dem zusätzlichen `` ````` am Ende? lrkwz vor 6 Jahren 0
@lrkwz: Ich gehe davon aus, dass die Daten von [stdin] (https://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29) und nicht von einer Datei stammen. Cyrus vor 6 Jahren 0