Il valore hash MD5 è diverso da Bash e PHP [duplicato]


60

Ho provato a generare la somma MD5 (usando md5sum) di una stringa, "ciao". Ho provato diversi metodi come lo strumento md5sum in Linux, la funzione MD5 () di PHP e vari traduttori di testo online per md5sum.

echo "hello" | md5sum

e

echo "hello" > file && md5sum file

Ha dato il risultato b1946ac92492d2347c6235b4d2611184. Tuttavia, la funzione md5 () di PHP e quasi tutti i generatori online hanno dato l'output 5D41402ABC4B2A76B9719D911017C592.

Qual è il motivo?


38
echo -n "ciao"
Martin York,

Risposte:


80

Per impostazione predefinita, echoinclude un carattere di nuova riga alla fine dell'output. Tuttavia, PHP e i siti online utilizzati non includono la nuova riga. Per sopprimere il carattere di nuova riga, utilizzare il -nflag:

echo -n "hello" | md5sum

Produzione:

5d41402abc4b2a76b9719d911017c592 -

Vedere: help echo


o con printf:

printf "%s" "hello" | md5sum

Suggerirei di mostrare la forma più ampiamente compatibile prima di quella che si basa su comportamenti non specificati da POSIX.
Charles Duffy,

Grazie. Preferisco mostrare prima il problema con il suo esempio e il comportamento dell'eco.
Ciro,

7
A meno che non si conosca il sistema operativo dell'OP, non si sa che la versione modificata del "proprio esempio" funzionerà effettivamente. echo -npotrebbe echeggiare -nse il loro Linux sta usando un Busybox ridotto.
Charles Duffy,

Conosco il sistema operativo di OP.
Ciro,

Specificano il loro kernel, ma dove dicono di più?
Charles Duffy,

100

La risposta di @ Cyrus è esattamente il punto su come risolverlo: per spiegarlo, quando echolo si utilizza genererà una nuova riga alla fine della stringa. Come puoi vedere su questo output online, hellocon una nuova riga si ottiene esattamente l'MD5 che si stava ottenendo in precedenza. L'uso -nelimina la nuova riga e quindi ti darà il risultato che ti aspettavi.

inserisci qui la descrizione dell'immagine

Modifica :

Puoi vederlo chiaramente se lo metti in output hexdump, il che mostra l'esadecimale dei byte lì.

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

Vedi 0a( \n) alla fine della stringa

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

Con -necho non inserire una nuova riga ( \n) alla fine

Ora con una stringa vuota

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

Solo il personaggio della Nuova Linea

$ echo -n  "" | hd

Stringa vuota, quindi hexdumpnon mostra alcun output


2
Sarebbe più interessante per il tubo echo helloe echo -n helloper hexdump -C, rispettivamente;)
Tom Yan

19
Sconsiglio echo -n, dato che non è standard e è supportato in modo incoerente (vedere le specifiche Single Unix perecho e un catalogo più dettagliato delle incompatibilità di Sven Mascheck ). Se vuoi che funzioni in modo coerente, usa printfinvece; è un po 'più complesso da usare (è necessario specificare una stringa di formato oltre ai dati che si desidera stampare), ma ne vale la pena IMO per evitare problemi. In questo caso, printf "%s" "hello"farà il trucco.
Gordon Davisson,
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.