O valor do hash MD5 é diferente do Bash e PHP [duplicado]

60

Eu tentei gerar a soma MD5 (usando md5sum) de uma string, "olá". Tentei métodos diferentes como a ferramenta md5sum no Linux, a função MD5 () do PHP, bem como vários textos online para tradutores do md5sum.

echo "hello" | md5sum

e

echo "hello" > file && md5sum file

Deu o resultado b1946ac92492d2347c6235b4d2611184. No entanto, a função md5 () do PHP e quase todos os geradores online forneceram a saída 5D41402ABC4B2A76B9719D911017C592.

Qual é a razão?

Himanshu Shekhar
fonte
38
eco -n "olá"
Martin York

Respostas:

80

Por padrão, echoinclui um caractere de nova linha no final da saída. No entanto, o PHP e os sites online que você usou não incluem a nova linha. Para suprimir o caractere de nova linha, use o -nsinalizador:

echo -n "hello" | md5sum

Resultado:

5d41402abc4b2a76b9719d911017c592 -

Vejo: help echo


ou com printf:

printf "%s" "hello" | md5sum
Cyrus
fonte
Eu sugeriria mostrar a forma mais amplamente compatível antes da que se baseia em comportamentos não especificados pelo POSIX.
Charles Duffy
Obrigado. Prefiro mostrar o problema primeiro com seu próprio exemplo e o comportamento do eco.
Cyrus
7
A menos que você conheça o sistema operacional do OP, não sabe que a versão modificada de "seu próprio exemplo" funcionará realmente. echo -npodem ecoar -nse o Linux estiver usando um Busybox despojado.
Charles Duffy
Eu conheço o sistema operacional da OP.
Cyrus
Eles especificam seu kernel, mas onde eles dizem mais do que isso?
Charles Duffy
100

A resposta de @ Cyrus está exatamente no ponto de como resolver isso - para explicar, ao usá- echolo, será exibida uma nova linha no final da string. Como você pode ver nesta saída online, hellocom uma nova linha gera exatamente o MD5 que você estava recebendo anteriormente. O uso -nsuprime a nova linha e fornece o resultado esperado.

insira a descrição da imagem aqui

Editar :

Você pode vê-lo claramente se você o fizer hexdump, o que mostra o hexadecimal dos bytes lá.

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

Veja the 0a( \n) no final da string

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

Com -neco não coloca uma nova linha ( \n) no final

Agora com uma string vazia

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

Apenas o caractere de nova linha

$ echo -n  "" | hd

String vazia, portanto hexdumpnão mostra saída

Jonno
fonte
2
Seria mais interessante para canalizar echo helloe echo -n hellopara hexdump -Crespectivamente;) #
11116 Tom Yan
19
Eu recomendo echo -n, já que é fora do padrão e é suportado de maneira inconsistente (consulte a Single Unix Spececho e um catálogo mais detalhado de incompatibilidades de Sven Mascheck ). Se você deseja que ele funcione consistentemente, use printf; é um pouco mais complexo de usar (você precisa especificar uma sequência de formatos além dos dados que deseja imprimir), mas a IMO vale a pena para evitar problemas. Nesse caso, printf "%s" "hello"fará o truque.
Gordon Davisson 22/02