views:

170

answers:

5

I am quite confused as to why I am seeing different results for md5 hashing in PHP and in OpenSSL.

Here is the code that I am running:

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

Results in: 900150983cd24fb0d6963f7d28e17f72

While this:

echo abc | openssl md5

Results in: 0bee89b07a248e27c83fc3d5951213c1

Why?

+13  A: 

There is only one way to compute MD5.

A blind guess is that the second one also includes a newline inside the string being hashed.

Yeh, verified it. That's it.

jdehaan
That is weird, but `echo` returns a newline. Use `echo -n abc | openssl md5` to get the same output as the PHP version.
artlung
+5  A: 

echo normally adds a new line character at the end of the string it outputs; that is the reason the MD5 values are different.

Try with echo -n abc | openssl md5.

kiamlaluno
+1  A: 

As jdehaan notes, if you tell echo not output a newline, you get the answer you expect

echo -n "abc" | openssl md5
900150983cd24fb0d6963f7d28e17f72
Paul Dixon
+3  A: 

As everyone noted, the problem is that echo prints an extra newline.

However, the solution proposed (echo -n) is not completely correct. According to the POSIX standard, "Implementations shall not support any options." You'll make the world a bit better if you don't use it. Use

printf %s abc | openssl md5

or simply

printf abc | openssl md5
Roman Cheplyaka
The POSIX standard also says *If the first operand is `-n`, or if any of the operands contain a backslash ( `'\'` ) character, the results are implementation-defined.* (further down the same page) - it's the XSI extensions that say that -n must be handled as a normal string (and if the system is XSI-conforming, then you can use `echo "abc\c"` instead)
caf