เมื่อใดจึงเหมาะสมที่จะใช้ CRC ในการตรวจจับข้อผิดพลาดเทียบกับฟังก์ชันการแฮชที่ทันสมัยกว่าเช่น MD5 หรือ SHA1 ก่อนหน้านี้ใช้งานง่ายกว่าบนฮาร์ดแวร์ฝังตัวหรือไม่?
เมื่อใดจึงเหมาะสมที่จะใช้ CRC ในการตรวจจับข้อผิดพลาดเทียบกับฟังก์ชันการแฮชที่ทันสมัยกว่าเช่น MD5 หรือ SHA1 ก่อนหน้านี้ใช้งานง่ายกว่าบนฮาร์ดแวร์ฝังตัวหรือไม่?
คำตอบ:
CRC ทำงานได้ดีในการตรวจจับข้อผิดพลาดแบบสุ่มในข้อมูลที่อาจเกิดขึ้นตัวอย่างเช่นจากสัญญาณรบกวนเครือข่ายสัญญาณรบกวนของสายการบิดเบือน ฯลฯ
CRC มีความซับซ้อนในการคำนวณน้อยกว่า MD5 หรือ SHA1 มาก การใช้ฟังก์ชันแฮชเช่น MD5 อาจมากเกินไปสำหรับการตรวจจับข้อผิดพลาดแบบสุ่ม อย่างไรก็ตามการใช้ CRC สำหรับการตรวจสอบความปลอดภัยทุกประเภทจะมีความปลอดภัยน้อยกว่าฟังก์ชันการแฮชที่ซับซ้อนกว่าเช่น MD5
และใช่ CRC นั้นง่ายกว่ามากในการติดตั้งบนฮาร์ดแวร์แบบฝังคุณยังสามารถรับโซลูชันแบบแพ็คเกจที่แตกต่างกันสำหรับสิ่งนี้บน IC
MD5
, SHA-1
นอกจากนี้ยังควรหลีกเลี่ยงแตกต่างจากบางส่วนSHA-2
จะแนะนำ
CRC ได้รับการออกแบบมาเพื่อป้องกันการเปลี่ยนแปลงข้อมูลโดยไม่ได้ตั้งใจ นั่นคือเป็นการดีสำหรับการตรวจจับข้อผิดพลาดโดยไม่ได้ตั้งใจ แต่จะไม่มีประโยชน์ในการตรวจสอบว่าข้อมูลไม่ได้รับการจัดการโดยมีเจตนาร้าย
ดูสิ่งนี้ด้วย
ฉันพบการศึกษาที่แสดงให้เห็นว่าแฮช CRC ไม่เหมาะสมสำหรับตารางแฮชอย่างไร นอกจากนี้ยังอธิบายถึงลักษณะที่แท้จริงของอัลกอริทึม การศึกษายังรวมถึงการประเมินอัลกอริทึมแฮชอื่น ๆ และเป็นข้อมูลอ้างอิงที่ดีที่ควรเก็บไว้
ข้อสรุปที่เกี่ยวข้องกับ CRC สำหรับแฮช:
CRC32 ไม่เคยมีไว้สำหรับการใช้ตารางแฮช ไม่มีเหตุผลที่ดีที่จะใช้เพื่อจุดประสงค์นี้และฉันขอแนะนำให้คุณหลีกเลี่ยงการทำเช่นนั้น หากคุณตัดสินใจที่จะใช้ CRC32 สิ่งสำคัญคือคุณต้องใช้แฮชบิตจากจุดสิ้นสุดตรงข้ามกับที่ป้อนอ็อกเท็ตสำคัญซึ่งจุดจบนี้ขึ้นอยู่กับการใช้งาน CRC32 ที่เฉพาะเจาะจง อย่าถือว่า CRC32 เป็นฟังก์ชันแฮช "กล่องดำ" และอย่าใช้เป็นแฮชสำหรับวัตถุประสงค์ทั่วไป อย่าลืมทดสอบการใช้งานแต่ละครั้งเพื่อความเหมาะสม
UPDATE
ดูเหมือนว่าไซต์จะไม่ทำงาน ที่เก็บถาวรทางอินเทอร์เน็ตมีสำเนาแม้ว่า
ฉันรันโค้ด 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
ข้อสรุปของฉัน:
ใช้ "sha256" (หรือสูงกว่า) เมื่อคุณต้องการเพิ่มเลเยอร์ความปลอดภัย
อย่าใช้ "md5" หรือ "sha1" เนื่องจากมี:
"The quick brown fox jumped over the lazy dog."
) คุณจะเห็นว่า CRC เร็วกว่า MD5 มากเพียงใด
สำหรับข้อมูลเกี่ยวกับการดำเนิน CRC ความเร็วและความน่าเชื่อถือดูคู่มือเจ็บปวด A ถึง CRC ขั้นตอนวิธีการตรวจสอบข้อผิดพลาด มีทุกอย่างใน CRCs
เว้นแต่จะมีใครพยายามแก้ไขข้อมูลของคุณโดยประสงค์ร้ายและซ่อนการเปลี่ยนแปลง CRC ก็เพียงพอแล้ว เพียงใช้พหุนาม "ดี" (มาตรฐาน)
ทุกอย่างขึ้นอยู่กับความต้องการและความคาดหวังของคุณ
ความแตกต่างโดยย่ออย่างรวดเร็วระหว่างอัลกอริทึมฟังก์ชันแฮชเหล่านี้มีดังนี้
คืออัลกอริทึมแฮชที่เข้ารหัส
สร้างค่าแฮช 160 บิต (20 ไบต์) ที่เรียกว่าการย่อยข้อความ
มันเป็นแฮชที่เข้ารหัสและตั้งแต่ปี 2548 ก็ไม่ถือว่าปลอดภัย
สามารถใช้เพื่อวัตถุประสงค์ในการเข้ารหัส
ตีพิมพ์ครั้งแรกในปี พ.ศ. 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
ที่เกี่ยวข้อง:
คุณไม่ได้บอกว่าคุณพยายามปกป้องอะไร
CRC มักใช้ในระบบฝังตัวเพื่อตรวจสอบความเสียหายของข้อมูลโดยไม่ได้ตั้งใจแทนที่จะป้องกันการแก้ไขระบบที่เป็นอันตราย ตัวอย่างของสถานที่ที่ CRC สามารถเป็นประโยชน์คือการตรวจสอบอิมเมจ EPROM ในระหว่างการเริ่มต้นระบบเพื่อป้องกันความเสียหายของเฟิร์มแวร์ bootloader ระบบจะคำนวณ CRC สำหรับรหัสแอปพลิเคชันและเปรียบเทียบกับค่าที่เก็บไว้ก่อนที่จะอนุญาตให้รันโค้ด วิธีนี้ป้องกันความเป็นไปได้ของการทุจริตของโปรแกรมโดยไม่ได้ตั้งใจหรือการดาวน์โหลดล้มเหลว
นอกจากนี้ยังสามารถใช้ CRC ในลักษณะเดียวกันเพื่อป้องกันข้อมูลการกำหนดค่าที่จัดเก็บใน FLASH หรือ EEPROM หาก CRC ไม่ถูกต้องข้อมูลอาจถูกตั้งค่าสถานะว่าไม่ถูกต้องและใช้ชุดข้อมูลเริ่มต้นหรือข้อมูลสำรอง CRC อาจไม่ถูกต้องเนื่องจากความล้มเหลวของอุปกรณ์หรือหากผู้ใช้ถอดพลังงานออกในระหว่างการอัปเดตที่เก็บข้อมูลการกำหนดค่า
มีความคิดเห็นว่าแฮชให้โอกาสในการตรวจพบความเสียหายมากกว่า CRC ที่มีข้อผิดพลาดหลายบิต นี่เป็นเรื่องจริงและการตัดสินใจว่าจะใช้ CRC แบบ 16 หรือ 32 บิตจะขึ้นอยู่กับผลด้านความปลอดภัยของการใช้บล็อกข้อมูลที่เสียหายหรือไม่และคุณสามารถปรับโอกาส 1 ใน 2 ^ 16 หรือ 2 ^ 32 ได้หรือไม่ บล็อกข้อมูลถูกประกาศอย่างไม่ถูกต้องถูกต้อง
อุปกรณ์จำนวนมากมีตัวสร้าง CRC ในตัวสำหรับอัลกอริทึมมาตรฐาน MSP430F5X ซีรีส์จากเท็กซัสมีการใช้ฮาร์ดแวร์ตามมาตรฐาน CRC-CCITT
CRC32 เร็วกว่าและแฮชมีความยาวเพียง 32 บิต
ใช้เมื่อคุณต้องการตรวจสอบอย่างรวดเร็วและเบา CRC ใช้ในอีเธอร์เน็ต
หากคุณต้องการความน่าเชื่อถือมากขึ้นควรใช้ฟังก์ชันแฮชที่ทันสมัย
ใช้ CRC เฉพาะในกรณีที่ทรัพยากรการคำนวณแน่นมาก (เช่นสภาพแวดล้อมแบบฝังบางส่วน) หรือคุณต้องการจัดเก็บ / ขนส่งค่าเอาต์พุตจำนวนมากและพื้นที่ / แบนด์วิดท์แน่น (เนื่องจาก CRC มักเป็น 32 บิตโดยที่เอาต์พุต MD5 เป็น 128 บิต SHA1 160 บิตและตัวแปร SHA อื่น ๆ สูงสุด 512 บิต)
อย่าใช้ CRC ในการตรวจสอบความปลอดภัยเนื่องจาก CRC นั้น "ปลอม" ได้ง่ายมาก
แม้ว่าการตรวจจับข้อผิดพลาดโดยไม่ได้ตั้งใจ (แทนที่จะตรวจจับการเปลี่ยนแปลงที่เป็นอันตราย) จะดีกว่า CRC ธรรมดา ส่วนหนึ่งเป็นเพราะวิธีง่ายๆในการคำนวณ CRC (และส่วนหนึ่งเป็นเพราะค่า CRC ปกติจะสั้นกว่าเอาต์พุตแฮชทั่วไปดังนั้นจึงมีช่วงค่าที่เป็นไปได้น้อยกว่ามาก) จึงมีความเป็นไปได้สูงกว่ามากในสถานการณ์ที่มีข้อผิดพลาดตั้งแต่สองข้อขึ้นไป ข้อผิดพลาดหนึ่งจะปิดบังอีกข้อหนึ่งดังนั้นคุณจึงได้ CRC เดียวกันแม้จะมีข้อผิดพลาดสองข้อ
กล่าวโดยย่อ: เว้นแต่คุณจะไม่มีเหตุผลที่จะไม่ใช้อัลกอริทึมแฮชที่เหมาะสมให้หลีกเลี่ยง CRC แบบธรรมดา
เมื่อเร็ว ๆ นี้ฉันพบการใช้ CRC ซึ่งฉลาด ผู้เขียนเครื่องมือระบุและการลบไฟล์jdupe (ผู้เขียนคนเดียวกับ jhead เครื่องมือ exif ยอดนิยม) ใช้ในระหว่างการส่งผ่านไฟล์ครั้งแรก CRC คำนวณจาก 32K แรกของแต่ละไฟล์เพื่อทำเครื่องหมายไฟล์ที่ดูเหมือนจะเหมือนกันและไฟล์จะต้องมีขนาดเท่ากัน ไฟล์เหล่านี้จะถูกเพิ่มลงในรายการไฟล์ที่จะทำการเปรียบเทียบไบนารีแบบเต็ม เร่งความเร็วในการตรวจสอบไฟล์มีเดียขนาดใหญ่
CRC32 นั้นเร็วกว่าและบางครั้งก็มีการรองรับฮาร์ดแวร์ (เช่นในโปรเซสเซอร์ Nehalem) จริงๆเพียงครั้งเดียวที่คุณควรใช้คือถ้าคุณกำลังเชื่อมต่อกับฮาร์ดแวร์หรือถ้าคุณจริงๆแน่นในการปฏิบัติงาน
เริ่มต้นด้วยพื้นฐาน
ในการเข้ารหัสอัลกอริทึมการแฮชจะแปลงบิตจำนวนมากให้เป็นบิตน้อยลงผ่านการดำเนินการแยกย่อย แฮชใช้เพื่อยืนยันความสมบูรณ์ของข้อความและไฟล์
อัลกอริทึมการแฮชทั้งหมดสร้างการชนกัน การชนกันคือเมื่อชุดค่าผสมหลายบิตให้ผลลัพธ์บิตน้อยลงเท่ากัน ความแข็งแกร่งในการเข้ารหัสของอัลกอริทึมการแฮชถูกกำหนดโดยการที่แต่ละบุคคลไม่สามารถระบุได้ว่าผลลัพธ์จะเป็นอย่างไรสำหรับอินพุตที่กำหนดเพราะหากทำได้พวกเขาสามารถสร้างไฟล์ที่มีแฮชที่ตรงกับไฟล์ที่ถูกต้องและลดทอนความสมบูรณ์ที่สันนิษฐานไว้ ของระบบ ความแตกต่างระหว่าง 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 เพื่อตรวจสอบข้อผิดพลาด
รหัส CRC นั้นง่ายและเร็วกว่า
คุณต้องการอะไรบ้าง?