Wartość skrótu MD5 różni się od Bash i PHP [duplikat]

60

Próbowałem wygenerować sumę MD5 (przy użyciu md5sum) ciągu „hello”. Wypróbowałem różne metody jako narzędzie md5sum w Linuksie, funkcję MD5 () PHP, a także różne internetowe translatory tekstu na md5sum.

echo "hello" | md5sum

i

echo "hello" > file && md5sum file

Dał wynik b1946ac92492d2347c6235b4d2611184. Jednak funkcja md5 () PHP i prawie wszystkie generatory online dały wynik 5D41402ABC4B2A76B9719D911017C592.

Jaki jest powód?

Himanshu Shekhar
źródło
38
echo -n „hello”
Martin York

Odpowiedzi:

80

Domyślnie echozawiera znak nowej linii na końcu wyniku. Jednak PHP i używane strony internetowe nie zawierają nowej linii. Aby ukryć znak nowej linii, użyj -nflagi:

echo -n "hello" | md5sum

Wynik:

5d41402abc4b2a76b9719d911017c592 -

Widzieć: help echo


lub z printf:

printf "%s" "hello" | md5sum
Cyrus
źródło
Sugerowałbym pokazanie bardziej kompatybilnej formy przed tą, która opiera się na zachowaniu nieokreślonym przez POSIX.
Charles Duffy
Dziękuję Ci. Wolę najpierw pokazać problem na własnym przykładzie i zachowaniu echa.
Cyrus
7
O ile nie znasz systemu operacyjnego OP, nie wiesz, że zmodyfikowana wersja „własnego przykładu” faktycznie będzie działać. echo -nmoże -nodbić się echem, jeśli ich system Linux używa uproszczonego Busyboksa.
Charles Duffy
Znam system operacyjny OP.
Cyrus
Podają swoje jądro, ale gdzie mówią więcej?
Charles Duffy
100

Odpowiedź @ Cyrus jest dokładnie na tym, jak rozwiązać ten problem - aby wyjaśnić, gdy użyjesz echo, wyświetli nowy wiersz na końcu łańcucha. Jak widać na tym wyjściu online, helloz nowym wierszem wypisuje dokładnie MD5, który otrzymywałeś wcześniej. Użycie -npomija znak nowej linii, a następnie daje oczekiwany wynik.

wprowadź opis zdjęcia tutaj

Edytuj :

Możesz to zobaczyć wyraźnie, jeśli wypiszesz go hexdump, co pokazuje szesnastkowy bajt tam.

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

Zobacz 0a( \n) na końcu ciągu

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

Funkcja -necho nie umieszcza nowej linii ( \n) na końcu

Teraz z pustym ciągiem

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

Tylko znak nowej linii

$ echo -n  "" | hd

Pusty ciąg, więc hexdumpnie pokazuje danych wyjściowych

Jonno
źródło
2
Byłoby bardziej interesujące rury echo helloi echo -n hellodo hexdump -Codpowiednio;)
Tom Yan
19
Ja odradzam echo -n, ponieważ jest nietypowa i niekonsekwentnie obsługiwane (patrz Single Unix spececho i bardziej szczegółowy katalog niekompatybilności Sven Mascheck ). Jeśli chcesz, aby działał konsekwentnie, użyj printfzamiast tego; jest nieco bardziej skomplikowany w użyciu (musisz podać ciąg formatu oprócz danych, które chcesz wydrukować), ale IMO warto, aby uniknąć problemów. W takim przypadku załatwi sprawę printf "%s" "hello".
Gordon Davisson