วิธีใช้งาน
- พิมพ์หรือวางข้อความ ตั้ง “รูปแบบอินพุต” เป็น “เลขฐานสิบหก” เพื่อป้อนไบต์ดิบ หรือคลิก “เปิดไฟล์” เพื่อคำนวณเช็กซัมของเนื้อหาไฟล์
- ที่ “อัลกอริทึม” ให้คง CRC-32 ไว้สำหรับไฟล์ ZIP, gzip และ PNG หรือเลือก CRC-32C สำหรับงานที่เกี่ยวกับ iSCSI, ext4, Btrfs และ Google Cloud Storage
- เลือกเอาต์พุตเป็น “hex (ตัวพิมพ์เล็ก)” “HEX (ตัวพิมพ์ใหญ่)” “เลขฐานสิบ” หรือ Base64
- หากต้องการตรวจสอบ ให้วางเช็กซัมที่คาดไว้ลงในช่อง “เปรียบเทียบกับ” โดยป้อนเป็นเลขฐานสิบหกที่ไม่มี 0x เป็นเลขฐานสิบ หรือเป็น Base64
เช็กซัม CRC32 คืออะไร
การตรวจสอบความซ้ำซ้อนแบบวนรอบ (cyclic redundancy check) จะมองอินพุตเป็นพหุนามไบนารียาวหนึ่งตัว นำไปหารด้วยพหุนามตัวกำเนิดที่กำหนดไว้ตายตัว แล้วเก็บเศษไว้ สำหรับ CRC-32 เศษจะมีขนาด 32 บิต มักเขียนเป็นเลขฐานสิบหก 8 หลัก หรือเป็นจำนวนเต็มไม่มีเครื่องหมายตั้งแต่ 0 ถึง 4,294,967,295 การเปลี่ยนแปลงข้อมูลแทบทุกรูปแบบจะทำให้เศษเปลี่ยนไป
CRC ถูกออกแบบมาสำหรับข้อผิดพลาดที่เกิดขึ้นจริงจากสายเคเบิล คลื่นวิทยุ และดิสก์ CRC-32 ตรวจจับบิตที่เสียหายติดกันเป็นช่วง (burst) ที่ยาวไม่เกิน 32 บิตได้ทุกกรณี และความเสียหายแบบสุ่มจะหลุดรอดไปได้เพียงราวหนึ่งครั้งในทุก 4,300 ล้านกรณี นอกจากนี้ยังคำนวณได้เร็วมาก จึงถูกฝังไว้ใน ZIP, gzip, PNG และเฟรม Ethernet
CRC-32 และ CRC-32C
| CRC-32 | CRC-32C (Castagnoli) | |
|---|---|---|
| พหุนาม | 0x04C11DB7 แบบกลับลำดับบิตคือ 0xEDB88320 | 0x1EDC6F41 แบบกลับลำดับบิตคือ 0x82F63B78 |
ค่าตรวจสอบของ 123456789 | cbf43926 | e3069283 |
| ใช้ใน | ZIP, gzip, PNG, Ethernet | iSCSI, SCTP, เมทาดาทาของ ext4, Btrfs, Google Cloud Storage |
| การรองรับในฮาร์ดแวร์ | คำสั่ง CRC32 ของ ARMv8 | คำสั่ง crc32 ของ x86 SSE4.2, ARMv8 |
ทั้งสองแบบเริ่มต้นจาก 0xFFFFFFFF ประมวลผลบิตของแต่ละไบต์โดยเริ่มจากบิตที่มีนัยสำคัญน้อยที่สุด และกลับค่าบิตของผลลัพธ์สุดท้าย ต่างกันเพียงพหุนามเท่านั้น ข้อมูลเดียวกันจึงให้ผลลัพธ์สองค่าที่ไม่เกี่ยวข้องกันเลย แบบแรกคือสิ่งที่เครื่องมือส่วนใหญ่หมายถึงเมื่อพูดว่า "CRC32" และถูกจัดอยู่ในแค็ตตาล็อกในชื่อ CRC-32/ISO-HDLC ส่วน CRC-32C ถูกนำมาใช้ภายหลังในโปรโตคอลด้านการจัดเก็บข้อมูลและเครือข่าย เพราะตรวจจับข้อผิดพลาดได้ดีกว่า Google Cloud Storage รายงาน CRC-32C และ Amazon S3 รายงานได้ทั้งสองแบบ ในรูป Base64 ของสี่ไบต์ที่เรียงลำดับแบบ big-endian ซึ่งตรงกับที่เอาต์พุต Base64 แสดงทุกประการ
เช็กซัม ไม่ใช่การตรวจสอบด้านความปลอดภัย
CRC ป้องกันความผิดพลาดที่เกิดโดยบังเอิญ ไม่ใช่การโจมตี CRC เป็นฟังก์ชันเชิงเส้น ใครก็ตามจึงแก้ไขไฟล์แล้วปรับค่าสี่ไบต์เพื่อให้ CRC-32 คงเดิมได้ CRC ที่ตรงกันจึงพิสูจน์ไม่ได้เลยว่าไฟล์ไม่ถูกดัดแปลงโดยเจตนา หากต้องการตรวจสอบไฟล์ที่ดาวน์โหลด ให้เปรียบเทียบแฮช SHA-256 จากแหล่งที่เชื่อถือได้ และหากต้องการพิสูจน์ว่าใครเป็นผู้ส่งข้อความ ให้ใช้ HMAC
32 บิตยังน้อยเกินไปที่จะใช้ระบุข้อมูลแต่ละชุด ในไฟล์สุ่มราว 77,000 ไฟล์ โอกาสที่จะมีสองไฟล์ที่มี CRC-32 เดียวกันก็สูงถึง 50% แล้ว จึงไม่ควรใช้เป็น ID ที่ไม่ซ้ำกันหรือคีย์สำหรับตัดข้อมูลซ้ำ ในกรณีที่ไม่มีผู้โจมตีเกี่ยวข้อง MD5 หรือ SHA-256 เป็นลายนิ้วมือของข้อมูลที่ดีกว่ามาก
CRC32 ในโค้ด
# Python: zlib.crc32 ใน Python 3 คืนค่าแบบไม่มีเครื่องหมาย
# ต้องใช้ "& 0xffffffff" เฉพาะใน Python 2
import zlib
format(zlib.crc32(b'123456789'), '08x') # 'cbf43926'
// Node.js 20.15+ และ 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0') // 'cbf43926'
// Go (import "hash/crc32")
crc32.ChecksumIEEE(data) // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli)) // CRC-32C
// Java: java.util.zip.CRC32 และ java.util.zip.CRC32C ตั้งแต่ Java 9
// PHP
sprintf('%08x', crc32('123456789')); // 'cbf43926'
hash('crc32b', '123456789'); // 'cbf43926' คือ CRC-32 ตัวเดียวกัน
hash('crc32c', '123456789'); // 'e3069283'
hash('crc32', '123456789'); // '181989fc' เป็น CRC คนละแบบ
ระวังเรื่องชื่อใน PHP อัลกอริทึมแฮชที่ชื่อ crc32 ไม่ใช่เช็กซัมของ ZIP แต่เป็น CRC ที่ bzip2 ใช้ และแสดงผลในลำดับไบต์ที่กลับด้าน ให้ใช้ crc32b หรือฟังก์ชัน crc32() เพื่อให้ตรงกับ ZIP, gzip และเครื่องมือนี้ ส่วนคำสั่ง cksum ของ Unix ใช้อีกรูปแบบหนึ่งที่นำความยาวของไฟล์มาคำนวณด้วย ตัวเลขที่ได้จึงไม่ตรงกับทั้งสองแบบ
ตัวอย่าง
| อินพุต (UTF-8) | CRC-32 |
|---|---|
Hello, World! | ec4ac3d0 |
Base64.is | 915d7207 |
你好 | 50a2b841 |
คำถามที่พบบ่อย
CRC32 ของ "123456789" คือเท่าใด
cbf43926 (3421780262 ในเลขฐานสิบ) และ CRC-32C คือ e3069283 หากโค้ดที่คุณเขียนเองให้ค่าเหล่านี้ แสดงว่าใช้พารามิเตอร์เดียวกับเครื่องมือนี้ทำไม CRC32 ของฉันจึงต่างจากเครื่องมืออื่น
cksum ของ POSIX ล้วนให้ผลต่างกัน) ไบต์ของอินพุต (การจบบรรทัด อักขระขึ้นบรรทัดใหม่ต่อท้าย การเข้ารหัสอักขระ) รูปแบบตัวเลข (บางภาษาคืนค่าเป็นจำนวนเต็ม 32 บิตแบบมีเครื่องหมาย ทำให้ค่าที่มากกลายเป็นค่าลบ) และลำดับไบต์ทำไมไบต์ของ CRC ในไฟล์ ZIP หรือ gzip จึงกลับด้าน
unzip -v และโปรแกรมอื่นส่วนใหญ่จะแสดงไบต์ที่มีนัยสำคัญมากที่สุดก่อนคำนวณ CRC32 ของไฟล์ขนาดใหญ่ได้หรือไม่
ได้ คลิก “เปิดไฟล์” แล้วเช็กซัมจะคำนวณจากไบต์ของไฟล์บนอุปกรณ์ของคุณโดยไม่มีการอัปโหลด ใช้ได้กับทุกไฟล์ที่เบราว์เซอร์โหลดไว้ในหน่วยความจำได้ จากนั้นคุณสามารถเปรียบเทียบผลลัพธ์กับค่าในไฟล์ SFV หรือในรายการไฟล์ของ ZIP
CRC32 เป็นฟังก์ชันแฮชหรือไม่
CRC32 แปลงข้อมูลความยาวเท่าใดก็ได้เป็นค่าขนาดคงที่ 32 บิต จึงมักถูกจัดรวมไว้กับแฮช แต่ CRC32 คือเช็กซัม ซึ่งตรวจจับข้อผิดพลาดที่เกิดโดยไม่ตั้งใจ และไม่ได้ป้องกันผู้ที่จงใจเปลี่ยนแปลงข้อมูล เมื่อต้องการลายนิ้วมือของข้อมูลที่แข็งแกร่งกว่า ตาราง “อัลกอริทึมทั้งหมด” ใต้ผลลัพธ์จะแสดง MD5 และตระกูล SHA ของอินพุตเดียวกัน