2010-07-02 19 views
7

Estoy bastante confundido en cuanto a por qué estoy viendo diferentes resultados para el hash md5 en PHP y en OpenSSL.¿Por qué el md5 de PHP es diferente del md5 de OpenSSL?

Aquí está el código que estoy corriendo:

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

Resultados en: 900150983cd24fb0d6963f7d28e17f72

Si bien esto:

echo abc | openssl md5 

Resultados en: 0bee89b07a248e27c83fc3d5951213c1

¿Por qué?

+0

Fwiw, estás en buena compañía cometer este error. Esta pregunta se ha formulado varias veces en Stack Overflow, por ejemplo: - http://stackoverflow.com/questions/1147875/difference-in-sha512-between-python-hashlib-and-sha512sum-tool - http: // stackoverflow.com/questions/1604892/is-the-md5sum-linux-command-working-right - http://stackoverflow.com/questions/1843383/why-does-perl-and-bin-sha1-give-different -results - http://stackoverflow.com/questions/2799815/why-is-the-same-input-returning-two-different-md5-hashes –

+0

bueno, eso me hace sentir un poco mejor :) thnx :) –

Respuesta

21

Solo hay una forma de calcular MD5.

Una conjetura ciega es que la segunda también incluye una nueva línea dentro de la cadena que se está procesando.

Yeh, lo verifico. Eso es.

+5

Eso es raro, pero 'echo' devuelve una nueva línea. Use 'echo -n abc | openssl md5' para obtener el mismo resultado que la versión de PHP. – artlung

6

echo normalmente agrega un nuevo carácter de línea al final de la cadena que emite; esa es la razón por la que los valores de MD5 son diferentes.

Probar con echo -n abc | openssl md5. notas

1

Como jdehaan, si le dice eco de una nueva línea de salida no, se obtiene la respuesta que esperas

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

Como todo el mundo ha señalado, el problema es que las impresiones de eco de una nueva línea adicional.

Sin embargo, la solución propuesta (echo -n) no es completamente correcta. De acuerdo con el estándar POSIX, "Implementations shall not support any options." Harás que el mundo mejore un poco si no lo usas. Uso

printf %s abc | openssl md5 

o simplemente

printf abc | openssl md5 
+1

El estándar POSIX también dice * Si el primer operando es '-n', o si alguno de los operandos contiene un carácter de barra diagonal inversa (' '\' '), los resultados están definidos por la implementación. * (Más abajo en la misma página) - son las extensiones XSI que dicen que -n debe manejarse como una cadena normal (y si el sistema es compatible con XSI, entonces puede usar 'echo" abc \ c "' en su lugar) – caf