มีองค์ประกอบแบบสุ่มจำนวนเท่าใดก่อนที่ MD5 จะสร้างการชน


164

ฉันมีห้องสมุดภาพใน Amazon S3 สำหรับแต่ละภาพฉัน md5 URL ต้นทางบนเซิร์ฟเวอร์ของฉันพร้อมกับเวลาประทับเพื่อรับชื่อไฟล์ที่ไม่ซ้ำกัน เนื่องจาก S3 ไม่สามารถมีไดเรกทอรีย่อยได้ฉันจึงต้องจัดเก็บรูปภาพเหล่านี้ทั้งหมดไว้ในโฟลเดอร์ flat เดียว

ฉันจำเป็นต้องกังวลเกี่ยวกับการชนกันในค่าแฮชของ MD5 ที่สร้างขึ้นหรือไม่

โบนัส: ฉันสามารถมีไฟล์ได้กี่ไฟล์ก่อนที่ฉันจะเริ่มเห็นการชนในค่าแฮชที่ MD5 สร้าง



2
คำตอบที่แท้จริงคือไฟล์ที่สองอาจมี MD5 เหมือนกับไฟล์แรก อย่างไรก็ตามราคามีขนาดเล็กมาก
Rick James

คำตอบ:


309

ความน่าจะเป็นของการชนสองครั้งโดยบังเอิญคือ1/2 128 ซึ่งเท่ากับ 1 ใน 340 ล้านล้าน 282 ล้านล้าน 366 nonillion 920 octillion 938 ล้านล้าน 463 ล้านล้าน 463 ล้านล้าน 374 ล้านล้าน 607 ล้านล้าน 431 พันล้าน 768 ล้าน 211 พัน 456

แต่ถ้าคุณเก็บ hashes ทั้งหมดแล้วน่าจะเป็นขอบคุณบิตที่สูงขึ้นเพื่อความขัดแย้งวันเกิด ที่จะมีโอกาส 50% ของชนกัญชาใด ๆ กับกัญชาอื่น ๆ ที่คุณต้องการ2 64 hashes ซึ่งหมายความว่าจะได้รับการปะทะกันโดยเฉลี่ยแล้วคุณจะต้องกัญชา6 พันล้านไฟล์ต่อวินาที 100 ปี


20
"ความน่าจะเป็นของการชนคือ 1/2 ^ 64" - อะไรนะ ความน่าจะเป็นของการชนนั้นขึ้นอยู่กับจำนวนรายการที่แฮชแล้วไม่ใช่จำนวนที่แน่นอน ในความเป็นจริงก็เท่ากับว่า1 - sPn/s^nที่sเป็นขนาดของพื้นที่การค้นหา ( 2^128ในกรณีนี้) และnเป็นจำนวนรายการที่ถก สิ่งที่คุณคิดว่าน่าจะเป็น2^64ซึ่งเป็นจำนวนรายการโดยประมาณที่คุณต้องการ MD5 แฮชเพื่อให้มีโอกาส 50% ของการชน
BlueRaja - Danny Pflughoeft

19
+1 เพราะฉันอยากรู้วิธีนับที่ผ่านมา 999 ล้านล้านฮ่า ๆ (และใช่คำตอบของคุณเป็นข้อมูล)
Kmeixner

7
น่าเสียดายที่คุณยังไม่ถูกต้อง คุณกำลังสมมติว่าฟังก์ชันแฮชนั้นสุ่มอย่างแท้จริง มันไม่ใช่. ซึ่งหมายความว่าความน่าจะเป็นในการปะทะนั้นสูงขึ้น
Jørgen Fogh

22
JørgenFogh: และกฎของฟิสิกส์ทั้งหมดก็คือ "ไม่ถูกต้อง" เช่นกัน ระดับของลัทธิอวดรู้ดังกล่าวไม่จำเป็นเพราะมันไม่ได้เปลี่ยนคำตอบในทางที่มีความหมายใด ๆ
Kornel

21
ดังนั้นคุณกำลังพูดว่ามีโอกาส!
vargonian

27

S3 สามารถมีไดเรกทอรีย่อย เพียงใส่ "/" ในชื่อคีย์และคุณสามารถเข้าถึงไฟล์ราวกับว่าพวกเขาอยู่ในไดเรกทอรีที่แยกต่างหาก ฉันใช้สิ่งนี้เพื่อจัดเก็บไฟล์ผู้ใช้ในโฟลเดอร์แยกตาม ID ผู้ใช้ใน S3

ตัวอย่างเช่น: "mybucket / users / 1234 / somefile.jpg" มันไม่เหมือนกับไดเรกทอรีในระบบไฟล์ แต่ S3 API มีคุณสมบัติบางอย่างที่ทำให้มันเกือบจะเหมือนกัน ฉันสามารถขอให้ลิสต์รายการไฟล์ทั้งหมดที่ขึ้นต้นด้วย "users / 1234 /" และมันจะแสดงไฟล์ทั้งหมดในไดเร็กตอรี่ "directory"


7
นี่ควรเป็นเนื้อหาที่ฉันคิดว่าจริง ๆ แล้วมันไม่ได้ตอบคำถามเกี่ยวกับความน่าจะเป็นของการปะทะกัน
Ian Clark

18

ดังนั้นรอใช่หรือไม่:

md5(filename) + timestamp

หรือ:

md5(filename + timestamp)

ถ้าก่อนหน้านี้คุณไปหา GUID เป็นส่วนใหญ่และฉันจะไม่กังวลเกี่ยวกับมัน ถ้าอย่างหลังดูโพสต์ของ Karg เกี่ยวกับวิธีที่คุณจะชนในท้ายที่สุด


1
โปรดอธิบายอย่างละเอียดเกี่ยวกับการรวมเวลาที่เพิ่มโอกาสในการปะทะกันอย่างไร
Brad Thomas

14
@BradThomas: มันไม่ได้ ความเสี่ยงของการชนกันของ MD5 นั้นเหมือนกันไม่ว่าจะเป็นในชื่อไฟล์หรือการรวมกันของชื่อไฟล์ + การประทับเวลา แต่ในสถานการณ์แรกคุณจะต้องมีทั้งการชนกันของ MD5 และการชนกันของเวลา
Vincent Hubert

2
สิ่งนี้ยังทำให้มีโอกาส 2 ^ (128 ^ 60) ที่จะเกิดการชนกันกับผู้ใช้สองคนต่อนาที ใช้ไม่ได้อย่างแท้จริง
Berry M.

2
@BradThomas ให้ชัดเจนยิ่งขึ้น: md5(filename) + timestampลดความเสี่ยงในการชนอย่างหนาแน่นเพราะคุณจะต้องมีการชนกันของ md5 สำหรับการประทับเวลาเดียวกันทั้งหมดเพื่อให้การชนโดยรวม md5(filename + timestamp)เป็นเช่นเดียวกับmd5(filename)สมมติว่าชื่อไฟล์นั้นเป็นแบบสุ่มเริ่มต้นด้วย (เนื่องจากการเพิ่มการสุ่มมากขึ้นในบางสิ่งบางอย่างจะเปลี่ยนเฉพาะผล md5 แต่ละรายการและปัญหาวันเกิดยังคงมีอยู่ในแฮช md5 ทั้งหมด)
robocat

10

กฎง่ายๆสำหรับการชนคือสแควร์รูทของช่วงของค่า MD5 sig ของคุณนั้นมีความยาว 128 บิตดังนั้นคุณน่าจะเห็นการชนด้านบนและเกินกว่า 2 ^ 64 ภาพ


1
คุณอาจหมายถึง 128 บิตไม่ใช่ 2 ^ 128 :-)
JesperE

5
en.wikipedia.org/wiki/Birthday_Problem ข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับปัญหา
Georg Schölly

7

แม้ว่าการชนกันของ MD5 แบบสุ่มนั้นหาได้ยากมากหากผู้ใช้ของคุณสามารถให้ไฟล์ (ซึ่งจะถูกเก็บเป็นคำต่อคำ) จากนั้นพวกเขาก็สามารถสร้างการชนกันของข้อมูลได้ นั่นคือพวกเขาจงใจสร้างไฟล์สองไฟล์ด้วย MD5sum เดียวกัน แต่ข้อมูลต่างกัน ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณสามารถจัดการกับเคสนี้ได้อย่างเหมาะสมหรืออาจใช้แฮชที่แรงกว่าเช่น SHA-256


การใช้เกลือจะช่วยดูแลปัญหาด้านวิศวกรรมของผู้ใช้ไม่ใช่หรือ?
StackOverflow

มันขึ้นอยู่กับวิธีการใช้เกลือ มันจะต้องเป็นคำนำหน้าของข้อมูลที่ผู้ใช้จัดหาหรือดีกว่ายังเป็นกุญแจสำคัญสำหรับ HMAC มันอาจเป็นความคิดที่ดีที่จะฝึกฝนการป้องกันในเชิงลึก
bdonlan

หมายเหตุแม้ว่า SHA256 มีความยาว 256 บิต แต่คุณสามารถแลกเปลี่ยนความเสี่ยงจากการชนกับความยาวของคีย์ที่คุณจัดเก็บโดยการตัด SHA256 เป็นบิตที่น้อยลงเช่นใช้ SHA256 แต่ตัดให้เหลือ 128 บิต (ซึ่งปลอดภัยกว่าการใช้ MD5 แม้ว่าพวกเขาจะมีจำนวนบิตเท่ากัน)
robocat

5

ในขณะที่มีปัญหาการประชาสัมพันธ์ MD5 ที่ดีเนื่องจากการชนกันการชนกันโดยไม่ตั้งใจของข้อมูลสุ่มนั้นหาได้ยากมาก ในทางตรงกันข้ามถ้าคุณ hashing ในชื่อไฟล์นั่นไม่ใช่ข้อมูลแบบสุ่มและฉันจะคาดหวังการชนอย่างรวดเร็ว


ปัญหาเดียวที่ฉันมีกับตัวอย่าง Taylors คือว่าถ้ามีคนได้รับสำเนาของฐานข้อมูลของคุณที่พวกเขาอาจจะคิดออกหมายเลขบัตรเครดิตโดยใช้ตารางรุ้ง ...
แซม Saffron

1
ในขณะที่ฉันจะไม่เลือกใช้ MD5 สำหรับบัตรเครดิตตาราง Rainbow ของหมายเลขบัตรเครดิตที่ถูกต้องทั้งหมดระหว่าง 10,000,000 (8 หลักเป็นบัตรเครดิตความยาวที่เล็กที่สุดที่ฉันเคยเห็น) และ 9,999,999,999,999,999 (ตัวเลข 16 ที่ใหญ่ที่สุด) ยังคงเป็นตัวเลขขนาดใหญ่ ตารางที่จะสร้าง อาจมีวิธีที่ง่ายกว่าในการขโมยตัวเลขเหล่านั้น
acrosman

1

ไม่สำคัญว่ามันจะเป็นไปได้อย่างไร มันเป็นไปได้. อาจเกิดขึ้นกับสองสิ่งแรกที่คุณแฮช (ไม่น่าเป็นไปได้ แต่เป็นไปได้) ดังนั้นคุณจะต้องสนับสนุนการชนตั้งแต่ต้น


37
แน่นอนอาจมีสิ่งเลวร้ายอื่น ๆ อีกมากมายที่อาจเกิดขึ้นกับความน่าจะเป็น 1/2 ^ 128 คุณอาจไม่ต้องการที่จะกังวลเรื่องนี้
Will Dean

2
สิ่งที่แย่ที่สุดที่สามารถเกิดขึ้นได้ที่นี่คือคุณสามารถถ่ายรูปได้ สำหรับจำนวนที่ค่อนข้างน้อยฉันจะไม่ต้องกังวล ตอนนี้หากซอฟต์แวร์ของคุณกำลังควบคุมนักบินอัตโนมัติที่ลงจอดเครื่องบินนั่นเป็นอีกเรื่องหนึ่ง
จิม C

9
คุณไม่สามารถจริงจัง คุณจะต้องแฮ็ชไฟล์ 6 พันล้านไฟล์ต่อวินาทีทุกๆวินาทีเป็นเวลา 100 ปีจึงจะมีโอกาสชนกันได้ แม้ว่าคุณจะโชคร้ายมากมันอาจจะใช้เวลามากกว่าความจุทั้งหมดของ S3 ที่ใช้มานานกว่าอายุการใช้งานของมนุษย์
Kornel

13
มีแนวโน้มเป็นพันล้านครั้งที่ฐานข้อมูลและการสำรองข้อมูลของคุณจะล้มเหลว การชนไม่น่ากังวลเลย
Artelius

6
ใช้เวลาในการป้องกันการชนสร้างบังเกอร์เพื่อใส่เซิร์ฟเวอร์ของคุณ! อุกกาบาตที่น่ารำคาญเหล่านั้นสามารถโจมตีคุณ (ไม่น่าเป็นไปได้ แต่เป็นไปได้มาก) ดังนั้นคุณจะต้องสนับสนุนที่หลบฝนจากอุกกาบาต
polvoazul

1

การชนกันของ MD5 นั้นยากมาก หากคุณมีMD5 9 ล้านล้าน MD5 มีโอกาสเดียวเท่านั้นใน9 ล้านล้าน MD5 ที่จะเกิดการชน


1
อีกหลายคำตอบพูดคุยเกี่ยวกับความน่าจะเป็นของการชนกันเมื่อเพิ่มรายการอีกหนึ่งรายการ ฉันคิดว่าคำตอบของฉันมีประโยชน์มากกว่าเพราะพูดถึงความน่าจะเป็นของตารางทั้งหมดที่มีซ้ำ
Rick James

1
สิ่งนี้ไม่เกี่ยวข้องกับ MD5 และไม่ถูกต้อง มันเหมือนกับว่าถ้าคุณมีแมว 9 ล้านล้านตัวมีโอกาส 1 ใน 9 ล้านล้านที่คนอื่นมีแมวเหมือนกัน ปัญหาสำคัญที่นี่คือคุณสามารถรับแฮชเดียวกันที่มีมากกว่าหนึ่งค่า
Joonas Alhonen

@JoonasAlhonen - ใช่นั่นเป็นเรื่องจริง และคนจนจำนวนมากใช้เป็นข้ออ้างในการซื้อตั๋วลอตเตอรีอีกอันที่พวกเขาไม่สามารถซื้อได้
Rick James

ขอบคุณนี่เป็นสถิติที่มีประโยชน์มากจริงๆ อัตราต่อรองของการมีการปะทะกันเมื่อแทรก 9 ล้านล้านรายการ ขอบคุณ
Tom P.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.