Nilai hash MD5 berbeda dari Bash dan PHP [duplikat]

60

Pertanyaan ini sudah ada jawabannya di sini:

Saya mencoba untuk menghasilkan jumlah MD5 (menggunakan md5sum) dari sebuah string, "halo". Saya mencoba berbagai metode sebagai alat md5sum di Linux, fungsi MD5 () PHP, serta berbagai teks online ke penerjemah md5sum.

echo "hello" | md5sum

dan

echo "hello" > file && md5sum file

Berikan hasilnya b1946ac92492d2347c6235b4d2611184. Namun, fungsi md5 () PHP dan hampir semua generator online memberikan output 5D41402ABC4B2A76B9719D911017C592.

Apa alasannya?

Himanshu Shekhar
sumber
38
echo -n "hello"
Martin York

Jawaban:

80

Secara default, echosertakan karakter baris baru di akhir output. Namun, PHP dan situs online yang Anda gunakan tidak menyertakan baris baru. Untuk menekan karakter baris baru, gunakan -nbendera:

echo -n "hello" | md5sum

Keluaran:

5d41402abc4b2a76b9719d911017c592 -

Lihat: help echo


atau dengan printf:

printf "%s" "hello" | md5sum
Cyrus
sumber
Saya akan menyarankan menunjukkan bentuk yang lebih kompatibel secara luas sebelum yang bergantung pada perilaku yang tidak ditentukan oleh POSIX.
Charles Duffy
Terima kasih. Saya lebih suka menunjukkan masalahnya terlebih dahulu dengan contohnya sendiri dan perilaku gema.
Cyrus
7
Kecuali Anda tahu sistem operasi OP, Anda tidak tahu bahwa versi modifikasi dari "contoh mereka sendiri" akan benar-benar berfungsi. echo -ndapat bergema -njika Linux mereka menggunakan Busybox yang dilucuti.
Charles Duffy
Saya tahu sistem operasi OP.
Cyrus
Mereka menentukan kernel mereka, tetapi di mana mereka mengatakan lebih dari itu?
Charles Duffy
100

Jawaban @ Cyrus tepat pada titik dengan cara mengatasi ini - untuk menjelaskan, ketika menggunakannya echoakan menghasilkan baris baru di akhir string. Seperti yang Anda lihat pada output online ini, hellodengan baris baru persis MD5 yang Anda dapatkan sebelumnya. Menggunakan -nmenekan baris baru, dan kemudian akan memberi Anda hasil yang Anda harapkan.

masukkan deskripsi gambar di sini

Edit :

Anda dapat melihatnya dengan jelas jika Anda output ke hexdump, yang menunjukkan heksadesimal dari byte di sana.

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

Lihat 0a( \n) di akhir string

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

Dengan -ngema tidak menempatkan baris baru ( \n) pada akhirnya

Sekarang dengan string kosong

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

Hanya karakter Baris Baru

$ echo -n  "" | hd

String kosong, jadi hexdumptidak menunjukkan output

Jonno
sumber
2
Akan lebih menarik untuk pipa echo hellodan masing echo -n hello- hexdump -Cmasing;)
Tom Yan
19
Saya merekomendasikan echo -n, karena tidak standar dan tidak konsisten didukung (lihat Single Unix Spec untukecho dan katalog yang lebih rinci tentang ketidakcocokan oleh Sven Mascheck ). Jika Anda ingin bekerja secara konsisten, gunakan printfsaja; itu sedikit lebih rumit untuk digunakan (Anda harus menentukan string format selain data yang ingin Anda cetak), tetapi IMO layak untuk menghindari masalah. Dalam hal ini, printf "%s" "hello"akan melakukan trik.
Gordon Davisson