MD5 vs SHA-256 — ทำไมควรหยุดใช้ MD5
MD5 อยู่ทุกที่ มันมาในทุกภาษาเขียนโปรแกรม, ทุกฐานข้อมูล, SDK ของผู้ให้บริการ cloud ทุกตัว นักพัฒนาเอื้อมหามันจากนิสัย — เร็ว, ผลิตสตริง hex 32 ตัวที่เป็นระเบียบ และ API คือสองบรรทัดของโค้ด ปัญหา: MD5 ถูกเจาะเชิงเข้ารหัสตั้งแต่ปี 2004 และการโจมตียิ่งเร็วและถูกลงตั้งแต่นั้น
ไม่ใช่ทางทฤษฎี การโจมตีไซเบอร์ปี 2012 บนโครงสร้างพื้นฐานอิหร่าน — มัลแวร์ Flame — ปลอม certificate การเซ็นโค้ด Microsoft โดยใช้ประโยชน์จาก MD5 collision เทคนิคเดียวกันที่นักเข้ารหัสในวิชาการแสดงในกระดาษกลายเป็นอาวุธที่ใช้ในการสอดแนมภูมิรัฐศาสตร์ MD5 ไม่ได้อ่อนแอเล็กน้อย; มันถูก compromise โดยพื้นฐานสำหรับการใช้งานใดที่ผู้ตรงข้ามสามารถเลือก input
SHA-256 เป็นส่วนของตระกูล SHA-2 ที่เป็นมาตรฐานโดย NIST ไม่มีการโจมตี collision ที่รู้จักและยังเป็นมาตรฐานสำหรับความสมบูรณ์เชิงเข้ารหัสในปี 2026 บทความนี้อธิบายเป๊ะว่าความแตกต่างหมายถึงอะไร, เมื่อใด (น้อย) MD5 ยังยอมรับได้ และวิธี migrate อย่างปลอดภัย คุณสามารถคำนวณทั้งสอง hash ได้ทันทีด้วยเครื่องมือ Toova MD5 hash และ Toova SHA-256 hash
ฟังก์ชัน Hash ทำงานอย่างไร
ฟังก์ชัน hash เชิงเข้ารหัสรับ input ความยาวใดและผลิต output ความยาวคงที่ (digest) ด้วยคุณสมบัติเหล่านี้:
- Deterministic: input เดียวกันผลิต output เดียวกันเสมอ
- Avalanche effect: การเปลี่ยน bit เดียวใน input เปลี่ยน output โดยสิ้นเชิง
- การต้าน Preimage: ให้ hash, เป็นไปไม่ได้เชิงคำนวณที่จะหา input
- การต้าน Collision: เป็นไปไม่ได้เชิงคำนวณที่จะหา input ที่ต่างกันสองตัวที่ผลิต hash เดียวกัน
Avalanche effect คือเหตุที่ทั้ง MD5 และ SHA-256 ดูคล้ายกันเมื่อเหลือบมอง:
MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6
MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be ตัวอักษรหนึ่งเปลี่ยนใน input ("dog" → "cog") แต่ output ต่างกันสิ้นเชิง คุณสมบัตินี้ถือสำหรับทั้งสองอัลกอริทึม ความแตกต่างคือสิ่งที่เกิดเมื่อ ผู้โจมตี พยายามหา collision โดยตั้งใจ
MD5 — เส้นเวลาแห่งความล้มเหลว (1996-2025)
MD5 ออกแบบโดย Ron Rivest ในปี 1991 เป็นการแทน MD4 ในปี 1996, Hans Dobbertin พบ collision ในฟังก์ชันการบีบของ MD5 — ไม่ใช่อัลกอริทึมเต็ม แต่เป็นสัญญาณเตือนว่าการออกแบบเปราะ ชุมชนความปลอดภัยเริ่มแนะนำการ migrate ไป SHA-1 ระบบส่วนใหญ่เพิกเฉย
2004 — Collision เต็มถูกแสดง
ในสิงหาคม 2004, Xiaoyun Wang และ Hongbo Yu นำเสนอการโจมตี collision ปฏิบัติได้บน MD5 ที่ประชุม CRYPTO พวกเขาสามารถสร้างข้อความ 1,024-bit ต่างกันสองชุดที่มี MD5 hash เดียวกันในไม่ถึงชั่วโมงบน cluster การรับประกันพื้นฐานของ MD5 — การต้าน collision — ถูกเจาะ
NIST เริ่ม deprecate MD5 ทันทีสำหรับการใช้ของรัฐบาลกลาง คำแนะนำอุตสาหกรรมส่วนใหญ่ตามมา การ deploy MD5 จริงในระบบ production แทบไม่เปลี่ยน
2008 — Certificate CA ปลอม
กลุ่มนักวิจัย (Sotirov, Stevens และคนอื่น) แสดงว่าพวกเขาสามารถสร้าง certificate Certificate Authority ปลอมที่จะไว้ใจโดยเบราว์เซอร์หลักทั้งหมด การโจมตีใช้ประโยชน์จากความจริงที่ certificate authority หลายตัวยังเซ็น certificate ด้วย MD5 นักวิจัยสร้าง collision ระหว่างคำขอ certificate ที่ดูถูกต้องและ certificate CA ที่สร้างเอง — แล้วให้ CA จริงเซ็นชุดที่ถูกต้อง ผลิต signature ที่ใช้ได้สำหรับ certificate CA ปลอมด้วย
เบราว์เซอร์หลักทุกตัวบล็อก certificate ที่เซ็นด้วย MD5 ทันที Certificate authority ส่วนใหญ่หยุดออก บทเรียนหลัก: จุดอ่อนเชิงเข้ารหัสกลายเป็นใช้ประโยชน์ได้ในขณะที่ผู้โจมตีควบคุม input ของฟังก์ชัน hash
2012 — มัลแวร์ Flame
มัลแวร์ Flame การสอดแนมไซเบอร์ ค้นพบในปี 2012 และเชื่อมโยงกับผู้กระทำของรัฐ, ปลอม certificate Windows Update Microsoft โดยใช้ MD5 collision แบบ chosen-prefix การโจมตีซับซ้อนกว่าการแสดงในปี 2008: ผู้โจมตีสามารถสร้าง payload ร้ายที่ชนกับ certificate Microsoft ที่ถูกต้องภายใต้เงื่อนไขที่โครงสร้างพื้นฐานการเซ็นของ Microsoft จะร่วมมือโดยไม่รู้ตัว
ผล: Flame สามารถแจกจ่ายตัวเองผ่าน Windows Update ราวกับการอัปเดต Microsoft ที่ถูกต้อง พร้อม signature Microsoft ที่ใช้ได้ เครื่อง Windows หลายแสนเครื่องในอิหร่าน, เลบานอน, ซีเรียและซูดานติดเชื้อ นี่เป็นการใช้ประโยชน์การโจมตี MD5 collision ในโลกจริงที่ระดับรัฐ ดู บทความ Wikipedia เกี่ยวกับมัลแวร์ Flame สำหรับประวัติเต็ม
2019-2025 — HashClash และ collision ทันที
โครงการ HashClash (Marc Stevens, CWI Amsterdam) ดันการสร้าง MD5 collision ไปยังขีดจำกัดเชิงปฏิบัติต่อ ในปี 2019, chosen-prefix MD5 collision — ที่ผู้โจมตีสามารถเลือก prefix ตามอำเภอใจสำหรับข้อความที่ชนทั้งสอง — สามารถสร้างในวันบนฮาร์ดแวร์ทั่วไป ในปี 2022 การนำไปใช้ที่ปรับลดเรื่องนี้ลงเป็นชั่วโมง ในปี 2024 กระดาษ HashClash แสดง collision ในไม่ถึงนาทีบน GPU สมัยใหม่ตัวเดียว
เส้นทางชัดเจน: การโจมตี MD5 collision ไม่ได้ยากขึ้นเมื่อฮาร์ดแวร์ดีขึ้น — พวกมันง่ายขึ้น สิ่งที่ใช้ cluster ในปี 2004 ใช้ laptop ในปี 2026
SHA-256 — ทำไมมันยืน
SHA-256 เป็นส่วนของตระกูล SHA-2 ออกแบบโดย NSA และเป็นมาตรฐานโดย NIST ในปี 2001 มันผลิต digest 256-bit (32-byte) ไม่มีการโจมตี collision ปฏิบัติได้ต่อ SHA-256 ที่รู้จัก ณ ปี 2026 การโจมตีที่เผยแพร่ที่ดีที่สุดลด work factor ทางทฤษฎีสำหรับการหา collision เป็นประมาณ 2^187 การดำเนินการ — ยังเกินทรัพยากรคำนวณใดที่มีอยู่หรือคาดการณ์ได้
ความปลอดภัยกว้างของ SHA-256 ตั้งใจอนุรักษนิยม แม้หากฮาร์ดแวร์ดีขึ้นด้วยปัจจัยพันล้าน (ประมาณ 30 doubling ในเชิงกฎ Moore), การเจาะ SHA-256 ยังเป็นไปไม่ได้เชิงคำนวณ Work factor 2^18 ถึง 2^23 ของ MD5 สำหรับ collision อยู่ในการเข้าถึงของฮาร์ดแวร์ปานกลางในปี 2004
SHA-256 ยังเร็วกว่าที่คุณคิด: CPU สมัยใหม่รวมคำสั่ง SHA เฉพาะ (Intel SHA Extensions, ARM Cryptography Extensions) ที่อนุญาตให้ software คำนวณ SHA-256 hash หลายล้านครั้งต่อวินาทีต่อ core มันไม่ช้ากว่า MD5 อย่างมีนัยสำคัญสำหรับการใช้งานทั่วไป
เมื่อ MD5 ยังยอมรับได้ (น้อย)
"ถูกเจาะ" ไม่ได้หมายถึง "ไร้ประโยชน์สำหรับทุกวัตถุประสงค์" MD5 ยังยอมรับได้ในบริบทที่:
- ไม่มีผู้ตรงข้าม: การตรวจจับความเสียหายของไฟล์โดยอุบัติเหตุในระบบภายในที่ไว้ใจ — ไม่ใช่การตรวจสอบดาวน์โหลดจากอินเทอร์เน็ต แต่การเช็คว่าการคัดลอกไฟล์เสร็จสมบูรณ์
- ความเร็วสำคัญกว่าความปลอดภัย: การคำนวณคีย์ cache หรือตัวระบุ shard ที่ collision เพียงหมายถึง cache miss ไม่ใช่การฝ่าฝืนความปลอดภัย โมเดลผู้โจมตีไม่มี
- คุณกำลังตรงกับระบบภายนอกที่มีอยู่: API เก่าบางตัวยังส่ง MD5 ETag หรือ checksum คุณสามารถยอมรับและคำนวณ MD5 เพื่อทำงานร่วม ตราบใดที่ไม่ใช้สำหรับการตัดสินใจความปลอดภัย
- การแบ่งพาร์ติชัน hash table: การกระจายข้อมูลข้าม bucket โดย MD5 ของคีย์ Collision ที่นี่ทำให้ไม่สมดุล ไม่ใช่ความล้มเหลวความปลอดภัย
หัวข้อร่วม: MD5 ยอมรับได้เมื่อแอปพลิเคชันไม่พึ่งพาการต้าน collision และไม่มีผู้ตรงข้ามที่สามารถสร้าง input ทันทีที่เงื่อนไขใดเสีย — มีผู้โจมตี หรือ collision = ความล้มเหลวความปลอดภัย — สลับไป SHA-256
ตำนานทั่วไปเกี่ยวกับ MD5
"MD5 โอเคถ้าเพิ่ม salt"
Salting เปลี่ยน input เพื่อให้ผู้ใช้สองคนที่มีรหัสผ่านเดียวกันได้ hash ต่างกัน — มันป้องกันการโจมตี rainbow table แต่ไม่แก้ปัญหา collision ผู้โจมตีที่มี MD5 hash ที่ salt ยังสามารถ brute-force ได้อย่างมีประสิทธิภาพเพราะ MD5 เร็ว: GPU สมัยใหม่คำนวณประมาณ 10-30 พันล้าน MD5 hash ต่อวินาที Salt เพิ่มงานสัดส่วนกับพื้นที่ค้นหา ไม่ใช่กับความยากของอัลกอริทึม
สำหรับการ hash รหัสผ่าน ทั้ง MD5 และ SHA-256 ไม่เหมาะไม่ว่าจะมี salt หรือไม่ ใช้ bcrypt, scrypt หรือ Argon2
"MD5 โอเคเพราะเราใช้ภายในเท่านั้น"
ระบบภายในถูก breach โมเดลภัยคุกคาม "ผู้โจมตีไม่สามารถเข้าถึง input ของเรา" มักถือจนกว่าการโจมตี supply-chain, ภัยคุกคามคนใน หรือการตั้งค่าผิดเปิดเผยระบบ การโจมตี Flame เกิดต่อระบบที่สันนิษฐานว่ามีความมั่นใจคล้ายกันในการควบคุมภายใน
"SHA-256 เกินจำเป็น — MD5 เร็วกว่า"
บนฮาร์ดแวร์สมัยใหม่กับคำสั่งเร่ง SHA, SHA-256 ช้ากว่า MD5 ประมาณ 2-5 เท่า สำหรับการใช้งานส่วนใหญ่ — การตรวจสอบความสมบูรณ์ของไฟล์, signature API, คีย์ cache — ความแตกต่างคือไมโครวินาทีต่อการดำเนินการ ไม่สังเกตเห็นในทางปฏิบัติ ข้อโต้แย้งประสิทธิภาพสำหรับ MD5 เหนือ SHA-256 ถือเฉพาะในสถานการณ์ throughput สูงมากที่แม้ไมโครวินาทียังสำคัญ และแม้นั้นมักมีทางออกดีกว่าการใช้อัลกอริทึมที่ถูกเจาะ
คู่มือการ Migrate — MD5 ไป SHA-256
การ Hash รหัสผ่าน
// ผิด: MD5 สำหรับการ hash รหัสผ่าน
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// เวลาถอดรหัสกับ GPU สมัยใหม่: วินาทีถึงนาที // ผิด: SHA-256 สำหรับการ hash รหัสผ่าน (ยังเร็วเกิน)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');
// ถูก: ใช้ bcrypt, scrypt หรือ Argon2 สำหรับรหัสผ่าน
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12); การ migrate hash รหัสผ่านที่เก็บต้องการวิธีทีละน้อย ในแต่ละการ login สำเร็จ: ตรวจสอบรหัสผ่านกับ MD5 hash ที่มี แล้วรี-hash ทันทีด้วย bcrypt และแทนที่ค่าที่เก็บ ติดธงแต่ละบัญชีว่า migrate แล้ว หลังช่วงเวลาที่สมเหตุสมผล (90 วันเป็นปกติ) บังคับรีเซ็ตรหัสผ่านสำหรับบัญชีใดที่ยังใช้ MD5 hash
ความสมบูรณ์ของไฟล์ / checksum
# Linux: ตรวจสอบการดาวน์โหลดไฟล์
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256
# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso
# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256 การสลับการเช็คความสมบูรณ์ของไฟล์จาก MD5 เป็น SHA-256 มักเป็นการ find-and-replace ง่ายในโค้ด Gotcha สองข้อ: (1) checksum ที่มีอยู่ที่เก็บในฐานข้อมูลหรือไฟล์ต้องคำนวณใหม่และอัปเดต — ไม่มีทางลัด; (2) API ภายนอกหรือระบบเก็บที่ให้ MD5 ETag (เช่นการตั้งค่า S3 บางตัว) ต้องการการประสานเพื่อสลับ
HMAC สำหรับการ Authenticate API
// HMAC-SHA-256 สำหรับการ authenticate ข้อความ
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
.update(message)
.digest('hex'); หากใช้ HMAC-MD5 สำหรับการเซ็น request API, สลับไป HMAC-SHA-256 การก่อสร้าง HMAC เพิ่ม secret key ซึ่งจำกัดการโจมตี MD5 บางตัว แต่ HMAC-MD5 มีจุดอ่อนการขยายความยาวและ primitive พื้นฐานยังถูก compromise มาตรฐานสมัยใหม่ (JWT, AWS SigV4, OAuth 2.0) ทั้งหมดระบุ HMAC-SHA-256 HMAC generator ของ Toova รองรับทั้ง HMAC-SHA-256 และ HMAC-SHA-512 สำหรับการทดสอบ
ลายเซ็นดิจิทัลและ certificate
Certificate ใดที่เซ็นด้วย MD5 ควรออกใหม่ทันที — certificate authority ส่วนใหญ่หยุดออก certificate ที่เซ็นด้วย MD5 หลังปี 2008 และเบราว์เซอร์และระบบปฏิบัติการหลักทั้งหมดปฏิเสธพวกมัน สำหรับ PKI ภายใน, audit การตั้งค่า CA ของคุณและรับประกันว่า SHA-256 เป็นอัลกอริทึม signature ขั้นต่ำที่อนุญาต RSA-SHA256 หรือ ECDSA-SHA256 เป็นมาตรฐานปัจจุบัน
MD5 vs SHA-256 — อ้างอิงด่วน
| คุณสมบัติ | MD5 | SHA-256 |
|---|---|---|
| ความยาว output | 128 bit (32 hex char) | 256 bit (64 hex char) |
| การต้าน Collision | ถูกเจาะ (โจมตีปฏิบัติได้) | ปลอดภัย (ไม่มีการโจมตีรู้จัก) |
| การ Hash รหัสผ่าน | ห้าม | ไม่ (ใช้ bcrypt/Argon2) |
| ลายเซ็นดิจิทัล | ห้าม | ใช่ |
| ความสมบูรณ์ของไฟล์ (ความปลอดภัย) | ห้าม | ใช่ |
| Checksum ที่ไม่เกี่ยวกับความปลอดภัย | ยอมรับได้ (ไม่มีผู้โจมตี) | โอเคเสมอ |
| คีย์ Cache | ยอมรับได้ | โอเคเสมอ |
| การเซ็น certificate TLS | ถูกปฏิเสธโดยเบราว์เซอร์ | มาตรฐาน |
| เข้ากับ FIPS 140-3 | ไม่ (deprecated) | ใช่ |
บทสรุป
MD5 ถูกเจาะเชิงเข้ารหัสตั้งแต่ปี 2004 Chosen-prefix collision — เทคนิคที่ขับเคลื่อนมัลแวร์ Flame — ตอนนี้ถูกเชิงคำนวณ การใช้งานใดที่พึ่งพา MD5 สำหรับความปลอดภัย (signature, การตรวจสอบความสมบูรณ์, การ authenticate) เสี่ยงต่อการโจมตีที่ใช้เวลาคำนวณนาที
SHA-256 ไม่มีการโจมตีปฏิบัติได้ที่รู้จัก, hardware-accelerate บน CPU สมัยใหม่ และเป็นมาตรฐานสำหรับความสมบูรณ์เชิงเข้ารหัสข้าม TLS, การเซ็นโค้ด และการ authenticate API ค่าประสิทธิภาพเทียบกับ MD5 ไม่สำคัญสำหรับการใช้งานเกือบทั้งหมด
เส้นทางการ migrate ตรงไปตรงมา: การเช็คความสมบูรณ์ของไฟล์คือ find-and-replace Signature API ต้องการการประสานการ bump เวอร์ชัน Hash รหัสผ่านต้องการกลยุทธ์รี-hash ทีละน้อยในการ login สำหรับโค้ดใหม่ใดๆ SHA-256 ควรเป็นค่าเริ่มต้น คำนวณและเปรียบเทียบ hash โดยตรงด้วย Toova MD5 และ Toova SHA-256 — หรือสร้างรหัส authenticate HMAC-SHA-256 ด้วย HMAC generator