ค่าแฮ MD5 จะแตกต่างจาก Bash และ PHP [ซ้ำกัน]


60

ฉันพยายามสร้างผลรวมMD5 (โดยใช้ md5sum) ของสตริง "hello" ฉันลองใช้วิธีการต่าง ๆ เช่นเครื่องมือ md5sum ใน Linux, ฟังก์ชั่น MD5 () ของ PHP รวมถึงข้อความออนไลน์ต่างๆให้กับนักแปล md5sum

echo "hello" | md5sum

และ

echo "hello" > file && md5sum file

b1946ac92492d2347c6235b4d2611184ให้ผล แต่ของ PHP md5 () 5D41402ABC4B2A76B9719D911017C592ฟังก์ชันและเกือบทุกเครื่องกำเนิดไฟฟ้าออนไลน์ให้เอาท์พุท

เหตุผลคืออะไร


38
echo -n "hello"
Martin York

คำตอบ:


80

โดยค่าเริ่มต้นechoรวมถึงตัวละครขึ้นบรรทัดใหม่ในตอนท้ายของการส่งออก อย่างไรก็ตาม PHP และเว็บไซต์ออนไลน์ที่คุณใช้ไม่รวมบรรทัดใหม่ ในการระงับอักขระขึ้นบรรทัดใหม่ให้ใช้-nแฟล็ก:

echo -n "hello" | md5sum

เอาท์พุท:

5d41402abc4b2a76b9719d911017c592 -

ดู: help echo


หรือกับ printf:

printf "%s" "hello" | md5sum

ฉันขอแนะนำให้แสดงรูปแบบที่เข้ากันได้อย่างกว้างขวางมากขึ้นก่อนที่รูปแบบที่ขึ้นอยู่กับพฤติกรรมที่ไม่ได้ระบุโดย POSIX
Charles Duffy

ขอขอบคุณ. ฉันชอบที่จะแสดงปัญหาก่อนด้วยตัวอย่างของเขาเองและพฤติกรรมของเสียงสะท้อน
Cyrus

7
หากคุณไม่ทราบระบบปฏิบัติการของ OP คุณจะไม่ทราบว่า "ตัวอย่างของตนเอง" ที่แก้ไขแล้วจะใช้งานได้จริง echo -nสามารถสะท้อนได้-nหาก Linux ใช้ Busybox ที่ถูกตัดทอน
ชาร์ลส์ดัฟฟี่

ฉันรู้ว่าระบบปฏิบัติการของ OP
Cyrus

พวกเขาระบุเคอร์เนล แต่พวกเขาพูดอะไรมากกว่านั้น?
Charles Duffy

100

@ คำตอบของ Cyrus นั้นตรงกับวิธีการแก้ไขนี้ - เพื่ออธิบายเมื่อใช้echoมันจะออกบรรทัดใหม่ในตอนท้ายของสตริง อย่างที่คุณเห็นในผลลัพธ์ออนไลน์นี้helloด้วยการขึ้นบรรทัดใหม่ว่า MD5 ที่คุณได้รับก่อนหน้านี้ การใช้-nไม่ขึ้นบรรทัดใหม่จากนั้นจะให้ผลลัพธ์ที่คุณต้องการ

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข :

คุณสามารถดูได้อย่างชัดเจนหากคุณส่งออกไปhexdumpซึ่งแสดงเลขฐานสิบหกของไบต์ที่มี

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

ดู0a( \n) ในตอนท้ายของสตริง

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

ด้วย-necho ไม่ได้ใส่บรรทัดใหม่ ( \n) ในท้ายที่สุด

ตอนนี้มีสตริงว่าง

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

เพียงตัวละครขึ้นบรรทัดใหม่

$ echo -n  "" | hd

สตริงว่างดังนั้นจึงhexdumpไม่แสดงผลลัพธ์


2
จะน่าสนใจมากขึ้นในท่อecho helloและecho -n helloจะhexdump -Cตามลำดับ;)
ทอมยัน

19
ฉันขอแนะนำecho -nเนื่องจากไม่รองรับและไม่สอดคล้องกัน (ดูUnix Spec เดียวechoและแคตตาล็อกที่มีรายละเอียดเพิ่มเติมเกี่ยวกับความเข้ากันไม่ได้ของ Sven Mascheck ) คุณต้องการให้มันใช้งานได้อย่างสม่ำเสมอใช้printfแทน มันซับซ้อนกว่าเล็กน้อยที่จะใช้ (คุณต้องระบุสตริงรูปแบบเพิ่มเติมจากข้อมูลที่คุณต้องการพิมพ์) แต่ IMO ก็คุ้มค่าเพื่อหลีกเลี่ยงปัญหา ในกรณีนี้printf "%s" "hello"จะทำเคล็ดลับ
Gordon Davisson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.