El valor hash MD5 es diferente de Bash y PHP [duplicado]

60

Traté de generar la suma MD5 (usando md5sum) de una cadena, "hola". Probé diferentes métodos como la herramienta md5sum en Linux, la función MD5 () de PHP, así como varios traductores en línea de texto a md5sum.

echo "hello" | md5sum

y

echo "hello" > file && md5sum file

Dio el resultado b1946ac92492d2347c6235b4d2611184. Sin embargo, la función md5 () de PHP y casi todos los generadores en línea dieron la salida 5D41402ABC4B2A76B9719D911017C592.

¿Cual es la razon?

Himanshu Shekhar
fuente
38
echo -n "hola"
Martin York

Respuestas:

80

Por defecto, echoincluye un carácter de nueva línea al final de la salida. Sin embargo, PHP y los sitios en línea que usó no incluyen la nueva línea. Para suprimir el carácter de nueva línea, use la -nbandera:

echo -n "hello" | md5sum

Salida:

5d41402abc4b2a76b9719d911017c592 -

Ver: help echo


o con printf:

printf "%s" "hello" | md5sum
Ciro
fuente
Sugeriría mostrar la forma más ampliamente compatible antes de la que se basa en un comportamiento no especificado por POSIX.
Charles Duffy
Gracias. Prefiero mostrar el problema primero con su propio ejemplo y el comportamiento del eco.
Cyrus
77
A menos que conozca el sistema operativo del OP, no sabe que la versión modificada de "su propio ejemplo" realmente funcionará. echo -npodría hacer eco -nsi su Linux está usando un Busybox despojado.
Charles Duffy
Conozco el sistema operativo de OP.
Cyrus
Especifican su núcleo, pero ¿dónde dicen más que eso?
Charles Duffy
100

La respuesta de @ Cyrus está exactamente en el punto de cómo resolver esto: para explicar, cuando se usa echo, generará una nueva línea al final de la cadena. Como puede ver en esta salida en línea, hellocon una nueva línea sale exactamente el MD5 que estaba obteniendo anteriormente. El uso -nsuprime la nueva línea y luego le dará el resultado que esperaba.

ingrese la descripción de la imagen aquí

Editar :

Puede verlo claramente si lo envía a hexdump, lo que muestra el hexadecimal de los bytes allí.

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

Ver el 0a( \n) al final de la cadena

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

Con -necho no pone una nueva línea ( \n) al final

Ahora con una cuerda vacía

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

Solo el personaje New Line

$ echo -n  "" | hd

Cadena vacía, por lo que hexdumpno muestra salida

Jonno
fuente
2
Sería más interesante para tubería echo helloy echo -n hellopara hexdump -C, respectivamente;)
Tom Yan
19
Recomiendo en contra echo -n, ya que es no estándar y apoyado inconsistente (véase el Unix Spec único paraecho y un catálogo más detallado de incompatibilidades de Sven Mascheck ). Si desea que funcione de manera consistente, use printfen su lugar; es un poco más complejo de usar (debe especificar una cadena de formato además de los datos que desea imprimir), pero la OMI vale la pena para evitar problemas. En este caso, printf "%s" "hello"hará el truco.
Gordon Davisson