แฮชการเข้ารหัสลับที่เหมือนกันหรือเช็คซัมสำหรับไฟล์สองไฟล์หมายความว่าเหมือนกันหรือไม่


57

ฉันมี 2 เอกสาร excel และฉันต้องการตรวจสอบว่าพวกเขาเหมือนกันนอกเหนือจากชื่อไฟล์

ตัวอย่างเช่นไฟล์จะถูกเรียกว่าและfileone.xls filetwo.xlsนอกเหนือจากชื่อไฟล์เนื้อหาของพวกเขาถือว่าเป็นเหมือนกัน แต่นี่คือสิ่งที่ฉันต้องการตรวจสอบ

ฉันกำลังมองหาวิธีการตรวจสอบนี้และไม่ต้องติดตั้งปลั๊กอินมากมาย ดูเหมือนจะไม่มีทางตรงไปตรงมา

ฉันพยายามสร้าง MD5 hash สำหรับทั้งสองไฟล์ เมื่อแฮชเหมือนกันนี่หมายความว่าเนื้อหาของไฟล์เป็น 1: 1 เหมือนกันหรือไม่?


8
cryptohashes และบางครั้งแม้แต่แฮชธรรมดาอาจมีประโยชน์สำหรับการเปรียบเทียบไฟล์ในระบบที่แตกต่างกันหรือค้นหาในไฟล์จำนวนมาก แต่ถ้าไฟล์สองไฟล์อยู่ในระบบเดียวกันคุณสามารถเปรียบเทียบกับcmpUnix หรือfc(เปรียบเทียบไฟล์) บน Windows ได้อย่างง่ายดาย
dave_thompson_085

10
shattered.io - SHA1 เป็นอัลกอริทึมการแฮชที่ "แข็งแรง" กว่า md5 และยังคงshattered.io/static/shattered-1.pdfและshattered.io/static/shattered-2.pdfมีค่าแฮชเดียวกันในขณะที่แตกต่างอย่างสิ้นเชิง
โฟมบิน

30
หมายเหตุด้านข้าง: ตรวจสอบขนาดก่อน หากมีขนาดแตกต่างกันอย่าไปสนใจเปิดไฟล์พวกมันต่างกัน
Emilio M Bumachar

42
รุ่นแบบง่ายๆ: แฮ MD5 ดีพอที่จะปกป้องกับการเกิดอุบัติเหตุก็ไม่ได้ดีพอที่จะป้องกันไม่ให้ agains ปองร้าย ไม่ว่าจะดีพอสำหรับคุณคุณต้องตัดสินใจตามสถานการณ์ของคุณ
Euro Micelli

9
diff -s file1 file2ถ้ามันบอกว่ามันเหมือนกันพวกมันเหมือนกัน (จริงๆแล้วมันเปรียบเทียบไฟล์ไบต์ต่อไบต์ดังนั้นแม้กระทั่งการชนกันของข้อมูลจะไม่ถูกรวม) เช็คซัมจะใช้เมื่อคุณมีแฮชเพียงอันเดียวและไอเท็มที่คิดว่าเหมือนกับผู้สร้างแฮชนั้น
Bakuriu

คำตอบ:


93

เมื่อแฮชเหมือนกันนี่หมายความว่าเนื้อหาของไฟล์เป็น 1: 1 เหมือนกันหรือไม่?

ไฟล์ทั้งหมดเป็นชุดของไบต์ (ค่า 0-255) หากสองไฟล์ MD5 แฮชตรงกันทั้งคอลเลกชันของไบต์เหล่านั้นมีแนวโน้มที่จะเหมือนกันมาก (ลำดับเดียวกันค่าเดียวกัน)

มีโอกาสน้อยมากที่ไฟล์สองไฟล์สามารถสร้าง MD5 เดียวกันซึ่งเป็นแฮช 128 บิต ความน่าจะเป็นคือ:

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

Hashes นั้นใช้งานได้ใน "one direction only" - นั่นคือคุณใช้ชุดของไบต์และได้รับแฮช แต่คุณไม่สามารถใช้แฮชและรับชุดของไบต์กลับมาได้

การเข้ารหัสขึ้นอยู่กับสิ่งนี้ (เป็นวิธีหนึ่งในสองสิ่งที่สามารถเปรียบเทียบได้โดยไม่ทราบว่าสิ่งเหล่านั้นคืออะไร)

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

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

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


โปรดทราบว่าเป็นไปได้ที่ไฟล์ Excel สองไฟล์จะมีค่าเดียวกันในแถวและคอลัมน์เดียวกัน แต่สำหรับการทดสอบสตรีมไฟล์จะแตกต่างกันอย่างสิ้นเชิงเนื่องจากการจัดรูปแบบสไตล์การตั้งค่าที่แตกต่างกัน

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


107
ไฟล์ Excel และเอกสาร office อื่น ๆ ยังสามารถมีแฮชต่างกันได้เนื่องจากไฟล์เหล่านั้นถูกเปิดและบันทึกซ้ำโดยไม่เปลี่ยนแปลงอะไรเลยเนื่องจากข้อมูลเมตาในไฟล์ที่มีค่าใหม่เก็บไว้ในนั้นสำหรับช่วงเวลาที่บันทึกไว้ล่าสุด
BeowulfNode42

29
โบนัส: หากคุณส่งออกเป็น CSV คุณสามารถใช้diffยูทิลิตีที่น่าเชื่อถือหรือคล้ายกันเพื่อยืนยันว่าไฟล์นั้นเป็นไบต์ต่อไบต์เดียวกันแทนที่จะเป็นเพียงแฮชเดียวกัน
Monty Harder

18
การแฮชและการสร้างข้อมูลที่ตรงกับแฮชเป็นการโจมตีล่วงหน้า ฉันเชื่อว่าปัจจุบัน MD5 มีความเสี่ยงต่อการชนกันของการโจมตี
user2357112

2
@ เวลาคุณพูดว่าอะไร เขากล่าวว่า: ส่งออกเป็น CSV และใช้diff -sเพื่อตรวจสอบว่า CSV เหมือนกันหรือไม่ ในความเป็นจริงคุณสามารถdiff -sแม้แต่ไฟล์ excel: ถ้าdiffบอกว่าเหมือนกันคุณไม่จำเป็นต้องไปที่การเปรียบเทียบ CSV
Bakuriu

2
@Bakuriu เห็นได้ชัดว่าความคิดเห็นของฉันเป็นคำที่แย่มาก - ฉันหมายถึงการส่งออกเป็น CSV จะสูญเสียข้อมูลจำนวนมาก - โดยเฉพาะสูตรแผนภูมิการจัดรูปแบบตามเงื่อนไขและมาตรฐาน
ทิม

37

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

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

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

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

ลองมาเป็นตัวอย่างผลงานปัจจุบันของ SHA-256 ส่งเอาต์พุตแฮชของ 256 บิตหรือ 32 ไบต์ หากคุณมีไฟล์สองไฟล์ซึ่งมีความยาว 32 ไบต์ แต่แตกต่างกันควรจะแฮชเหล่านี้ (โดยไม่มีข้อบกพร่องในอัลกอริทึม) แฮชกับค่าที่แตกต่างกันไม่ว่าเนื้อหาของไฟล์จะเป็นอย่างไร ในแง่คณิตศาสตร์แฮชคือฟังก์ชันแมปพื้นที่อินพุต2 256ลงบนพื้นที่เอาต์พุต2 256ซึ่งควรทำโดยไม่มีการชน แต่ถ้าคุณมีสองไฟล์ที่ 33 ไบต์ยาวต้องมีบางอย่างรวมกันของปัจจัยการผลิตที่ให้ 32 ไบต์ค่าแฮชเอาท์พุทเหมือนกันสำหรับทั้งสองไฟล์เพราะตอนนี้เราทำแผนที่ 2 264เข้าพื้นที่บน 2 256พื้นที่ส่งออก; ที่นี่เราสามารถเห็นได้อย่างชัดเจนว่าโดยเฉลี่ยแล้วควรมี 2 8อินพุตสำหรับแต่ละเอาต์พุต ใช้สิ่งนี้เพิ่มเติมและด้วยไฟล์ 64- ไบต์ควรมี 2 256อินพุตสำหรับทุกเอาต์พุต!

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

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

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

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


2
หากแฮชตรงกันไฟล์นั้นเป็นผลมาจากการชนโดยเจตนาหรือไม่และจะรับประกันว่าไฟล์นั้นเหมือนกัน ความน่าจะเป็นของการชนกันโดยบังเอิญเป็นเพียงทฤษฎีเท่านั้น การพูดว่า“ ถ้าแฮชตรงกันแล้วพวกมันมีแนวโน้มที่จะปรากฏเหมือนกัน” นั้นทำให้เข้าใจผิด: ถ้ามีการอาฆาตพยาบาทและมันเป็นสถานการณ์การปะทะกันพวกเขาก็ไม่น่าจะเหมือนกันและมิฉะนั้นความน่าจะเป็น เป็นเหตุการณ์ที่มีโอกาสน้อยที่ต้องได้รับการปกป้อง
Gilles 'ดังนั้นหยุดความชั่วร้าย'

9
@Gilles: ตรงกันข้าม ถ้อยคำของไมเคิลนั้นถูกต้องและ "รับประกัน" นั้นทำให้เข้าใจผิด (หรือดีผิดจริง) ความน่าจะเป็นของไฟล์สองไฟล์ที่มีแฮชเหมือนกันที่ไม่ตรงกัน (แม้ว่าจะมีการดัดแปลงที่เป็นอันตราย) ต่ำมากและสามารถละเลยได้ในทางปฏิบัติ มันเป็น แต่ไม่เป็นศูนย์ มีโอกาสโดยทั่วไปไม่ว่าจะด้วยเหตุผลใดก็ตามปัจจัยการผลิตที่แตกต่างกันจะสร้างแฮชเดียวกันและอาจมีโอกาสสูงกว่า 2 ^ -128 (อัลกอริธึมการเข้ารหัสเป็นศิลปะสีดำ) อาจจะมีข้อบกพร่องในทางที่ไม่รู้จัก เราไม่มีทางที่จะแน่ใจ 100%)
Damon

5
@Gilles " ศูนย์อย่างมีประสิทธิภาพ " ยังคงไม่เป็นศูนย์ซึ่งหมายความว่ายังมีความน่าจะเป็น (ที่ยอมรับได้เล็กน้อย) ว่าข้อมูลสองชุดที่แตกต่างกันจะส่งผลให้แฮชเดียวกัน คุณไม่สามารถโต้แย้งได้
Attie

5
@Attie: ความน่าจะเป็นของไฟล์ที่ไม่เกี่ยวข้องสองไฟล์ที่มีค่าเท่ากันนั้นต่ำกว่าความน่าจะเป็นของสิ่งอื่น ๆ ที่อาจผิดพลาดได้ (เช่นข้อผิดพลาดบิตสุ่มที่ทำให้ไฟล์บนดิสก์) ไม่คุ้มกับการแข่งขันแบบบังเอิญ การป้องกันการแข่งขันที่มีการวางแผนอย่างรอบคอบอาจจะคุ้มค่า แต่การแข่งขันโดยไม่ตั้งใจนั้นไม่น่าเป็นไปได้ที่ความพยายามใด ๆ ที่ใช้ในการป้องกันพวกเขาอาจจะถูกใช้ในที่อื่นดีกว่า
supercat

3
@Gilles ผิด คุณไม่สามารถหายใจได้ในครั้งเดียวบอกฉันว่ามีโอกาส แต่คุณให้คะแนนเล็กน้อยว่าอาจเกิดการชนโดยไม่ตั้งใจได้ในครั้งถัดไปที่ผู้รับสิทธิ์ไม่มีการปะทะกันเกิดขึ้นได้ การพูดที่ทำให้เข้าใจผิดอย่างมากเพราะมันหมายถึงคุณสมบัติของอัลกอริทึมการแปลงแป้นพิมพ์ที่รู้จักกันแล้วว่าเป็นเท็จอย่างสมบูรณ์
iheanyi

10

มันเป็นเกมที่น่าจะเป็น ... แฮชสามารถแสดงค่าจำนวน จำกัด ได้

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

การเพิ่มขนาดของแฮชและการใช้อัลกอริธึมการเข้ารหัสลับที่แข็งแกร่งสามารถช่วยลดการชนได้อย่างมากและเพิ่มความมั่นใจของเราว่าไฟล์สองไฟล์ที่มีแฮชเดียวกันมีเนื้อหาเดียวกัน

นี้กล่าวว่าเราไม่สามารถเข้าถึงความมั่นใจ 100% - เราจะไม่สามารถเรียกร้องสำหรับการตรวจสอบว่าทั้งสองไฟล์ที่มีกัญชาเดียวกันอย่างแท้จริงมีเนื้อหาเดียวกัน

ในสถานการณ์ส่วนใหญ่ / หลายกรณีนี้เป็นเรื่องปกติและการเปรียบเทียบแฮชนั้น " ดีพอ " แต่ขึ้นอยู่กับรูปแบบการคุกคามของคุณ

ในที่สุดหากคุณต้องการเพิ่มระดับความมั่นใจฉันขอแนะนำให้คุณทำสิ่งต่อไปนี้:

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

หากคุณต้องการความมั่นใจ 100% โดยเริ่มต้นด้วยแฮช แต่ถ้าแฮชตรงกันให้ติดตามด้วยการเปรียบเทียบแบบไบต์ต่อไบต์ของไฟล์ทั้งสอง


นอกจากนี้ตามที่คนอื่น ๆ ชี้ให้เห็น ... ความซับซ้อนของเอกสารที่ผลิตโดยแอปพลิเคชั่นเช่น Word และ Excel หมายความว่าข้อความตัวเลขและเลย์เอาต์ที่มองเห็นได้อาจเหมือนกัน แต่ข้อมูลที่เก็บในไฟล์อาจแตกต่างกัน

Excel ไม่ดีเป็นพิเศษเพียงเปิดสเปรดชีตที่บันทึกไว้ (ไม่ได้ทำอะไรเลย ) สามารถสร้างไฟล์ใหม่พร้อมเนื้อหาที่แตกต่างกัน


6
MD5 นั้นถือว่าไม่เพียงพออีกต่อไปจริงมาก cryptographically แต่สำหรับการตรวจสอบเอกลักษณ์ (ในกรณีที่ไม่มีความอาฆาตพยาบาทเช่นถ้าคุณควบคุมการป้อนข้อมูล) มันดีและรวดเร็ว (และ 128 บิตควรมีมากมาย)
Chris H

4
" ติดตามด้วยการเปรียบเทียบแบบสองไบต์ต่อไบต์ของไฟล์ทั้งสอง " หากคุณจะทำการเปรียบเทียบไฟล์คุณอาจทำได้ก่อน ... ไม่มีจุดที่อ่านไฟล์แต่ละไฟล์เพื่อคำนวณ แฮชเพียงเพื่ออ่านไฟล์ทั้งสองอีกครั้งเพื่อเปรียบเทียบพวกเขา!
TripeHound

3
@TripeHound มันขึ้นอยู่กับว่าไฟล์นั้นเป็นแบบโลคัลหรือไม่ ... หากคุณมีแฮชของไฟล์อยู่แล้วและกำลังจะแนะนำไฟล์ใหม่ให้กับระบบหากไฟล์ใหม่นั้นต้องการแฮชที่เก็บไว้ในฐานข้อมูลเป็นต้น โทรออกที่เหมาะกับสถานการณ์ของคุณ
Attie

5
ไม่มันไม่ใช่เกมน่าจะเป็น คุณกำลังพิจารณาว่าการชนกันโดยบังเอิญของคุณเป็นไปได้ยากเพียงใด มันจะไม่เกิดขึ้น การพลิกบิตระหว่างการเปรียบเทียบมีแนวโน้มมากขึ้น ในบางสถานการณ์อาจมีการปะทะกันโดยเจตนาและนั่นไม่ใช่เกมที่น่าจะเป็น
Gilles 'ดังนั้นหยุดความชั่วร้าย'

3
@mbrig: แฮชแบบ 32 บิตจะมีความเสี่ยงที่สำคัญของการไม่ตรงกันโดยไม่ตั้งใจ อย่างไรก็ตามการไปที่ 128 หรือ 256 บิตสร้างความแตกต่างอย่างมาก ด้วย 128 บิตลิงหนึ่งพันล้านตัวที่พิมพ์เอกสารสุ่มที่มีขนาดเหมาะสมนับพันล้าน decently จะมีโอกาสประมาณ 0.3% ในการสร้างเอกสารสองฉบับที่มีแฮชเดียวกัน ด้วย 256 บิตแม้ว่าลิงพันล้านสามารถพิมพ์เอกสารสุ่มที่มีขนาดเหมาะสมนับพันล้านต่อวินาทีเป็นเวลาพันล้านปีความเป็นไปได้ของเอกสารที่ไม่มีการนับล้านที่มีค่าแฮชที่จับคู่กันโดยบังเอิญจะมีขนาดเล็ก
supercat

6

หากไฟล์สองไฟล์มี MD5 แฮชเหมือนกันและทั้งสองไฟล์นั้นไม่ได้ถูกสร้างขึ้นมาเป็นพิเศษ มันยากแค่ไหนในการสร้างไฟล์ที่มีแฮช MD5 เดียวกันนั้นขึ้นอยู่กับรูปแบบไฟล์ฉันไม่รู้ว่ามันง่ายแค่ไหนกับไฟล์ Excel

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

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

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

หากคุณมีเครื่องมือ Unix / Linux อยู่คุณสามารถใช้cmpเพื่อเปรียบเทียบสองไฟล์ ในการเปรียบเทียบสองไฟล์ในเครื่องเดียวกัน checksums จะทำให้ทุกอย่างซับซ้อนขึ้น


หากไฟล์สองไฟล์มี MD5 แฮชเหมือนกันและทั้งสองไฟล์นั้นไม่ได้ถูกสร้างขึ้นมาเป็นพิเศษ มันไม่ถูกต้อง มีความเป็นไปได้ที่ไม่มีที่สิ้นสุดของข้อความ แต่มีแฮชที่เป็นไปได้เพียง 64 บิตเท่านั้น มันเรียกว่า"หลักการ pigeonhole" : "หลักการของ pigeonhole ระบุว่าหากnมีการใส่รายการลงในmคอนเทนเนอร์ด้วยn > mอย่างน้อยหนึ่งคอนเทนเนอร์ต้องมีมากกว่าหนึ่งรายการ" หากคุณสร้างข้อความมากกว่า 2 ^ 64 ข้อความคุณจะมีการชนกันโดยไม่มี "การประดิษฐ์พิเศษ" และคุณอาจมีเพียง 2
Andrew Henle

@AndrewHenle, MD5 ไม่ใช่ 64 บิต แต่เป็น 128 หากการชนกันโดยไม่ได้ตั้งใจทำให้เราเข้าสู่ช่วงเวลาแห่งความร้อน - แห่ง - เอกภพโดยบังเอิญมันเป็นไปได้ "สำหรับคำจำกัดความทางวิชาการ
Charles Duffy

@CharlesDuffy คุณคาดว่าแฮชจะถูกแจกจ่ายแบบสุ่ม มันไม่ใช่.
Andrew Henle

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

@ AndrewHenle ฉันไม่ได้ระบุว่าการชนกันเป็นไปไม่ได้ทางคณิตศาสตร์ซึ่งอาจผิด แต่ไม่เกี่ยวข้องที่นี่ ฉันระบุว่ามันไม่ได้เกิดขึ้นซึ่งเป็นเรื่องจริง ความคิดเห็นของคุณไม่ถูกต้องในทางที่เปลี่ยนแปลงการจัดการอย่างสมบูรณ์ มีแฮช MD5 2 ^ 128 ที่เป็นไปได้ไม่ใช่ 2 ^ 64 ซึ่งหมายความว่าคุณจะต้องสร้างแฮช 2 ^ 128 เพื่อให้เกิดความมั่นใจในการชน ที่จริงแล้วเมื่อเกิดความขัดแย้ง 2 ^ 64 จะทำให้คุณมีโอกาสเกิดการชนระหว่างแฮชที่คุณสร้างขึ้น (โดยไม่ใช้แฮชที่สร้างไว้ก่อนหน้านี้) แต่นี่คือสิ่งที่สงสัยเพราะเรารู้วิธีการชนกันของยาน
Gilles 'หยุดความชั่วร้าย' Gilles

6

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

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

สิบปีที่แล้วฉันตัดสินใจว่าจะต้องอยู่ให้ไกลที่สุดเท่าที่จะทำได้จาก MD5 (แน่นอนจนกระทั่งเมื่อวานนี้ฉันจำเหตุผลที่ผิดในการทำเช่นนั้นสิบปีเป็นเวลานานคุณเห็นฉันมาบันทึกช่วยจำที่ผ่านมาของฉันเพื่อจดจำสาเหตุและแก้ไขคำตอบนี้) คุณเห็นในปี 1996 MD5 ถูกพบว่า ไวต่อการถูกโจมตีจากการชน 9 ปีต่อมานักวิจัยสามารถสร้างเอกสาร PostScript และ (ouch!) ใบรับรอง X.509 พร้อมแฮชเดียวกัน! MD5 เสียอย่างเห็นได้ชัด (Megaupload.com ก็ใช้ MD5 เช่นกันและก็มีความยุ่งเหยิงจำนวนมากเกี่ยวกับการชนของแฮชที่ทำให้ฉันมีปัญหาในเวลานั้น)

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

อย่างไรก็ตามโปสเตอร์ดั้งเดิมมีเหตุผลน้อยกว่าในการใช้ MD5 เนื่องจาก:

  1. ตราบใดที่ไฟล์หนึ่งเปรียบเทียบสองไฟล์เท่านั้นการเปรียบเทียบแบบไบต์ต่อไบต์นั้นเร็วกว่าการสร้าง MD5 hash ของตัวเอง สำหรับการเปรียบเทียบสามไฟล์ขึ้นไป ... ตอนนี้คุณมีสาเหตุที่ถูกต้องแล้ว
  2. OP ระบุ "วิธีตรวจสอบสิ่งนี้และไม่ต้องติดตั้งปลั๊กอิน" คำสั่งGet-FileHashของ Windows PowerShell สามารถสร้าง SHA1, SHA256, SHA384, SHA512และ MD5 hashes ได้ ในคอมพิวเตอร์สมัยใหม่ที่รองรับฮาร์ดแวร์สำหรับฟังก์ชั่นแฮช SHA การสร้างจะเร็วขึ้น

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

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

ฉันเห็นด้วยกับ @KamilMaciorowski ... มันเป็นเกมที่น่าจะเป็น ... โดยใช้แฮชเดียวคุณสามารถ " มั่นใจอย่างมีเหตุผล " ว่าไฟล์ที่มีแฮชที่ตรงกันเหมือนกัน แต่ไม่มีการรับประกัน 100% การใช้อัลกอริทึมที่ดีกว่าหรือการใช้อัลกอริธึมหลายอย่างสามารถปรับปรุงความมั่นใจของคุณได้แม้การเปรียบเทียบขนาดไฟล์จะช่วยได้ ... แต่คุณจะไม่มีความมั่นใจ 100% โดยไม่ตรวจสอบไบต์ต่อไบต์
Attie

1
@Attie Huh! นั่นคือสิ่งที่ฉันตั้งใจในตอนแรก ขอบคุณ 🙏มีเพียงฉันเท่านั้นที่ไม่คุ้นเคยกับวลีเก๋ ๆ เช่น "คุณมั่นใจได้อย่างมีเหตุผล" ขอโทษ 😜ยังเป็นเหตุผลที่เรามีปุ่มแก้ไข โดยส่วนตัวฉันจะไม่ทิ้งคำตอบที่ดีเพียงเพราะคำเดียวในนั้นผิด ฉันแก้ไขมัน

1
เกี่ยวกับ "คำตอบที่ดี": โปรดทราบฉันมั่นใจก่อนไม่ใช่ตัวพิมพ์ผิดและคุณหมายถึงมันจริงๆ จากนั้นก็ลดระดับลงและในเวลาเดียวกันฉันก็ให้ความคิดเห็นกับคุณเปิดเผยเหตุผลของฉันด้วยความหวังว่าคำตอบของคุณจะดีขึ้น มันทำได้ดังนั้น downvote ของฉันจึงไม่มาก โดยพื้นฐานแล้วฉันบอกคุณว่าฉันคิดว่าอะไรผิดกับคำตอบของคุณ Attie ช่วยชี้แจงคุณปรับปรุงคำตอบ จากมุมมองของฉันเราทุกคนจัดการกับสถานการณ์นี้อย่างเหมาะสมและเรื่องราวทั้งหมดก็ออกมาได้ดีมาก ขอขอบคุณ.
Kamil Maciorowski

5

ฉันมี 2 เอกสาร excel และฉันต้องการตรวจสอบว่าพวกเขาเหมือนกันนอกเหนือจากชื่อไฟล์

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

ในการคำนวณแฮชคุณต้องอ่านเนื้อหาทั้งหมดของทั้งสองไฟล์

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

และก่อนที่คุณจะทำเช่นนั้นคุณสามารถเปรียบเทียบขนาดของไฟล์ทั้งสองได้ หากขนาดแตกต่างกันเนื้อหาจะไม่เหมือนกัน


เมื่อใช้สองไฟล์ในฟิสิคัลไดรฟ์เดียวการใช้ฟังก์ชั่นแฮชที่สามารถติดตามความเร็ว I / O ของแต่ละไฟล์อาจจะเร็วกว่าการเปรียบเทียบไฟล์เล็กน้อยเนื่องจากไม่จำเป็นต้องสลับระหว่างการอ่านไฟล์ทั้งสอง สถานที่ที่แฮชส่องแสงจริงๆคือเมื่อพยายามทำการเปรียบเทียบที่เกี่ยวข้องกับไฟล์จำนวนมากที่มีขนาดใหญ่เกินไปที่จะใส่ในหน่วยความจำ แม้ว่าคุณเพียงต้องการค้นหาว่าตรงกันทั้งหมดหรือไม่ให้เปรียบเทียบไฟล์ 1 กับไฟล์ 2 จากนั้นไฟล์ 1 ถึงไฟล์ 3 จากนั้นไฟล์ 1 ถึง 4 ไฟล์ ฯลฯ อาจช้ากว่าการคำนวณแฮชทั้งหมดเกือบสองเท่า
supercat

@supercat หากไฟล์ถูกอ่านในหน่วยที่มีขนาดใหญ่กว่า MB หรือมากกว่านั้นการสลับระหว่างไฟล์จะไม่ถูกสังเกตเห็น และหากกระบวนการทำงานเกี่ยวข้องกับการเปรียบเทียบกลุ่มของไฟล์เพื่อค้นหารายการที่ซ้ำกันแฮชอาจถูกคำนวณเช่นเดียวกับแต่ละไฟล์ที่เขียน - เนื่องจากการทำเช่นนั้นสามารถทำได้โดยไม่เสียค่าใช้จ่าย
Andrew Henle

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

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

5

แฮชเช่น MD5 หรือ SHA มีความยาวคงที่สมมติว่าเป็นตัวอักษรและตัวเลข 300 ตัว (ในความเป็นจริงแล้วจะสั้นกว่าและไม่ใช้ทั้งชุดของตัวอักษรและตัวเลข)

ให้บอกว่าไฟล์ทำจากตัวอักษรและตัวเลขและขนาดสูงสุด 2GB

คุณสามารถเห็นได้อย่างง่ายดายว่ามีวิธีเพิ่มเติมไฟล์ (ขนาดสูงสุด 2GB) กว่าค่าแฮชที่เป็นไปได้ หลักการ pigeonhole บอกว่าไฟล์บางไฟล์ (ต่างกัน) จะต้องมีค่าแฮชเหมือนกัน

นอกจากนี้ดังที่แสดงบน shattered.io 1คุณสามารถมีสองไฟล์ที่แตกต่างกัน: shattered.io/static/shattered-1.pdf และ shattered.io/static/shattered-2.pdf ซึ่งมีค่าแฮช SHA-1 เดียวกันในขณะที่กำลัง แตกต่างอย่างสิ้นเชิง

1 SHA1 เป็นอัลกอริทึมการแฮชที่ "แข็งแกร่ง" กว่า md5


ความน่าจะเป็นของการชนกันโดยบังเอิญนั้นต่ำเกินไปที่จะนำมาพิจารณา ความเสี่ยงของการชนกันโดยเจตนามีอยู่สำหรับ MD5 เช่นกันและเลวร้ายยิ่งกว่าสำหรับ SHA-1 ซึ่งไม่เกี่ยวข้องอย่างมากที่นี่
Gilles 'ดังนั้นหยุดความชั่วร้าย'

4

NO ค่าที่ต่างกันรับประกันว่าไฟล์ต่างกัน ค่าเดียวกันไม่ได้รับประกันว่าไฟล์จะเหมือนกัน มันค่อนข้างง่ายในการค้นหาตัวอย่างโดยใช้ CRC16

ความสมดุลของความน่าจะเป็นที่มีรูปแบบการแฮ็กร่วมสมัยพวกเขาเหมือนกัน


1
คำถามเกี่ยวกับ MD5 ซึ่งไม่มีความเสี่ยงต่อการชนโดยไม่ตั้งใจ มันมีความเสี่ยงต่อการชนโดยเจตนา แต่นั่นไม่ใช่เรื่องของความน่าจะเป็น
Gilles 'ดังนั้นหยุดความชั่วร้าย'

1
นอกจากนี้ยังเกี่ยวกับสเปรดชีต Excel ที่มีชื่อแตกต่างกันพวกเขามีขนาดใหญ่แค่ไหนที่ไบต์เปรียบเทียบไบต์ไม่สามารถเป็นตัวเลือกได้ สองรูปแบบคร่ำเครียดกันจะให้ความมั่นใจ
mckenzm

2
@Gilles แฮชโค้ดทั้งหมดมีความเสี่ยงต่อการชนโดยบังเอิญ วิธีเดียวเท่านั้นที่จะใช้ไฟล์ทั้งหมดเป็น hashcode ความคิดเห็นของคุณไม่สมเหตุสมผล
user207421

3

แม้ว่าคำถามของคุณจะย้อนกลับ - สมมติว่าแฮชหมายความว่ามีข้อมูลเหมือนกัน (ซึ่งไม่รับประกัน 100% แต่ดีพอสำหรับการเปรียบเทียบไฟล์ทุก ๆ วินาทีเพื่อไม่ให้ชนกัน) ไม่จำเป็นต้องติดตามว่าการมีข้อมูลเดียวกันหมายความว่าพวกเขาจะมีแฮชเดียวกัน ดังนั้นไม่ - คุณไม่สามารถเปรียบเทียบข้อมูลในไฟล์ excel กับข้อมูลในไฟล์ excel อื่นโดยการแปลงไฟล์เนื่องจากมีหลายวิธีที่ไฟล์สองไฟล์สามารถแตกต่างกันได้โดยไม่มีข้อมูลพื้นฐานแตกต่างกัน วิธีหนึ่งที่ชัดเจน - ข้อมูลถูกจัดเก็บเป็น XML แต่ละเซลล์มีโหนด XML ของตัวเอง หากโหนดเหล่านั้นถูกเก็บไว้ในคำสั่งซื้อที่แตกต่างกันข้อมูลจะเหมือนกัน แต่ไฟล์นั้นแตกต่างกัน


3

เพื่อเพิ่มคำตอบอื่น ๆ ต่อไปนี้เป็นตัวอย่างของคู่ไฟล์ที่มีแฮช MD5 เดียวกันและเนื้อหาที่แตกต่างกัน


คำตอบสำหรับลิงก์อย่างเดียวค่อนข้างน่าสนใจ
โทมัสเวลเลอร์

2

คำตอบสำหรับ OP นี้ได้รับ แต่อาจได้ประโยชน์จากการสรุป

หากคุณต้องการตรวจสอบว่าไฟล์สองไฟล์เหมือนกันหรือไม่ขึ้นอยู่กับว่าไฟล์และแฮชนั้นอยู่ภายใต้การควบคุมของคุณหรือไม่

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

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

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


2

ในบรรทัดคำสั่ง Windows คุณสามารถใช้compยูทิลิตีนี้เพื่อกำหนดว่าไฟล์สองไฟล์เหมือนกันทุกประการหรือไม่ ตัวอย่างเช่น:

comp fileone.xls filetwo.xls

1

เมื่อแฮชเหมือนกันนี่หมายความว่าเนื้อหาของไฟล์เป็น 1: 1 เหมือนกันหรือไม่?

ไม่ได้หาก hashes มีความแตกต่างกันมันไม่ได้หมายความว่าเนื้อหาที่แตกต่างกัน แฮชโค้ดที่เท่าเทียมกันไม่ได้หมายความถึงเนื้อหาที่เท่ากัน hashcode เป็นการลดโดเมนขนาดใหญ่ลงในช่วงที่เล็กลงโดยนิยาม: นัยคือรหัสที่มีเนื้อหาที่ไม่เท่ากันสามารถเท่ากันได้ มิฉะนั้นจะไม่มีประโยชน์ในการคำนวณ


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

"ถ้าแฮชแตกต่างกันแสดงว่าเนื้อหาแตกต่างกัน" ไม่จำเป็น. ไฟล์ XLSX เป็นไฟล์ ZIP และเป็นไปได้ที่จะมีเนื้อหาเดียวกันจัดเก็บตามลำดับไฟล์ที่ต่างกัน
โทมัสเวลเลอร์

1

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


หลังจากที่คุณเลือกฟังก์ชันแฮชและยึดมันสิ่งเหล่านี้เป็นชุดค่าผสมที่ต้องพิจารณา:

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

สถานการณ์ที่ไฟล์เหมือนกันสร้างค่าแฮชต่างกันเป็นไฟล์เดียวที่ไม่สามารถทำได้อย่างเคร่งครัด


เหตุผลสองข้อที่นำไปใช้เสมอ :

  • หากไฟล์เหมือนกันแล้วค่าแฮเหมือนกันเพื่อตรวจสอบว่า
  • หากค่าแฮจะแตกต่างกันแล้วไฟล์ที่แตกต่างกันเพื่อตรวจสอบว่า

เหตุผลสองประการที่ไม่เข้มงวด :

  • หากไฟล์แตกต่างกันค่าแฮชอาจแตกต่างกัน
  • หากค่าแฮเหมือนกันแล้วไฟล์อาจจะเหมือนกัน

0

สำหรับวัตถุประสงค์ของคุณใช่แฮชที่เหมือนกันหมายถึงไฟล์ที่เหมือนกัน

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

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


-1

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


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

-2

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

ไฟล์อาจเหมือนกัน รหัสของฉันอาจมีข้อบกพร่อง (อันที่เกิดขึ้นจริงในทางปฏิบัติคือการเปรียบเทียบแฮชสองอันยาว (256 ไบต์)) ไม่ใช่กับ memcmp แต่กับ strcmp: การเปรียบเทียบจะส่งกลับ "เหมือนกัน" ถ้าไบต์แรกในแต่ละแฮชเป็นศูนย์และโอกาสสำหรับ นั่นคือ 1 ใน 65536 อาจมีความผิดพลาดของฮาร์ดแวร์ (รังสีคอสมิกชนเซลล์หน่วยความจำและสลับมัน) หรือคุณอาจมีกรณีที่หายากของไฟล์ที่แตกต่างกันสองไฟล์ที่มีแฮชที่เหมือนกัน

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

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

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