CRC เหมาะสมกว่าที่จะใช้เมื่อใดมากกว่า MD5 / SHA1?


130

เมื่อใดจึงเหมาะสมที่จะใช้ CRC ในการตรวจจับข้อผิดพลาดเทียบกับฟังก์ชันการแฮชที่ทันสมัยกว่าเช่น MD5 หรือ SHA1 ก่อนหน้านี้ใช้งานง่ายกว่าบนฮาร์ดแวร์ฝังตัวหรือไม่?

คำตอบ:


114

CRC ทำงานได้ดีในการตรวจจับข้อผิดพลาดแบบสุ่มในข้อมูลที่อาจเกิดขึ้นตัวอย่างเช่นจากสัญญาณรบกวนเครือข่ายสัญญาณรบกวนของสายการบิดเบือน ฯลฯ

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

และใช่ CRC นั้นง่ายกว่ามากในการติดตั้งบนฮาร์ดแวร์แบบฝังคุณยังสามารถรับโซลูชันแบบแพ็คเกจที่แตกต่างกันสำหรับสิ่งนี้บน IC


1
@gili: คุณสามารถ xor dwords เข้าด้วยกันเพื่อให้ได้ dword ผลลัพธ์เดียว
Blindy

2
@ ดัสติน: คุณตอบถูกทั้งหมด แต่อาจลองพิจารณาเปลี่ยน "CRC มีประสิทธิภาพในการคำนวณมากกว่า" เป็น "CRC คำนวณได้ง่ายกว่ามาก"? อัลกอริทึม MD5 / SHA-1 มีความซับซ้อน แต่ไม่ใช่ IMO ที่ 'ไม่มีประสิทธิภาพ'
Coxy

1
@coxymla คุณถูกต้องคำที่ฉันควรใช้คือ "ซับซ้อน" ไม่ใช่ "ไม่มีประสิทธิภาพ" ขอบคุณ!
กำหนด

27
หากต้องการลดแฮชที่ยาวเป็น 32 บิตให้ใช้ 32 บิตแรก
orip

1
หากการรักษาความปลอดภัยเป็นเป้าหมายของคุณแล้วคุณจะไม่เคยใช้MD5, SHA-1นอกจากนี้ยังควรหลีกเลี่ยงแตกต่างจากบางส่วนSHA-2จะแนะนำ
ปีเตอร์

33

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

ดูสิ่งนี้ด้วย


ส่วนที่สำคัญที่สุดจากลิงก์ในคำตอบนี้: "(... ) แม้ CRC 2048 บิตจะมีความปลอดภัยน้อยกว่า MD5 แบบ 128 บิต"
Marc.2377

3
ในขณะที่คำตอบยังคงถูกต้อง MD5 และ SHA1 อยู่ในระดับความปลอดภัยเดียวกันในปัจจุบัน กล่าวอีกนัยหนึ่งใช้ได้ดีในการตรวจจับข้อผิดพลาดโดยไม่ได้ตั้งใจเท่านั้น
Piskvor ออกจากอาคาร

21

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

ข้อสรุปที่เกี่ยวข้องกับ CRC สำหรับแฮช:

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

UPDATE

ดูเหมือนว่าไซต์จะไม่ทำงาน ที่เก็บถาวรทางอินเทอร์เน็ตมีสำเนาแม้ว่า


ลิงก์เสีย บางทีคุณอาจเขียนคำอธิบายด้วยตัวเอง? ถ้าไม่ใช่คำตอบก็เปล่าประโยชน์
สิ้นสุด

เอาล่ะฉันจะรวมข้อสรุปไว้ในคำตอบของฉัน
Andre Luus

แปลกตามเกณฑ์มาตรฐานที่นี่ CRC ทำได้ดีในแง่ของความเร็วและจำนวนการชน
ostrokach

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

จากประสบการณ์ของฉันในการแฮช URL หลายล้านรายการ CRC64 ชนกัน 8 ครั้งและ MD5 ชนกัน 5 เห็นได้ชัดว่า MD5 ดีกว่า แต่ CRC64 เป็นแฮชที่ยอดเยี่ยมและเร็วและง่ายกว่ามาก
J. Dimeo

18

ฉันรันโค้ด PHP นี้ทุกบรรทัดในลูป 1.000.000 ผลลัพธ์อยู่ในความคิดเห็น (#)

hash('crc32', 'The quick brown fox jumped over the lazy dog.');#  750ms   8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');#  700ms   8 chars
hash('md5',   'The quick brown fox jumped over the lazy dog.');#  770ms  32 chars
hash('sha1',  'The quick brown fox jumped over the lazy dog.');#  880ms  40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms  64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms  96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars

ข้อสรุปของฉัน:

  • ใช้ "crc32b" เมื่อคุณต้องการhttp://en.wikipedia.org/wiki/Cyclic_redundancy_checkและคุณไม่สนใจเรื่องความปลอดภัย
  • ใช้ "sha256" (หรือสูงกว่า) เมื่อคุณต้องการเพิ่มเลเยอร์ความปลอดภัย

  • อย่าใช้ "md5" หรือ "sha1" เนื่องจากมี:

    1. ปัญหาด้านความปลอดภัยบางอย่างเมื่อคุณสนใจเกี่ยวกับความปลอดภัย
    2. แฮชสตริงยาวกว่าและช้ากว่า "crc32b" เมื่อสิ่งที่คุณต้องการคือ CRC

คุณหมายถึงบิตไม่ใช่ตัวอักษร
esskar

ไม่จริง echo hash ('crc32', 'สุนัขจิ้งจอกสีน้ำตาลกระโดดข้ามสุนัขขี้เกียจ'); สะท้อน "413a86af" สตริงความยาว 8 อักขระคืออะไร Btw เป็นหมายเลข 32 บิตที่จัดเก็บในรูปแบบ HEX ตัวอย่างเช่น "sha256" มีแฮช 256 บิตซึ่งจัดเก็บเป็น HEX อีกครั้งซึ่งให้สตริงยาว 64 อักขระ
Martin

45
ผลลัพธ์เหล่านี้หลอกลวงมาก เมื่อใช้อัลกอริทึมการแฮชเหล่านี้กับชุดข้อมูลขนาดใหญ่ ( War and Peaceแทน"The quick brown fox jumped over the lazy dog.") คุณจะเห็นว่า CRC เร็วกว่า MD5 มากเพียงใด
ubiquibacon

1
มีกรณีระดับกลาง (การตรวจสอบซ้ำในไลบรารี) ซึ่ง MD5 / Sha1 เป็นวิธีการแก้ปัญหาที่ถูกต้อง: พวกเขาไม่จำเป็นต้องจัดการกับกรณีที่มีฝ่ายตรงข้ามสร้างการชนกันของแฮชที่ไม่น่าจะหายไปอย่างระมัดระวัง แต่พวกเขาจำเป็นต้องจัดการกับการชนกันโดยบังเอิญ ดังนั้น: การตรวจจับข้อผิดพลาดบิตและความเสียหาย: CRC32 การตรวจจับการชนกันในไลบรารี: แอปพลิเคชัน MD5 / SHA1 Adversarial: Sha256 ขึ้นไป แน่นอนว่าหากคุณมีไลบรารีที่มีรายการนับพันล้านรายการคุณอาจต้องเพิ่มแฮชบิตของคุณด้วย
Dewi Morgan

PHP? บนแพลตฟอร์ม ARM รหัสฝังตัว 16MHz CRC32 ที่ 46 ไบต์อาจเป็น 12 ไมโครวินาที ที่มีฮาร์ดแวร์ช่วย แม้แต่ฮาร์ดแวร์ที่ช่วย AES ก็จะช้าลงหลายร้อยเท่า ตารางการค้นหาที่ไม่ได้รับการสนับสนุน CRC ควรจะยังคงอยู่ที่ประมาณ 50 ไมโครวินาที
ilgitano

11

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

เว้นแต่จะมีใครพยายามแก้ไขข้อมูลของคุณโดยประสงค์ร้ายและซ่อนการเปลี่ยนแปลง CRC ก็เพียงพอแล้ว เพียงใช้พหุนาม "ดี" (มาตรฐาน)


9

ทุกอย่างขึ้นอยู่กับความต้องการและความคาดหวังของคุณ

ความแตกต่างโดยย่ออย่างรวดเร็วระหว่างอัลกอริทึมฟังก์ชันแฮชเหล่านี้มีดังนี้

ซีอาร์ซี (CRC-8/16/32/64)

  • คือไม่ได้อัลกอริทึมการเข้ารหัสลับ hashing (มันโดยใช้ฟังก์ชั่นเชิงเส้นที่ขึ้นอยู่กับการตรวจสอบความซ้ำซ้อนวงกลม)
  • สามารถผลิตได้ทั้ง 9, 17, 33 หรือ 65 บิต
  • ไม่ได้มีวัตถุประสงค์เพื่อใช้เพื่อวัตถุประสงค์ในการเข้ารหัสเนื่องจากไม่มีการรับประกันการเข้ารหัส
  • ไม่เหมาะสมสำหรับการใช้งานในลายเซ็นดิจิตอลเพราะมันได้อย่างง่ายดายพลิกกลับ2006 ,
  • ไม่ควรใช้เพื่อวัตถุประสงค์ในการเข้ารหัส
  • สตริงที่แตกต่างกันสามารถสร้างการชนกันได้
  • คิดค้นในปี 1961 และใช้ในอีเธอร์เน็ตและมาตรฐานอื่น ๆ อีกมากมาย

MD5

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

SHA-1

  • คืออัลกอริทึมแฮชที่เข้ารหัส

  • สร้างค่าแฮช 160 บิต (20 ไบต์) ที่เรียกว่าการย่อยข้อความ

  • มันเป็นแฮชที่เข้ารหัสและตั้งแต่ปี 2548 ก็ไม่ถือว่าปลอดภัย

  • สามารถใช้เพื่อวัตถุประสงค์ในการเข้ารหัส

  • พบตัวอย่างของการชนกันของ sha1

  • ตีพิมพ์ครั้งแรกในปี พ.ศ. 2536 (เป็น SHA-0) จากนั้น พ.ศ. 2538 เป็น SHA-1

  • ซีรี่ส์: SHA-0, SHA-1, SHA-2, SHA-3,

    โดยสรุปการใช้ SHA-1 ถือว่าไม่ปลอดภัยกับฝ่ายตรงข้ามที่ดีได้รับการสนับสนุนเพราะในปี 2005 cryptanalysts พบการโจมตีใน SHA-1 ซึ่งแสดงให้เห็นว่ามันอาจจะไม่เพียงพอที่เชื่อถือได้สำหรับการใช้งานอย่างต่อเนื่องSchneier สหรัฐ NIST ให้คำแนะนำว่าหน่วยงานของรัฐบาลกลางควรหยุดใช้ SHA1-1 สำหรับการใช้งานที่ต้องการความต้านทานการชนกันและต้องใช้ SHA-2 หลังจากที่ 2010 NIST

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

ประสิทธิภาพ

การทดสอบเกณฑ์มาตรฐานง่ายๆใน PHP:

# Testing static text.

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real    0m0.845s
user    0m0.830s
sys     0m0.008s

$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real    0m1.103s
user    0m1.089s
sys     0m0.009s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real    0m1.132s
user    0m1.116s
sys   0m0.010s

# Testing random number. 

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(rand(0,$i));'
real    0m1.754s
user    0m1.735s
sys     0m0.012s\

$ time php -r 'for ($i=0;$i<1000000;$i++) md5(rand(0,$i));'
real    0m2.065s
user    0m2.042s
sys     0m0.015s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(rand(0,$i));'
real    0m2.050s
user    0m2.021s
sys     0m0.015s

ที่เกี่ยวข้อง:


8

คุณไม่ได้บอกว่าคุณพยายามปกป้องอะไร

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

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

มีความคิดเห็นว่าแฮชให้โอกาสในการตรวจพบความเสียหายมากกว่า CRC ที่มีข้อผิดพลาดหลายบิต นี่เป็นเรื่องจริงและการตัดสินใจว่าจะใช้ CRC แบบ 16 หรือ 32 บิตจะขึ้นอยู่กับผลด้านความปลอดภัยของการใช้บล็อกข้อมูลที่เสียหายหรือไม่และคุณสามารถปรับโอกาส 1 ใน 2 ^ 16 หรือ 2 ^ 32 ได้หรือไม่ บล็อกข้อมูลถูกประกาศอย่างไม่ถูกต้องถูกต้อง

อุปกรณ์จำนวนมากมีตัวสร้าง CRC ในตัวสำหรับอัลกอริทึมมาตรฐาน MSP430F5X ซีรีส์จากเท็กซัสมีการใช้ฮาร์ดแวร์ตามมาตรฐาน CRC-CCITT


6

CRC32 เร็วกว่าและแฮชมีความยาวเพียง 32 บิต

ใช้เมื่อคุณต้องการตรวจสอบอย่างรวดเร็วและเบา CRC ใช้ในอีเธอร์เน็ต

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


5

ใช้ CRC เฉพาะในกรณีที่ทรัพยากรการคำนวณแน่นมาก (เช่นสภาพแวดล้อมแบบฝังบางส่วน) หรือคุณต้องการจัดเก็บ / ขนส่งค่าเอาต์พุตจำนวนมากและพื้นที่ / แบนด์วิดท์แน่น (เนื่องจาก CRC มักเป็น 32 บิตโดยที่เอาต์พุต MD5 เป็น 128 บิต SHA1 160 บิตและตัวแปร SHA อื่น ๆ สูงสุด 512 บิต)

อย่าใช้ CRC ในการตรวจสอบความปลอดภัยเนื่องจาก CRC นั้น "ปลอม" ได้ง่ายมาก

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

กล่าวโดยย่อ: เว้นแต่คุณจะไม่มีเหตุผลที่จะไม่ใช้อัลกอริทึมแฮชที่เหมาะสมให้หลีกเลี่ยง CRC แบบธรรมดา


1
CRC จะตรวจจับการเปลี่ยนแปลงข้อมูลโดยบังเอิญทั้งหมดหากคุณใช้พหุนามที่เหมาะสม 1/2 ^ 32 จะพลาดการเปลี่ยนแปลงหากมีการเปลี่ยนแปลงหลายบิตที่ถูกต้อง
Gerhard

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

ฉันเห็นด้วยกับคำตอบของคุณยกเว้นคำถามเกี่ยวกับระบบฝังตัว ประสิทธิภาพของอัลกอริทึมการเข้ารหัสอาจเป็นปัญหาในระบบฝังตัวขนาดเล็ก
Craig McQueen

จะไม่เห็นด้วยกับสิ่งนั้นอย่างแน่นอน พหุนามข้อผิดพลาด CRC ได้รับการคัดเลือกมาอย่างดีเพื่อให้สามารถตรวจจับข้อผิดพลาด 1,2,3,5 และระเบิดได้ถึง 11 บิตในบางกรณี แฮชการเข้ารหัสเป็นข้อมูลทางสถิติอย่างแท้จริงดังนั้นคุณต้องใช้ค่าไดเจสต์ขนาดใหญ่ 8-32 บิตนั้นไม่สมจริงสำหรับการย่อยแฮชการเข้ารหัสรวมทั้งราคาแพงอย่างไม่มีจุดหมายในซีลีสและเกตของซีพียู ไม่ใช่คำตอบที่แน่นอนหากคุณทำงานกับระบบฝังตัว ครั้งเดียวที่จะไม่ใช้ CRC คือถ้าคุณต้องรับมือกับสถานการณ์ปฏิปักษ์ที่ชาญฉลาด
ilgitano

5

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


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

1
@supercat - ฉันไม่เชื่อจริงๆว่านี่เป็นปัญหาจริงๆ หากไฟล์มีส่วนหัว crc32 ซึ่งเป็น crc32 ของไฟล์ที่เหลือเมื่อไฟล์ได้รับการอัปเดตแต่ละบิตในส่วนหัว crc32 จะมีโอกาสประมาณ 50% ที่จะแตกต่างกัน การเปลี่ยนแปลงในส่วนหัวควรเป็นไปตามการแจกแจงแบบสุ่ม ฉันไม่เห็นว่าสิ่งนี้จะส่งผลให้ CRC32 (ส่วนหัว + ข้อมูล) เหมือนกันเสมอหรือไม่ว่าด้วยวิธีใดก็ตามที่ไม่ขึ้นอยู่กับส่วนข้อมูลของไฟล์
teratorn

@teratorn: ฉันเคยเห็นไฟล์จำนวนหนึ่งที่มี CRC32 ในตอนท้ายซึ่งคำนวณในลักษณะที่ CRC32 ของไฟล์ทั้งหมดซึ่งคำนวณโดยใช้ค่าคงที่เมล็ดพันธุ์โดยเฉพาะจะเป็นค่าคงที่อื่น ๆ เสมอ ซึ่งเป็นเรื่องปกติธรรมดาสำหรับสิ่งต่างๆเช่นภาพรหัสไบนารี หากเครื่องเล่นดีวีดี Acme 1000 ใช้โค้ดอิมเมจขนาดคงที่สำหรับการอัพเกรดเฟิร์มแวร์และคาดว่าโค้ดอิมเมจทั้งหมดจะมี CRC32 ที่แน่นอนกิจวัตรที่คำนวณไฟล์ต่างๆของ CRC32 จะไม่สามารถแยกแยะโค้ดอิมเมจที่แตกต่างกันสำหรับ Acme 1000 ได้
supercat

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

4

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


4

เริ่มต้นด้วยพื้นฐาน

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

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

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

นอกจากนี้หากฉันกำลังส่ง 10mbps ความเป็นไปได้ที่แพ็กเก็ตจะเสียหายเพียงแค่ข้าม crc32 และดำเนินการต่อไปยังปลายทางและดำเนินการต่ำมาก ช่วยบอกที่ 10Mbps ฉันจะได้รับ10 ข้อผิดพลาด ถ้าฉันทางลาดขึ้นไป 1Gbps ว่าตอนนี้ฉันได้รับ1,000 ข้อผิดพลาดต่อวินาที ถ้าผม ram ถึง 1 exabit ต่อวินาทีแล้วฉันมีอัตราความผิดพลาดของ1,000,000,000 ข้อผิดพลาดต่อวินาที สมมติว่าเรามีอัตราการชนกัน1 \ 1,000,000ข้อผิดพลาดในการส่งความหมาย 1 ในหนึ่งล้านข้อผิดพลาดในการส่งส่งผลให้ข้อมูลเสียหายไม่สามารถตรวจพบได้ ที่ความเร็ว 10mbps ฉันจะได้รับข้อมูลผิดพลาดถูกส่งทุกๆ 100,000 วินาทีหรือประมาณวันละครั้ง ที่ 1gbps จะเกิดขึ้นทุกๆ 5 นาที ที่ 1 exabit ต่อวินาทีเรากำลังพูดถึงวินาทีละหลาย ๆ ครั้ง

หากคุณเปิด Wireshark คุณจะเห็นส่วนหัวอีเธอร์เน็ตทั่วไปของคุณมี CRC32 ส่วนหัว IP ของคุณมี CRC32 และส่วนหัว TCP ของคุณมี CRC32 และนั่นคือสิ่งที่โปรโตคอลชั้นสูงอาจทำ เช่น IPSEC อาจใช้ MD5 หรือ SHA สำหรับการตรวจสอบความสมบูรณ์นอกเหนือจากข้างต้น มีการตรวจสอบข้อผิดพลาดหลายชั้นในการสื่อสารเครือข่ายทั่วไปและยังคงผิดพลาดซ้ำแล้วซ้ำเล่าที่ความเร็วต่ำกว่า 10mbps

Cyclic Redundancy Check (CRC) มีเวอร์ชันทั่วไปหลายเวอร์ชันและผิดปกติหลายแบบ แต่โดยทั่วไปได้รับการออกแบบมาเพื่อบอกเมื่อข้อความหรือไฟล์ได้รับความเสียหายระหว่างการขนส่ง (การพลิกหลายบิต) CRC32 นั้นไม่ใช่โปรโตคอลการตรวจสอบข้อผิดพลาดที่ดีมากตามมาตรฐานปัจจุบันในสภาพแวดล้อมองค์กรขนาดใหญ่ที่มีสเกลาร์เนื่องจากอัตราการชนกัน ผู้ใช้โดยเฉลี่ยฮาร์ดไดรฟ์สามารถมีไฟล์ได้มากกว่า 100,000 ไฟล์และการแชร์ไฟล์ใน บริษัท อาจมีได้หลายสิบล้านไฟล์ อัตราส่วนของพื้นที่แฮชต่อจำนวนไฟล์ต่ำเกินไป CRC32 มีราคาถูกในการคำนวณในขณะที่ MD5 ไม่ใช่

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

สำหรับการตรวจสอบไฟล์ Md5 เริ่มถูกใช้โดยผู้ขายจำนวนมากเนื่องจากคุณสามารถทำไฟล์หลายขนาดหรือไฟล์มัลติเธราไบต์ได้อย่างรวดเร็วด้วยการใช้งานระบบปฏิบัติการทั่วไปและการสนับสนุน CRC32 อย่าแปลกใจหากภายในทศวรรษหน้าระบบไฟล์เริ่มใช้ MD5 เพื่อตรวจสอบข้อผิดพลาด


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