Checksum คืออะไร? อธิบาย MD5, SHA-1, SHA-256
Checksum คือลายนิ้วมือขนาดสั้นที่ช่วยให้คุณตรวจสอบได้ว่าไฟล์ไม่ได้ถูกแก้ไขหรือเสียหาย การเข้าใจว่าควรใช้อัลกอริทึม Hash ตัวไหน — และจุดอ่อนของ MD5 — จะช่วยปกป้องคุณจากข้อผิดพลาดด้านความปลอดภัยทั่วไป
Checksum คืออะไร?
Checksum คือสตริงที่มีความยาวคงที่ซึ่งได้มาจากข้อมูลส่วนหนึ่งโดยการรันผ่าน hash function โดย Checksum ทำหน้าที่เหมือนลายนิ้วมือ: หากมีแม้แต่บิตเดียวของข้อมูลเดิมเปลี่ยนไป Checksum จะเปลี่ยนไปอย่างสิ้นเชิง สิ่งนี้ทำให้ Checksum มีประโยชน์สำหรับสองอย่าง:
- การตรวจสอบความถูกต้อง (Integrity verification) — ไฟล์นี้มาถึงโดยไม่เสียหายหรือถูกแก้ไขหรือไม่?
- เอกลักษณ์ (Identity) — ไฟล์นี้ (หรือข้อมูลส่วนนี้) เป็นไฟล์เดียวกันกับอีกสำเนาหนึ่งหรือไม่?
เมื่อคุณดาวน์โหลดซอฟต์แวร์จากไซต์อย่างเป็นทางการ หน้าดาวน์โหลดมักจะแสดง hash แบบ MD5 หรือ SHA-256 หลังจากดาวน์โหลด คุณสามารถคำนวณ hash ของไฟล์ในเครื่องของคุณและนำมาเปรียบเทียบ หากตรงกัน แสดงว่าไฟล์นั้นสมบูรณ์
หลักการทำงานของ Hash Function
Cryptographic hash function จะรับข้อมูลในความยาวใดก็ได้และส่งออกเป็น digest ที่มีความยาวคงที่ คุณสมบัติสี่ประการที่กำหนดให้เป็น Hash function ที่ดีคือ:
- Deterministic — อินพุตเดิมจะให้เอาต์พุตเดิมเสมอ
- One-way — คุณไม่สามารถย้อนกลับจาก hash ไปหาอินพุตเดิมได้ (ภายในระยะเวลาที่เหมาะสม)
- Avalanche effect — การเปลี่ยนตัวอักษรเพียงตัวเดียวในอินพุตจะทำให้บิตของเอาต์พุตเปลี่ยนแปลงไปประมาณครึ่งหนึ่ง
- Collision-resistant — ควรจะเป็นไปไม่ได้ทางคำนวณที่จะหาอินพุตที่ต่างกันสองชุดที่ให้ hash เดียวกัน
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824SHA-256("Hello") = 185f8db32921bd46d35e3a1a4e9a9b9c6a7e6a7d2d2c4e9d... (ต่างกันโดยสิ้นเชิง)
MD5 — รวดเร็ว, คุ้นเคย และไม่ปลอดภัยสำหรับการรักษาความปลอดภัย
MD5 (Message Digest Algorithm 5) ให้ผลลัพธ์เป็น digest ขนาด 128 บิต (Hex 32 ตัวอักษร) มันถูกออกแบบขึ้นในปี 1991 และกลายเป็นอัลกอริทึม Checksum มาตรฐานบนอินเทอร์เน็ตมาประมาณสองทศวรรษ
จุดที่ MD5 ยังยอมรับได้:
- การตรวจสอบความถูกต้องที่ไม่เกี่ยวข้องกับความปลอดภัย — การตรวจสอบว่าการส่งไฟล์ขนาดใหญ่ไม่เสียหายระหว่างทาง
- Deduplication — การตรวจสอบว่าสองไฟล์เหมือนกันหรือไม่ (เพื่อเป็นการตรวจสอบเบื้องต้นอย่างรวดเร็วก่อนจะเปรียบเทียบทีละไบต์)
- Cache keys และ ETags ที่ไม่มีความกังวลเรื่องการโจมตีแบบ collision
จุดที่ MD5 ไม่สามารถยอมรับได้:
- การเก็บรหัสผ่าน — MD5 นั้นเร็วมาก ซึ่งทำให้การโจมตีแบบ brute-force ผ่าน GPU ทำได้ง่ายมาก สามารถคำนวณ MD5 hashes ได้หลายพันล้านครั้งต่อวินาทีด้วยฮาร์ดแวร์สำหรับผู้บริโภคทั่วไป
- Digital signatures — มีการสาธิตการโจมตีแบบ collision ของ MD5 ในทางปฏิบัติแล้ว โดยสามารถสร้างไฟล์ที่ต่างกันสองไฟล์ให้มี MD5 hash เดียวกันได้
- Certificate fingerprints — ปัญหาเรื่อง collision เดียวกันนี้ถูกนำมาใช้ด้วย
md5($password) ในโค้ดเก่า ให้เปลี่ยนเป็น password_hash() ใน PHP หรือ bcrypt/Argon2 ในภาษาอื่นๆ MD5 ไม่ใช่อัลกอริทึมสำหรับการ Hash รหัสผ่าน — มันไม่เคยถูกออกแบบมาให้ช้า และความช้าคือสิ่งที่ทำให้การ Hash รหัสผ่านปลอดภัย
SHA-1 — เลิกใช้งานแล้ว (Deprecated)
SHA-1 ให้ผลลัพธ์เป็น digest ขนาด 160 บิต (Hex 40 ตัวอักษร) มันมาแทนที่ MD5 ในฐานะอัลกอริทึมที่แนะนำในช่วงปลายทศวรรษ 1990 และถูกใช้อย่างแพร่หลายใน SSL/TLS certificates, ระบบควบคุมเวอร์ชัน และการตรวจสอบความถูกต้องของไฟล์
ในปี 2017 ทีม Project Zero ของ Google ได้สาธิตการโจมตี SHA-1 collision ครั้งแรกที่ใช้งานได้จริง (การโจมตี "SHAttered") ซึ่งต้องใช้กำลังการประมวลผลเทียบเท่ากับ CPU ประมาณ 6,500 ปี เบราว์เซอร์หลักและหน่วยงานออกใบรับรอง (Certificate Authorities) เลิกยอมรับใบรับรอง SHA-1 ในปี 2017 โดย Git ยังคงใชั SHA-1 ภายในสำหรับ commit hashes แต่กำลังอยู่ในกระบวนการย้ายไปใช้ SHA-256 เป็นทางเลือกเสริม
สำหรับการใช้งานใหม่ อย่าใช้ SHA-1 ให้ใช้ SHA-256 หรือ SHA-512 แทน
SHA-256 — มาตรฐานในปัจจุบัน
SHA-256 เป็นส่วนหนึ่งของตระกูล SHA-2 ที่ออกแบบโดย NSA และประกาศเผยแพร่ในปี 2001 ให้ผลลัพธ์เป็น digest ขนาด 256 บิต (Hex 64 ตัวอักษร) จนถึงปัจจุบัน ยังไม่มีการโจมตีแบบ collision ที่ใช้งานได้จริงสำหรับ SHA-256
ใช้ SHA-256 สำหรับ:
- การตรวจสอบความถูกต้องของไฟล์ (การดาวน์โหลดซอฟต์แวร์, การสำรองข้อมูล)
- Digital signatures (TLS certificates, การลงนามรหัส)
- HMAC-based authentication tokens (HMAC-SHA256)
- Blockchain และสกุลเงินดิจิทัล (Bitcoin ใช้ double SHA-256)
- Git commit hashes ในโหมด SHA-256
- JWT (JSON Web Token) signatures เมื่อใช้ HS256 หรือ RS256
SHA-256 เป็นค่าเริ่มต้นที่เหมาะสมสำหรับเกือบทุกแอปพลิเคชันที่ต้องการ Secure hash หากไม่แน่ใจ ให้ใช้ SHA-256
SHA-512 — เมื่อคุณต้องการมากกว่าเดิม
SHA-512 ให้ผลลัพธ์เป็น digest ขนาด 512 บิต (Hex 128 ตัวอักษร) เป็นส่วนหนึ่งของตระกูล SHA-2 เดียวกันและมีความปลอดภัยเท่ากัน ความแตกต่างในทางปฏิบัติหลักคือ:
- บนโปรเซสเซอร์ 64 บิต, SHA-512 อาจจะ เร็วกว่า SHA-256 เพราะอัลกอริทึมถูกปรับแต่งมาเพื่อขนาดคำแบบ 64 บิต
- บนระบบและฮาร์ดแวร์ 32 บิต, SHA-256 จะเร็วกว่า
- SHA-512 มีผลลัพธ์ที่ใหญ่กว่า ซึ่งหมายถึงการจัดเก็บและการส่งข้อมูลที่ยาวขึ้น
ใช้ SHA-512 เมื่อแอปพลิเคชันต้องการ digest ที่ใหญ่กว่า หรือเมื่อคุณใช้งานบนฮาร์ดแวร์ที่ SHA-512 มีความได้เปรียบด้านประสิทธิภาพ สำหรับเว็บแอปพลิเคชันส่วนใหญ่ SHA-256 ก็เพียงพอแล้ว
หมายเหตุเกี่ยวกับการ Hash รหัสผ่าน
ไม่ควรใช้อัลกอริทึมใดๆ ด้านบนสำหรับการเก็บรหัสผ่านโดยตรง MD5, SHA-1, SHA-256 และ SHA-512 ถูกออกแบบมาให้ เร็ว และความเร็วคือสิ่งที่ผิดสำหรับรหัสผ่าน
การ Hash รหัสผ่านจำเป็นต้อง ช้าอย่างตั้งใจ เพื่อไม่ให้ฐานข้อมูลที่ถูกขโมยไปสามารถถูกถอดรหัสได้อย่างรวดเร็ว ควรใช้อัลกอริทึมที่ออกแบบมาเพื่อการ Hash รหัสผ่านโดยเฉพาะ:
- bcrypt — เป็นมาตรฐานมานานกว่า 20 ปี รองรับในแทบทุกภาษา
- Argon2 (โดยเฉพาะ Argon2id) — ผู้ชนะการแข่งขัน Password Hashing Competition (2015) แนะนำสำหรับแอปพลิเคชันใหม่
- scrypt — แบบ memory-hard เป็นอีกหนึ่งตัวเลือกที่แข็งแกร่ง
ใน PHP: password_hash($password, PASSWORD_ARGON2ID) ใน Node.js: ใช้แพ็กเกจ bcryptjs หรือ <argon2> ซึ่งจะจัดการการสร้าง salt และการปรับแต่ง work factor ให้โดยอัตโนมัติ
วิธีตรวจสอบ File Checksum
เมื่อคุณดาวน์โหลดซอฟต์แวร์และเว็บไซต์ให้ค่า SHA-256 hash มา:
shasum -a 256 downloaded-file.zip
# เปรียบเทียบผลลัพธ์กับ hash อย่างเป็นทางการ
บน Windows (PowerShell):
Get-FileHash downloaded-file.zip -Algorithm SHA256
นอกจากนี้ คุณสามารถใช้ Hash Generator ของเราเพื่อวางเนื้อหาไฟล์หรือข้อความ และคำนวณค่า MD5, SHA-1, SHA-256 หรือ SHA-512 ได้โดยตรงในเบราว์เซอร์ของคุณ — ไม่มีข้อมูลใดถูกส่งไปยังเซิร์ฟเวอร์
สร้าง MD5, SHA-256 และอื่นๆ
คำนวณ Hash ใดก็ได้ (MD5, SHA-1, SHA-256, SHA-512) จากข้อความหรือเนื้อหาไฟล์ในเบราว์เซอร์ของคุณ — ไม่ต้องอัปโหลด, ไม่มีเซิร์ฟเวอร์