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?


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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.