MD5 การแฮชไฟล์ยังถือว่าเป็นวิธีที่ดีพอที่จะระบุไฟล์โดยไม่ซ้ำกันเนื่องจากการทำลายอัลกอริทึม MD5 และปัญหาด้านความปลอดภัย ฯลฯ ทั้งหมดหรือไม่ ความปลอดภัยไม่ใช่เรื่องหลักของฉันที่นี่ แต่การระบุแต่ละไฟล์โดยไม่ซ้ำคือ
ความคิดใด ๆ
MD5 การแฮชไฟล์ยังถือว่าเป็นวิธีที่ดีพอที่จะระบุไฟล์โดยไม่ซ้ำกันเนื่องจากการทำลายอัลกอริทึม MD5 และปัญหาด้านความปลอดภัย ฯลฯ ทั้งหมดหรือไม่ ความปลอดภัยไม่ใช่เรื่องหลักของฉันที่นี่ แต่การระบุแต่ละไฟล์โดยไม่ซ้ำคือ
ความคิดใด ๆ
คำตอบ:
ใช่. MD5 ได้รับการแตกหักอย่างสมบูรณ์จากมุมมองด้านความปลอดภัย แต่ความน่าจะเป็นของการชนโดยบังเอิญนั้นยังคงมีน้อย ตรวจสอบให้แน่ใจว่าไฟล์นั้นไม่ได้ถูกสร้างขึ้นโดยคนที่คุณไม่ไว้วางใจและอาจมีเจตนาร้าย
เพื่อวัตถุประสงค์ในการปฏิบัติกัญชาที่สร้างขึ้นอาจจะสุ่มเหมาะสม แต่ในทางทฤษฎีมีอยู่เสมอน่าจะเป็นของการปะทะกันที่เกิดจากการหลักรังนกพิราบ การมีแฮชแตกต่างกันอย่างแน่นอนหมายความว่าไฟล์ต่างกัน แต่การแฮชเดียวกันไม่ได้แปลว่าไฟล์เหมือนกัน
การใช้ฟังก์ชันแฮชเพื่อจุดประสงค์นั้น - ไม่ว่าจะคำนึงถึงความปลอดภัยหรือไม่ก็ตาม - ดังนั้นจึงควรเป็นเพียงขั้นตอนแรกของการตรวจสอบเสมอโดยเฉพาะอย่างยิ่งหากอัลกอริทึมแฮชเป็นที่รู้จัก หากต้องการตรวจสอบว่าไฟล์สองไฟล์ที่มีแฮชเดียวกันแตกต่างกันอย่างน่าเชื่อถือหรือไม่คุณจะต้องเปรียบเทียบไฟล์เหล่านั้นแบบไบต์ต่อไบต์
MD5 จะดีพอถ้าคุณไม่มีปฏิปักษ์ อย่างไรก็ตามบางคนสามารถสร้างไฟล์ที่แตกต่างกันสองไฟล์ซึ่งแฮชเป็นค่าเดียวกัน (เรียกว่า collision) และอาจเป็นปัญหาหรือไม่ขึ้นอยู่กับสถานการณ์ที่แน่นอนของคุณ
เนื่องจากการรู้ว่าจุดอ่อน MD5 ที่รู้จักนั้นนำไปใช้กับบริบทที่กำหนดหรือไม่นั้นเป็นเรื่องที่ละเอียดอ่อนจึงแนะนำให้ไม่ใช้ MD5 การใช้ฟังก์ชันแฮชที่ทนต่อการชน (SHA-256 หรือ SHA-512) เป็นคำตอบที่ปลอดภัย นอกจากนี้การใช้ MD5 ก็เป็นการประชาสัมพันธ์ที่ไม่ดี (ถ้าคุณใช้ MD5 ให้เตรียมพร้อมที่จะพิสูจน์ตัวเองในขณะที่ไม่มีใครถามคำถามของคุณเกี่ยวกับการใช้ SHA-256)
return 0;
เป็น a return 1;
) สิ่งนี้ไม่น่าเป็นไปได้สูง แต่ความเสี่ยงของการชนกับ SHA-256 นั้นน้อยกว่านั้น ในทางคณิตศาสตร์คุณไม่สามารถแน่ใจได้ว่าไฟล์สองไฟล์ที่แฮชกับค่าเดียวกันเหมือนกัน แต่คุณไม่สามารถแน่ใจได้ว่าจะเปรียบเทียบไฟล์ด้วยตัวเองตราบใดที่คุณใช้คอมพิวเตอร์เพื่อทำการเปรียบเทียบ สิ่งที่ฉันหมายถึงคือมันไม่มีความหมายเลยที่จะไปให้ไกลกว่า 99.999 .... ความมั่นใจ 9% และ SHA-256 นั้นให้มากกว่านั้น
md5 สามารถสร้างการชนกัน ในทางทฤษฎีแม้ว่าจะมีความเป็นไปได้สูงมากที่ไฟล์หนึ่งล้านไฟล์ในแถวสามารถสร้างแฮชเดียวกันได้ อย่าทดสอบโชคของคุณและตรวจสอบการชน md5 ก่อนเก็บค่า
ฉันชอบสร้างสตริงสุ่ม md5 ซึ่งลดค่าใช้จ่ายของการแฮชไฟล์ขนาดใหญ่ เมื่อพบการชนกันฉันจะวนซ้ำและแฮชอีกครั้งด้วยการวนรอบต่อท้าย
คุณสามารถอ่านหลักการของนกพิราบได้
ฉันจะไม่แนะนำที่นี่ หากแอปพลิเคชันทำงานบนระบบผู้ใช้หลายคนอาจมีผู้ใช้ที่จะมีสองไฟล์ที่มีแฮช md5 เดียวกัน (เขาอาจเป็นวิศวกรและเล่นไฟล์ดังกล่าวหรืออยากรู้อยากเห็น - พวกเขาสามารถดาวน์โหลดได้ง่ายจากhttp: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.htmlฉันเองในระหว่างการเขียนคำตอบนี้ดาวน์โหลดตัวอย่างสองตัวอย่าง) อีกสิ่งหนึ่งคือแอพพลิเคชั่นบางตัวอาจจัดเก็บข้อมูลที่ซ้ำกันไม่ว่าด้วยเหตุผลใด ๆ (ฉันไม่แน่ใจว่ามีแอพพลิเคชั่นดังกล่าว
หากคุณระบุไฟล์ที่สร้างขึ้นโดยโปรแกรมของคุณโดยเฉพาะฉันจะบอกว่าใช้ MD5 ได้ มิฉะนั้นฉันจะแนะนำฟังก์ชั่นแฮชอื่น ๆ ที่ยังไม่มีการชนกัน
โดยส่วนตัวแล้วฉันคิดว่าผู้คนใช้เช็คซัมแบบดิบ (เลือกวิธีการของคุณ) ของวัตถุอื่น ๆ เพื่อทำตัวเป็นตัวระบุที่ไม่ซ้ำกันมากเกินไปเมื่อพวกเขาต้องการจะทำจริงๆก็คือมีตัวระบุที่ไม่ซ้ำกัน การพิมพ์ลายนิ้วมือวัตถุสำหรับการใช้งานนี้ไม่ได้มีเจตนาและมีแนวโน้มที่จะต้องใช้ความคิดมากกว่าการใช้กลไกความสมบูรณ์ของ uuid หรือคล้ายกัน
MD5 ใช้งานไม่ได้คุณสามารถใช้ SHA1 แทน (ใช้งานในภาษาส่วนใหญ่)
เมื่อทำการแฮชสตริง (<ไม่กี่ 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 เป็นตัวบ่งชี้ความน่าจะเป็นเมื่อจัดเก็บข้อมูลไฟล์จำนวนมาก
หากแฮชเท่ากันฉันรู้ว่าฉันต้องเปรียบเทียบไฟล์ไบต์ต่อไบต์ แต่นั่นอาจเกิดขึ้นเพียงสองสามครั้งด้วยเหตุผลเท็จมิฉะนั้น (แฮชไม่เท่ากับ) ฉันมั่นใจได้ว่าเรากำลังพูดถึงสองไฟล์ที่แตกต่างกัน .