Значение хеша MD5 отличается от Bash и PHP

38356
Himanshu Shekhar

Я попытался сгенерировать сумму MD5 (используя md5sum) для строки "hello". Я опробовал различные методы в качестве инструмента md5sum в Linux, функцию PHP MD5 (), а также различные онлайн-переводчики текста в md5sum.

echo "hello" | md5sum 

а также

echo "hello" > file && md5sum file 

Дал результат b1946ac92492d2347c6235b4d2611184. Однако, PHP-функция md5 () и почти все онлайн-генераторы дали результат 5D41402ABC4B2A76B9719D911017C592.

Какова причина?

59
эхо-н "привет" Martin York 8 лет назад 38
http://superuser.com/questions/71554/md5-why-is-my-command-line-hash-different-from-online-md5-hash-results Miles 8 лет назад 16

2 ответа на вопрос

101
Jonno

Ответ @ Сайруса точно соответствует тому, как решить эту проблему - чтобы объяснить, при использовании echoон выведет новую строку в конце строки. Как вы видите на этом онлайн-выводе, helloс новой строкой выводится именно тот MD5, который вы получали ранее. Использование -nподавляет символ новой строки, а затем даст вам ожидаемый результат.

Редактировать :

Вы можете видеть это ясно, если вы выводите его в hexdump, который показывает шестнадцатеричное число байтов там.

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

Смотрите 0a( \n) в конце строки

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

С -nэхо не ставит новую строку ( \n) в конце

Теперь с пустой строкой

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

Просто персонаж Новой Линии

$ echo -n "" | hd 

Пустая строка, поэтому hexdumpне выводится

Было бы более интересно передать `echo hello` и` echo -n hello` в `hexdump -C` соответственно;) Tom Yan 8 лет назад 2
Я рекомендую не использовать `echo -n`, поскольку он нестандартный и несовместимо поддерживаемый (см. [Спецификация Single Unix для` echo`] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html) и [более подробный каталог несовместимостей Свена Машика] (http://www.in-ulm.de/~mascheck/various/echo+printf/)). Если вы хотите, чтобы он работал последовательно, используйте вместо него `printf`; это немного сложнее в использовании (вы должны указать строку формата в дополнение к данным, которые вы хотите распечатать), но IMO стоит того, чтобы избежать проблем. В этом случае `printf"% s "" hello "` добьется цели. Gordon Davisson 8 лет назад 19
78
Cyrus

По умолчанию echoвключает символ перевода строки в конце вывода. Тем не менее, PHP и веб-сайты, которые вы использовали, не включают перевод строки. Чтобы подавить символ новой строки, используйте -nфлаг:

echo -n "hello" | md5sum 

Выход:

5d41402abc4b2a76b9719d911017c592 - 

Увидеть: help echo


или с помощью printf:

printf "%s" "hello" | md5sum 
Я бы предложил показать более широко совместимую форму * перед * той, которая основана на поведении, не указанном в POSIX. Charles Duffy 8 лет назад 0
Спасибо. Я предпочитаю сначала показать проблему своим собственным примером и поведением эха. Cyrus 8 лет назад 0
Если вы не знаете операционную систему ОП, вы не знаете, что модифицированная версия «своего собственного примера» действительно будет работать. `echo -n` может повторить` -n`, если их Linux использует урезанный Busybox. Charles Duffy 8 лет назад 7
Я знаю операционную систему ОП. Cyrus 8 лет назад 0
Они указывают свое ядро, но где они говорят больше, чем это? Charles Duffy 8 лет назад 0
@CharlesDuffy: Хороший улов. Cyrus 8 лет назад 0
как насчет дополнительного `` `-``` в конце? lrkwz 7 лет назад 0
@lrkwz: Я предполагаю, что это означает, что данные пришли из [stdin] (https://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29), а не из файла. Cyrus 7 лет назад 0

Похожие вопросы