Почему md5 PHP отличается от md5 OpenSSL?

Я совершенно не понимаю, почему я вижу разные результаты для MD5 хеширования в PHP и в OpenSSL.

вот код, который я использую:

php -r "echo md5('abc');"

результаты в: 900150983cd24fb0d6963f7d28e17f72

а это:

echo abc | openssl md5

результаты в: 0bee89b07a248e27c83fc3d5951213c1

почему?

4 ответов


есть только один способ вычислить MD5.

слепая догадка заключается в том, что вторая также включает новую строку внутри хэшируемой строки.

да, проверено. Вот и все.


как все отметили, проблема в том, что echo печатает дополнительную новую строку.

однако, предложенное решение (echo -n) - не совсем верно. Согласно стандарту POSIX,"реализации не должны поддерживать какие-либо варианты.

printf %s abc | openssl md5

или просто

printf abc | openssl md5


echo обычно добавляет новый символ строки в конце строки, которую он выводит; по этой причине значения MD5 отличаются.

попробовать echo -n abc | openssl md5.


Как отмечает jdehaan, если вы скажете echo не выводить новую строку, вы получите ответ, который ожидаете

echo -n "abc" | openssl md5
900150983cd24fb0d6963f7d28e17f72