ข้ามไปยังเนื้อหา
Toova
เครื่องมือทั้งหมด

MD5 vs SHA-256 — ทำไมควรหยุดใช้ MD5

Toova

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