MD5 ยังดีพอที่จะระบุไฟล์โดยเฉพาะหรือไม่?


139

MD5 การแฮชไฟล์ยังถือว่าเป็นวิธีที่ดีพอที่จะระบุไฟล์โดยไม่ซ้ำกันเนื่องจากการทำลายอัลกอริทึม MD5 และปัญหาด้านความปลอดภัย ฯลฯ ทั้งหมดหรือไม่ ความปลอดภัยไม่ใช่เรื่องหลักของฉันที่นี่ แต่การระบุแต่ละไฟล์โดยไม่ซ้ำคือ

ความคิดใด ๆ


2
จริงๆแล้วตอนนี้ฉันใช้มันด้วยตัวเองในแอปพลิเคชั่นของฉันและเท่าที่ฉันรู้ว่ามันดีพอที่จะระบุไฟล์โดยเฉพาะ
ไม่มีให้บริการ

2
คุณอาจจะพบคำถามนี้: stackoverflow.com/questions/862346/…มีประโยชน์
sharptooth

คุณต้องระบุไฟล์กี่ไฟล์ มันให้ผล 128bits ดังนั้นหากคุณพยายามระบุไฟล์หลายพันไฟล์มันก็ใช้ได้ แต่ถ้าคุณพยายามที่จะใช้ ID มากกว่านั้นคุณอาจชนเข้ากับ / เกิดความขัดแย้ง
Marcin

พวกมันจะเป็นไฟล์รูปภาพ, jpg, png และ gif และใช่ฉันคิดว่าขีด จำกัด จะเป็นสองสามพัน ... แต่คุณคิดว่าจะมีปัญหากับไฟล์กี่ไฟล์?
Ranhiru Jude Cooray

ที่เกี่ยวข้อง: stackoverflow.com/questions/14973197/…
NeDark

คำตอบ:


89

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


2
@none: สำหรับคำถามแรกของคุณให้ดูที่นี่ ฉันเกรงว่าฉันไม่เข้าใจคำถามอื่น
Marcelo Cantos

9
@ 0xA3: คุณและฉันไม่มีความคิดใด ๆ ว่าไฟล์ที่ OP อ้างถึงคืออะไรหรือความเสียหายที่เกิดจากการประนีประนอมเท่าไหร่ มันอาจเป็นคอลเลกชันภาพถ่ายของเด็กทารกสำหรับทุกสิ่งที่เรารู้ เป้าหมายของฉันคือการให้ข้อเท็จจริง; สิ่งที่คนอื่นทำกับพวกเขาคือธุรกิจของพวกเขา นอกจากนี้ให้พิจารณาว่า Bruce Schneier แนะนำให้จดรหัสผ่านของคุณ ไม่ใช่ทุกสิ่งที่จะต้องเก็บไว้ที่ Fort Knox บางสิ่งบางอย่างจะเก็บไว้ได้ดีภายใต้กระถางดอกไม้
Marcelo Cantos

3
@Marcelo Cantos ฉันคิดว่าสิ่งที่ขาดนี่คือความแตกต่างหรือแกะคำว่า 'ความปลอดภัย' เห็นได้ชัดว่าผู้คนกำลังสันนิษฐานว่า 'ความปลอดภัย' สำหรับการใช้งานการตรวจสอบใด ๆ แต่มาร์เซโลน่าจะหมายถึงการตั้งชื่อ 'ในห้องปฏิบัติการ'
hpavc

5
ฉันไม่เห็นด้วยอย่างยิ่ง ค่าแฮชที่ต่างกันจะบอกว่าไฟล์ต่างกัน แต่สำหรับค่าแฮชที่เท่ากันคุณไม่สามารถพูดว่า "มีโอกาสสูงที่ทั้งคู่จะเหมือนกัน" ถ้าแฮชเหมือนกัน: คุณสามารถเปรียบเทียบไบต์ต่อไบต์เท่านั้น แฮชคือคำสั่งที่มีขนาดเล็กกว่าจำนวนค่าที่แตกต่างกันสำหรับไฟล์ทั้งหมดดังนั้นจึงมีการชนกันที่เป็นไปได้จำนวนมากจำนวนมากที่เป็นไปได้สำหรับค่าแฮชแต่ละค่า เฉพาะในกรณีที่คุณคัดลอกไฟล์ที่รู้จัก (ที่มีแฮชที่รู้จัก) ทำค่าแฮชที่เหมือนกัน "อาจหมายถึง" ไฟล์ที่ 2 ถูกคัดลอกอย่างถูกต้อง (แม้ว่าจะไม่แน่ใจ 100% แต่มีโอกาสสูงมาก)
Olivier Dulac

3
ตกลงคณิตศาสตร์ของฉันแย่ GUID มีเอนโทรปีประมาณ 122 บิตดังนั้นความน่าจะเป็นของการชนที่ใดก็ได้ในพันล้านไฟล์จะอยู่ที่ประมาณ 2 ^ (2 * 30 - 122) = 2 ^ -62 ในขณะนี้สูงกว่าการคำนวณเดิมของฉันมาก แต่ก็ยังเล็กจิ๋วที่หนึ่งใน 4-quintillion
Marcelo Cantos

32

เพื่อวัตถุประสงค์ในการปฏิบัติกัญชาที่สร้างขึ้นอาจจะสุ่มเหมาะสม แต่ในทางทฤษฎีมีอยู่เสมอน่าจะเป็นของการปะทะกันที่เกิดจากการหลักรังนกพิราบ การมีแฮชแตกต่างกันอย่างแน่นอนหมายความว่าไฟล์ต่างกัน แต่การแฮชเดียวกันไม่ได้แปลว่าไฟล์เหมือนกัน

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


16
@Ranhiru ไม่แฮชจะให้ค่า 'สรุป' ซึ่ง (สำหรับ MD5) มีความยาวเพียง 16 ไบต์ หากต้องการรับประกันว่าไฟล์เหมือนกันคุณจะต้องทำการตรวจสอบแบบไบท์ต่อไบต์ สิ่งนี้เป็นจริงไม่ว่าคุณจะเลือกอัลกอริธึมแฮชแบบใดก็ตามจะมีความเป็นไปได้ที่จะเกิดการชน
PaulG

6
@Ranhiru อ่านคำตอบนี้มันครอบคลุมมากที่สุดที่นี่ การแฮชสามารถใช้เป็นขั้นตอนแรกซึ่งจะทำให้คุณมั่นใจได้ถึง 99.99 ^ e% ว่าไฟล์เหมือนกัน แต่ถ้าคุณต้องการที่จะมั่นใจ100%แน่นอนคุณจะต้องทำการตรวจสอบไบต์ด้วยไบต์ สิ่งนี้เป็นจริงไม่ว่าคุณจะใช้ MD5, SHA หรืออัลกอริทึมอื่น ๆ
PaulG

7
คำตอบนี้ผิด การป้องกันการปลอมแปลงและการตรวจสอบเอกลักษณ์เป็นสิ่งเดียวกัน นอกจากนี้ในขณะที่การแปลงแป้นพิมพ์ไม่ได้รับประกันความเป็นเอกลักษณ์และไม่ได้ทำการเปรียบเทียบจริง ในความเป็นจริงความน่าจะเป็นของการชนโดยบังเอิญนั้นต่ำกว่าความเป็นไปได้ของการเปรียบเทียบความล้มเหลวเนื่องจากข้อบกพร่องใน CPU ที่เกิดจากการปล่อยรังสีแกมมาแสงอาทิตย์ปกติ และอย่าลืมว่าบ่อยครั้งที่แหล่งที่มาของไฟล์กำลังนั่งอยู่ในอีกด้านหนึ่งของโลกภายในเว็บเซิร์ฟเวอร์และข้อมูลอิสระเพียงชิ้นเดียวที่คุณมีเพื่อการเปรียบเทียบคือแฮช
Marcelo Cantos

8
@Marcelo ไม่สามารถให้เหตุผลเชิงตรรกะได้ว่าการชนกันโดยบังเอิญนั้นมีโอกาสน้อยกว่าการพลิกบิตโดยไม่ตั้งใจ (ในขณะทำการเปรียบเทียบแบบไบต์ต่อไบต์) คุณยังมีโอกาสที่จะพลิกบิตเมื่อสร้างแฮช (และมีเนื้อหามากขึ้นเนื่องจากต้องใช้เวลาในการประมวลผลมากขึ้น) @Thomas ยกประเด็นนี้ขึ้นมาเพื่อแนะนำว่าไม่มีวิธีการรับประกันการระบุเอกลักษณ์แม้ว่าผลกระทบของการพลิกบิตจะเป็นที่ถกเถียงกันอย่างมาก การประเมินในแง่ร้ายที่สุดคือ 1 การพลิกต่อ GB / ชั่วโมงและ ECC RAM จะลบแม้กระทั่ง
PaulG

2
"ความน่าจะเป็นของการชนกันโดยบังเอิญโดยบังเอิญนั้นต่ำกว่าความน่าจะเป็นของการเปรียบเทียบที่ล้มเหลวเนื่องจากข้อบกพร่องในซีพียูที่เกิดจากการปล่อยรังสีแกมม่าแสงอาทิตย์ปกติ" [อ้างจำเป็น]
endolith

20

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

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


2
คำตอบนี้อาจทำให้เข้าใจผิดเล็กน้อยหากผู้อ่านไม่คุ้นเคยกับการแฮช ไม่มีอะไรที่เป็นเรื่องเกี่ยวกับที่มีมนต์ขลัง SHA ที่ป้องกันการชนกันกัญชาพวกเขาเป็นเพียงมากขึ้นทนต่อกัญชาชนโจมตี หากคุณต้องการมีความมั่นใจมากกว่า 99.999 ^ e% ว่าไฟล์เหมือนกันคุณจะต้องตรวจสอบไบต์ต่อไบต์
PaulG

7
ที่จริงแล้วการเปรียบเทียบแบบไบต์ต่อไบต์อาจล้มเหลวเนื่องจากรังสีคอสมิกพลิกบิต (เช่นการแปลง a return 0;เป็น a return 1;) สิ่งนี้ไม่น่าเป็นไปได้สูง แต่ความเสี่ยงของการชนกับ SHA-256 นั้นน้อยกว่านั้น ในทางคณิตศาสตร์คุณไม่สามารถแน่ใจได้ว่าไฟล์สองไฟล์ที่แฮชกับค่าเดียวกันเหมือนกัน แต่คุณไม่สามารถแน่ใจได้ว่าจะเปรียบเทียบไฟล์ด้วยตัวเองตราบใดที่คุณใช้คอมพิวเตอร์เพื่อทำการเปรียบเทียบ สิ่งที่ฉันหมายถึงคือมันไม่มีความหมายเลยที่จะไปให้ไกลกว่า 99.999 .... ความมั่นใจ 9% และ SHA-256 นั้นให้มากกว่านั้น
โทมัสพริน

2
อะไรคุณไม่ใช้หน่วยความจำ ECC ;) ความคิดเห็นที่ดีความคิดที่น่าสนใจมาก
PaulG

1
อย่าลืมหมวกฟอยล์ดีบุก! คุณรู้ได้อย่างไรว่าข้อมูลเหล่านี้เกี่ยวกับการชนและคุณยืนยันเรื่องนี้ในทางใดทางหนึ่ง
James P.

@ThomasPornin การพลิกบิตของ Cosmic ray จะส่งผลกระทบต่อวิธีการ MD5 เช่นกันดังนั้นจึงยังแย่กว่าเดิม
endolith

9

md5 สามารถสร้างการชนกัน ในทางทฤษฎีแม้ว่าจะมีความเป็นไปได้สูงมากที่ไฟล์หนึ่งล้านไฟล์ในแถวสามารถสร้างแฮชเดียวกันได้ อย่าทดสอบโชคของคุณและตรวจสอบการชน md5 ก่อนเก็บค่า

ฉันชอบสร้างสตริงสุ่ม md5 ซึ่งลดค่าใช้จ่ายของการแฮชไฟล์ขนาดใหญ่ เมื่อพบการชนกันฉันจะวนซ้ำและแฮชอีกครั้งด้วยการวนรอบต่อท้าย

คุณสามารถอ่านหลักการของนกพิราบได้


6

ฉันจะไม่แนะนำที่นี่ หากแอปพลิเคชันทำงานบนระบบผู้ใช้หลายคนอาจมีผู้ใช้ที่จะมีสองไฟล์ที่มีแฮช md5 เดียวกัน (เขาอาจเป็นวิศวกรและเล่นไฟล์ดังกล่าวหรืออยากรู้อยากเห็น - พวกเขาสามารถดาวน์โหลดได้ง่ายจากhttp: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.htmlฉันเองในระหว่างการเขียนคำตอบนี้ดาวน์โหลดตัวอย่างสองตัวอย่าง) อีกสิ่งหนึ่งคือแอพพลิเคชั่นบางตัวอาจจัดเก็บข้อมูลที่ซ้ำกันไม่ว่าด้วยเหตุผลใด ๆ (ฉันไม่แน่ใจว่ามีแอพพลิเคชั่นดังกล่าว

หากคุณระบุไฟล์ที่สร้างขึ้นโดยโปรแกรมของคุณโดยเฉพาะฉันจะบอกว่าใช้ MD5 ได้ มิฉะนั้นฉันจะแนะนำฟังก์ชั่นแฮชอื่น ๆ ที่ยังไม่มีการชนกัน


2

โดยส่วนตัวแล้วฉันคิดว่าผู้คนใช้เช็คซัมแบบดิบ (เลือกวิธีการของคุณ) ของวัตถุอื่น ๆ เพื่อทำตัวเป็นตัวระบุที่ไม่ซ้ำกันมากเกินไปเมื่อพวกเขาต้องการจะทำจริงๆก็คือมีตัวระบุที่ไม่ซ้ำกัน การพิมพ์ลายนิ้วมือวัตถุสำหรับการใช้งานนี้ไม่ได้มีเจตนาและมีแนวโน้มที่จะต้องใช้ความคิดมากกว่าการใช้กลไกความสมบูรณ์ของ uuid หรือคล้ายกัน


0

MD5 ใช้งานไม่ได้คุณสามารถใช้ SHA1 แทน (ใช้งานในภาษาส่วนใหญ่)


นี่เป็นคำตอบที่ดีอย่างสมบูรณ์ MD5 ไม่สามารถใช้กับกรณีการใช้งานด้านกฎหมายและการบัญชีในยุโรปได้ตั้งแต่เดือนพฤษภาคม 2018 เป็นต้นไป
Bert Sinnema

@BertSinnema คุณสามารถบอกฉันถึงแหล่งที่กำหนดฟังก์ชันแฮชที่ยอมรับได้ ฯลฯ ได้ไหม
berezovskyi

@ GregSchmit อาจเป็นเพราะ OP ไม่ได้สนใจเรื่องความแข็งแกร่งของการเข้ารหัสลับ ฉันเข้าใจคำถามว่า "ฉันใช้ MD5 ในบริบทที่ไม่ใช่ความปลอดภัยแล้วฉันต้องใช้เวลาในการอัปเดตรหัสหรือไม่" ชนิดของสิ่ง. และในบริบทนี้คำตอบก็น่าจะผิดและ SHA1 ก็ถูกทำลายเช่นกัน
berezovskyi

0

เมื่อทำการแฮชสตริง (<ไม่กี่ K?) สตริงหนึ่ง (หรือไฟล์) หนึ่งสามารถสร้างคีย์แฮช md5 สองอันอันหนึ่งสำหรับสตริงจริงและอีกอันหนึ่งสำหรับการย้อนกลับของสตริงที่ต่อกันกับสตริงแบบอสมมาตรสั้น ๆ ตัวอย่าง: md5 (ย้อนกลับ (สตริง || '1010')) การเพิ่มสตริงพิเศษทำให้มั่นใจได้ว่าแม้ไฟล์ที่ประกอบด้วยชุดของบิตที่เหมือนกันจะสร้างคีย์ที่แตกต่างกันสองปุ่ม โปรดเข้าใจว่าแม้ภายใต้โครงร่างนี้มีโอกาสทางทฤษฎีของปุ่มแฮชสองปุ่มที่เหมือนกันสำหรับสตริงที่ไม่เหมือนกัน แต่ความน่าจะเป็นดูเหมือนน้อยมาก - บางอย่างตามลำดับของกำลังสองของความน่าจะเป็นการชนกัน md5 และประหยัดเวลา อาจมีความสำคัญเมื่อจำนวนไฟล์เพิ่มขึ้น รูปแบบที่ซับซ้อนมากขึ้นสำหรับการสร้างสตริงที่สองนั้นอาจพิจารณาได้เช่นกัน

ในการตรวจสอบว่ามีการชนกันหรือไม่สามารถเรียกใช้การทดสอบนี้เพื่อหาเอกลักษณ์ของคีย์แฮช md5 สำหรับ bit_vectors ทั้งหมดใน db:

เลือก md5 (bit_vector), count (*), bit_and (bit_vector) จาก db กับ
กลุ่มbit_vector โดย md5 (bit_vector), bit_vector มี bit_vector (บิต _vector) <> bit_vector


ความคิดที่ชาญฉลาด หาก "ผู้โจมตี" สร้างไฟล์ปลอมที่มีแฮช md5 เดียวกันมันจะไม่ช่วยถ้าเขารู้ "เกลือ" ของคุณและการย้อนกลับเนื้อหาจะสร้างแฮชที่แตกต่างกัน การใช้ปุ่ม 2 md5 เช่นนั้นจะลดราคาได้มาก หากเพียงเพื่อป้องกัน "การโจมตี" โดยใช้เกลือก่อนการคำนวณในพื้นที่จะเพียงพอ
Wolf5

0

ฉันชอบคิดว่า MD5 เป็นตัวบ่งชี้ความน่าจะเป็นเมื่อจัดเก็บข้อมูลไฟล์จำนวนมาก

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

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