Der MD5-Hashwert unterscheidet sich von Bash und PHP [duplizieren]


60

Ich habe versucht, die MD5- Summe (mit md5sum) eines Strings zu generieren , "Hallo". Ich habe verschiedene Methoden als md5sum-Tool unter Linux ausprobiert, die MD5 () -Funktion von PHP sowie verschiedene Online-Text-to-md5sum-Übersetzer.

echo "hello" | md5sum

und

echo "hello" > file && md5sum file

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

Was ist der Grund?


38
Echo-n "Hallo"
Martin York

Antworten:


80

Standardmäßig wird echoam Ende der Ausgabe ein Zeilenumbruchzeichen eingefügt. PHP und die von Ihnen verwendeten Online-Sites enthalten jedoch keine Zeilenumbrüche. Verwenden Sie das -nFlag, um das Zeilenumbruchzeichen zu unterdrücken :

echo -n "hello" | md5sum

Ausgabe:

5d41402abc4b2a76b9719d911017c592 -

Sehen: help echo


oder mit printf:

printf "%s" "hello" | md5sum

Ich würde vorschlagen, die allgemein kompatiblere Form vor der zu zeigen, die sich auf ein von POSIX nicht angegebenes Verhalten stützt.
Charles Duffy

Danke. Ich zeige das Problem lieber zuerst mit seinem eigenen Beispiel und dem Verhalten des Echos.
Cyrus

7
Wenn Sie das Betriebssystem des OP nicht kennen, wissen Sie nicht, dass die geänderte Version des "eigenen Beispiels" tatsächlich funktioniert. echo -nkönnte widerhallen, -nwenn ihr Linux eine abgespeckte Busybox verwendet.
Charles Duffy

Ich kenne das Betriebssystem von OP.
Cyrus

Sie geben ihren Kernel an, aber wo sagen sie mehr als das?
Charles Duffy

100

@ Cyrus Antwort ist genau der echorichtige Punkt, um dieses Problem zu lösen - um zu erklären, dass bei Verwendung eine neue Zeile am Ende der Zeichenfolge ausgegeben wird. Wie Sie auf dieser Online-Ausgabe sehen können, gibt helloeine Newline genau den MD5 aus, den Sie zuvor erhalten haben. Mit wird -nder Zeilenumbruch unterdrückt und Sie erhalten dann das erwartete Ergebnis.

Bildbeschreibung hier eingeben

Bearbeiten :

Sie können es deutlich sehen, wenn Sie es ausgeben hexdump, das die Hexadezimalzahl der Bytes dort zeigt.

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

Siehe das 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 ( ) eingefügt

Jetzt mit einer leeren Zeichenfolge

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

Nur das New Line-Zeichen

$ echo -n  "" | hd

Leere Zeichenfolge, hexdumpzeigt also keine Ausgabe


2
Wäre interessanter zu leiten echo hellobzw. echo -n hellozu hexdump -C;)
Tom Yan

19
Ich empfehle dagegen echo -n, da es nicht dem Standard entspricht und nicht einheitlichecho unterstützt wird (siehe Single Unix Spec für und einen detaillierten Katalog von Inkompatibilitäten von Sven Mascheck ). Wenn Sie möchten, dass es konsistent funktioniert, verwenden Sie printfstattdessen; Die Verwendung ist etwas komplexer (Sie müssen zusätzlich zu den zu druckenden Daten eine Formatzeichenfolge angeben), aber IMO lohnt sich, um Probleme zu vermeiden. In diesem Fall printf "%s" "hello"wird der Trick tun.
Gordon Davisson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.