Почему md5 в PHP отличается от md5 в OpenSSL? - PullRequest
7 голосов
/ 03 июля 2010

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

Вот код, который я запускаю:

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

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

При этом:

echo abc | openssl md5

Результат: 0bee89b07a248e27c83fc3d5951213c1

Почему?

Ответы [ 4 ]

21 голосов
/ 03 июля 2010

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

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

Да, проверил это. Вот и все.

8 голосов
/ 03 июля 2010

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

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

printf %s abc | openssl md5

или просто

printf abc | openssl md5
6 голосов
/ 03 июля 2010

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

Попробуйте с echo -n abc | openssl md5.

1 голос
/ 03 июля 2010

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

echo -n "abc" | openssl md5
900150983cd24fb0d6963f7d28e17f72
...