La valeur de hachage MD5 est différente de Bash et PHP [dupliquer]

60

J'ai essayé de générer la somme MD5 (à l'aide de md5sum) d'une chaîne, "hello". J'ai essayé différentes méthodes telles que l'outil md5sum sous Linux, la fonction MD5 () de PHP, ainsi que divers traducteurs de texte en ligne en md5sum.

echo "hello" | md5sum

et

echo "hello" > file && md5sum file

A donné le résultat b1946ac92492d2347c6235b4d2611184. Cependant, la fonction PHP md5 () et presque tous les générateurs en ligne ont donné le résultat 5D41402ABC4B2A76B9719D911017C592.

Quelle est la raison?

Himanshu Shekhar
la source
38
echo -n "bonjour"
Martin York

Réponses:

80

Par défaut, echoinclut un caractère de nouvelle ligne à la fin de la sortie. Cependant, PHP et les sites en ligne que vous avez utilisés n'incluent pas la nouvelle ligne. Pour supprimer le caractère de nouvelle ligne, utilisez le -ndrapeau:

echo -n "hello" | md5sum

Sortie:

5d41402abc4b2a76b9719d911017c592 -

Voir: help echo


ou avec printf:

printf "%s" "hello" | md5sum
Cyrus
la source
Je suggérerais de montrer la forme plus largement compatible avant celle qui repose sur un comportement non spécifié par POSIX.
Charles Duffy
Je vous remercie. Je préfère montrer le problème d'abord avec son propre exemple et le comportement d'écho.
Cyrus
7
Sauf si vous connaissez le système d'exploitation de l'OP, vous ne savez pas que la version modifiée de "leur propre exemple" fonctionnera réellement. echo -npourrait écho -nsi leur Linux utilise une Busybox dépouillée.
Charles Duffy
Je connais le système d'exploitation d'OP.
Cyrus
Ils spécifient leur noyau, mais où disent-ils plus que cela?
Charles Duffy
100

@ Cyrus répond exactement à la question de savoir comment résoudre ce problème - pour expliquer, son utilisation echogénérera une nouvelle ligne à la fin de la chaîne. Comme vous pouvez le constater sur cette sortie en ligne, helloavec une nouvelle ligne, vous obtenez exactement le MD5 que vous obteniez auparavant. L'utilisation -nsupprime la nouvelle ligne et vous donnera ensuite le résultat attendu.

entrez la description de l'image ici

Modifier :

Vous pouvez le voir clairement si vous le sortez hexdump, ce qui indique l'hexadécimal des octets.

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

Voir le 0a( \n) à la fin de la chaîne

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

Avec -necho ne met pas une nouvelle ligne ( \n) à la fin

Maintenant avec une chaîne vide

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

Juste le personnage de la nouvelle ligne

$ echo -n  "" | hd

Chaîne vide, hexdumpne montre donc pas de sortie

Jonno
la source
2
Serait plus intéressant de pipe echo helloet echo -n helloà hexdump -Crespectivement;)
Tom Yan
19
Je le déconseille echo -n, car il est non standard et pris en charge de manière incohérente (voir les echoSpécifications Single Unix pour et un catalogue plus détaillé des incompatibilités de Sven Mascheck ). Si vous voulez que cela fonctionne de manière cohérente, utilisez printfplutôt; son utilisation est un peu plus complexe (vous devez spécifier une chaîne de format en plus des données que vous voulez imprimer), mais IMO en vaut la peine pour éviter tout problème. Dans ce cas, printf "%s" "hello"fera l'affaire.
Gordon Davisson