MD5 vs SHA-256 vs SHA-512 — ฟังก์ชัน Hash อธิบาย
ฟังก์ชัน hash อยู่ทุกที่ในการพัฒนาซอฟต์แวร์: การตรวจสอบความสมบูรณ์ของไฟล์, การเก็บรหัสผ่าน, ลายเซ็นดิจิทัล, การ authenticate API, คีย์ cache, การ deduplicate แต่นักพัฒนาส่วนใหญ่ทำงานกับพวกมันเป็น black box — คุณป้อนสตริง, ได้กลับมาเป็น hex digest ความยาวคงที่ รายละเอียดว่า ตัวไหน ของฟังก์ชัน hash ที่ควรใช้ และตัวไหนควรหลีกเลี่ยง กลายเป็นเรื่องที่สำคัญมาก
MD5 ถูกเจาะ SHA-1 deprecated SHA-256 และ SHA-512 ปัจจุบันปลอดภัย SHA-3 มีอยู่หากต้องการ future-proof แต่ "ถูกเจาะ" ไม่ได้หมายถึงสิ่งเดียวกันในทุกบริบท — MD5 โอเคสำหรับบางการใช้งานและผิดอย่างเลวร้ายสำหรับอื่นๆ คู่มือนี้อธิบายคุณสมบัติที่สำคัญ, แต่ละฟังก์ชันยืนกับพวกมันอย่างไร และให้กรอบการตัดสินใจที่ชัดเจนสำหรับการเลือก hash ที่เหมาะในปี 2026
ฟังก์ชัน Hash ทำอะไรจริงๆ
ฟังก์ชัน hash เชิงเข้ารหัสแปลง input ความยาวใดๆ เป็น output ความยาวคงที่ (digest หรือ hash) สามคุณสมบัตินิยามฟังก์ชัน hash ที่ ปลอดภัยเชิงเข้ารหัส:
- การต้าน Preimage — ให้ hash
hควรเป็นไปไม่ได้เชิงคำนวณที่จะหา inputmใดที่hash(m) = hนี่คือคุณสมบัติ "ทางเดียว" - การต้าน Second Preimage — ให้ input
m1ควรเป็นไปไม่ได้ที่จะหา input ต่างm2ที่hash(m1) = hash(m2) - การต้าน Collision — ควรเป็นไปไม่ได้ที่จะหา input ที่แตกต่างกัน สองตัวใดๆ
m1และm2ที่hash(m1) = hash(m2)
ฟังก์ชันที่ล้มเหลวในคุณสมบัติเหล่านี้ถือว่าถูกเจาะสำหรับการใช้งานเชิงเข้ารหัส หมายเหตุ "ไม่สามารถปฏิบัติได้" มีความหมายเฉพาะที่นี่: ไม่ได้หมายถึงเป็นไปไม่ได้ทางคณิตศาสตร์ แต่หมายถึงต้องการการคำนวณมากกว่าที่ปฏิบัติได้กับฮาร์ดแวร์ปัจจุบันหรือที่คาดการณ์ได้
เพิ่มเติม ฟังก์ชัน hash เชิงเข้ารหัสแสดง avalanche effect: การเปลี่ยน bit เดียวใน input ผลิต output ที่ต่างประมาณครึ่งของ bit ของมัน นี่รับประกันว่า input คล้ายกันผลิต digest ที่ต่างกันสิ้นเชิง
Input: "hello"
MD5: 5d41402abc4b2a76b9719d911017c592 (128-bit / 32 hex chars)
Input: "Hello"
MD5: 8b1a9953c4611296a827abf8c47804d7 (เปลี่ยนตัวอักษรเดียว = output ต่างกันสิ้นเชิง) MD5 — เร็ว, แพร่หลายและถูกเจาะ
ประวัติและการออกแบบ
MD5 (Message Digest 5) ออกแบบโดย Ron Rivest ในปี 1991 และผลิต digest 128-bit (16-byte) ในช่วงทศวรรษ 1990 ส่วนใหญ่ มันเป็นตัวเลือกมาตรฐานสำหรับการตรวจสอบความสมบูรณ์ของไฟล์, การเซ็น certificate และการ hash รหัสผ่าน เร็วมาก — CPU สมัยใหม่สามารถคำนวณ MD5 hash หลายสิบล้านครั้งต่อวินาที และ GPU สามารถคำนวณได้หลายพันล้าน
ทำไม MD5 ถูกเจาะ
ในปี 2004, Xiaoyun Wang และทีมแสดงการโจมตี collision ที่ปฏิบัติได้กับ MD5 — ไฟล์สองชุดที่ต่างกันที่ผลิต MD5 hash เดียวกัน การโจมตีรันในไม่กี่นาทีบนฮาร์ดแวร์ของผู้บริโภค ในปี 2008 นักวิจัยสร้าง certificate CA ปลอมโดยใช้ MD5 collision แสดงว่าโครงสร้างพื้นฐาน PKI โลกจริงเสี่ยง ในปี 2012 มัลแวร์ Flame ใช้ MD5 collision เพื่อปลอม certificate การเซ็นโค้ด Microsoft
NIST ประกาศ deprecate MD5 อย่างเป็นทางการสำหรับการใช้งานเชิงเข้ารหัสส่วนใหญ่ Certificate authority หยุดออก certificate ที่เซ็นด้วย MD5 ภายในปี 2009 ผู้จำหน่ายเบราว์เซอร์เอาการรองรับ signature certificate MD5 ออกประมาณปี 2011
เมื่อ MD5 ยังยอมรับได้
MD5 ไม่ใช่ไม่มีประโยชน์เลยทั่วโลก สำหรับ checksum ที่ไม่เกี่ยวกับความปลอดภัย — การตรวจจับการเสียหายของข้อมูลโดยอุบัติเหตุในการโอนไฟล์, การที่อยู่ตามเนื้อหาในระบบ cache ที่ผู้โจมตีไม่สามารถมีอิทธิพลต่อ input หรือการสร้าง identifier เฉพาะตัวในระบบภายในที่ปิด — MD5 ยังเพียงพอ การทดสอบหลัก: หากผู้โจมตีสามารถได้ประโยชน์จากการสร้าง collision อย่าใช้ MD5 หากความเสียหายโดยอุบัติเหตุเท่านั้นที่สำคัญ MD5 ก็โอเค
- ปลอดภัย: การ deduplicate ภายใน, คีย์ cache, การตรวจจับการเปลี่ยนแปลงไฟล์ที่ไม่เกี่ยวกับความปลอดภัย
- ไม่ปลอดภัย: certificate, ลายเซ็นดิจิทัล, การ hash รหัสผ่าน, การตรวจสอบความแท้ของไฟล์, token ความปลอดภัย
SHA-1 — Deprecated, ยังไม่ตาย
SHA-1 ผลิต digest 160-bit และเป็นผู้สืบทอด MD5 มันยังเป็นมาตรฐานสำหรับการเซ็น certificate และการเซ็นโค้ดในช่วงทศวรรษ 2000 ส่วนใหญ่ ในปี 2017 การโจมตี SHAttered แสดง SHA-1 collision ที่ปฏิบัติได้ครั้งแรก ผลิตไฟล์ PDF สองชุดที่ต่างกันด้วย SHA-1 hash เหมือนกันโดยใช้การคำนวณประมาณ 110 GPU-year — แพงแต่อยู่ในงบของรัฐและเข้าถึงได้ง่ายขึ้น
SHA-1 ถูก deprecate โดย NIST และ certificate authority หลักทุกตัว ไม่ควรใช้สำหรับ certificate, การเซ็นโค้ด หรือการใช้งานที่ละเอียดอ่อนด้านความปลอดภัยใหม่ใดๆ ระบบเก่าบางตัวยังใช้ SHA-1 ภายใน แต่การ migrate ไป SHA-256 ขอแนะนำอย่างยิ่ง Git ยังใช้ SHA-1 สำหรับการที่อยู่ object (แม้ว่าการเปลี่ยน SHA-256 กำลังดำเนินอยู่) แต่นี่กำลังถูกยกเลิก
SHA-256 — มาตรฐานปัจจุบัน
SHA-256 เป็นส่วนของตระกูล SHA-2 ออกแบบโดย NSA และเป็นมาตรฐานโดย NIST ใน FIPS 180-4 มันผลิต digest 256-bit (32-byte) SHA-256 ถูกวิเคราะห์อย่างเข้มข้นตั้งแต่การเผยแพร่ในปี 2001 และไม่มีการโจมตีที่ปฏิบัติได้ มันเป็นมาตรฐาน de facto สำหรับ:
- TLS certificate (โดยพื้นฐานทุก certificate ที่ออกวันนี้ใช้ SHA-256)
- การเซ็นโค้ด (Windows Authenticode, การ notarize Apple, JAR)
- HMAC-SHA256 สำหรับการ authenticate API (AWS Signature v4, การตรวจสอบ webhook GitHub)
- Signature token JWT (HS256 และ RS256 ทั้งคู่ใช้ SHA-256 ภายใน)
- ID transaction blockchain (Bitcoin ใช้ double-SHA256)
- การตรวจสอบความสมบูรณ์ของไฟล์ใน package manager (npm, pip, apt)
Input: "hello"
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
(256-bit / 64 hex chars)
SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d
99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
(512-bit / 128 hex chars) ประสิทธิภาพของ SHA-256
SHA-256 ใช้การดำเนินการ word 32-bit ภายใน บนฮาร์ดแวร์ 32-bit หรือ CPU เก่าโดยไม่มี hardware acceleration มันช้ากว่า MD5 อย่างเห็นได้ชัด บน CPU 64-bit สมัยใหม่กับส่วนขยาย SHA (Intel Goldmont+, AMD Zen+, Apple Silicon, ARM Cortex-A57+), SHA-256 ถูก hardware-accelerate และเร็วมาก — มักใกล้ความเร็ว MD5 สภาพแวดล้อมเซิร์ฟเวอร์ส่วนใหญ่มี hardware acceleration ดังนั้นในทางปฏิบัติ SHA-256 เร็วพอสำหรับการใช้งานแทบทุกตัว
SHA-512 — กว้างกว่า, บางครั้งเร็วกว่า
SHA-512 ผลิต digest 512-bit (64-byte) โดยใช้การดำเนินการ word 64-bit ภายใน บนฮาร์ดแวร์ 64-bit ที่ไม่มีส่วนขยาย SHA, SHA-512 อาจเร็วกว่า SHA-256 จริงเพราะการดำเนินการ 64-bit ใช้ความกว้าง register สมัยใหม่ได้ดีกว่า บนฮาร์ดแวร์ที่มีส่วนขยาย SHA, SHA-256 มักเร็วกว่าเพราะส่วนขยายถูกปรับเฉพาะสำหรับ SHA-256
SHA-512 ให้ความปลอดภัยกว้างกว่า — การต้าน collision 256-bit เทียบกับ 128-bit สำหรับ SHA-256 สำหรับโมเดลภัยคุกคามปัจจุบันส่วนใหญ่ การต้าน collision 128-bit ของ SHA-256 เกินพอ (การเจาะมันต้องการประมาณการดำเนินการ 2^128) SHA-512 เหมาะเมื่อ:
- คุณเป้าหมายเซิร์ฟเวอร์ 64-bit และต้องการ throughput สูงสุดโดยไม่มีส่วนขยายฮาร์ดแวร์
- คุณต้องการ digest ยาวขึ้นเป็นวัสดุคีย์สำหรับการดำเนินการเชิงเข้ารหัสอื่น
- คุณต้องการความปลอดภัยกว้างขึ้นสำหรับข้อมูลที่ต้องคงป้องกันได้ทศวรรษ
- คุณกำลังนำโปรโตคอลไปใช้ที่เรียก SHA-512 เฉพาะ (เช่น TLS cipher suite บางตัว)
SHA-384 และ SHA-512/256
SHA-384 เป็นเวอร์ชันตัดของ SHA-512 ผลิต 384 bit — มีประโยชน์เมื่อต้องการการดำเนินการภายใน 64-bit ของ SHA-512 แต่ต้องการ output สั้นกว่า SHA-512/256 เป็นอีกตัวแปรตัดที่ผลิต output 256-bit โดยใช้การคำนวณภายในของ SHA-512 SHA-512/256 ต้านการโจมตี length extension ที่กระทบ SHA-256 ทำให้มีประโยชน์ในบริบทที่ length extension เป็นความกังวล (แม้ว่า HMAC จะลดเรื่องนี้ในสถานการณ์ปฏิบัติส่วนใหญ่)
SHA-3 — สถาปัตยกรรมต่าง, Future-Proof
SHA-3 (เป็นมาตรฐานใน NIST FIPS 202 ปี 2015) ใช้ Keccak sponge construction — การออกแบบที่ต่างจากโครงสร้าง Merkle-Damgard ของ SHA-2 โดยพื้นฐาน นี่สำคัญเพราะจุดอ่อนใดในอนาคตที่พบในการออกแบบ Merkle-Damgard จะกระทบ MD5, SHA-1 และ SHA-2 พร้อมกัน ในขณะที่ SHA-3 จะไม่ถูกกระทบ
SHA-3 ปัจจุบันปลอดภัยและเป็นตัวเลือกที่ถูกสำหรับระบบใหม่ที่ต้องการการรับประกันระยะยาวหรือต้องการป้องกันความเสี่ยงต่อจุดอ่อน SHA-2 ในอนาคต มันช้ากว่า SHA-256 ในการนำไปใช้ software บริสุทธิ์ ที่ SHA-3 โดดเด่นคือในการนำไปใช้ฮาร์ดแวร์ — การออกแบบของมันมีประสิทธิภาพมากใน silicon SHA-3-256 และ SHA-3-512 ผลิตขนาด digest เดียวกันกับตัว SHA-2 ที่สอดคล้อง
ตารางเปรียบเทียบ
| อัลกอริทึม | Output | ต้าน Collision | สถานะ | ความเร็ว (SW) | ใช้สำหรับรหัสผ่าน? |
|---|---|---|---|---|---|
| MD5 | 128-bit | ถูกเจาะ | Deprecated | เร็วมาก | ไม่ |
| SHA-1 | 160-bit | ถูกเจาะ | Deprecated | เร็ว | ไม่ |
| SHA-256 | 256-bit | 128-bit | มาตรฐานปัจจุบัน | เร็ว (HW accel) | ไม่ (เร็วเกิน) |
| SHA-512 | 512-bit | 256-bit | ปลอดภัย | เร็วบน 64-bit | ไม่ (เร็วเกิน) |
| SHA-3-256 | 256-bit | 128-bit | Future-proof | ปานกลาง (SW) | ไม่ (เร็วเกิน) |
| bcrypt | สตริง 60 ตัว | N/A | รหัสผ่านเท่านั้น | ช้าโดยตั้งใจ | ใช่ |
การ Hash รหัสผ่าน: ปัญหาที่ต่างกันโดยสิ้นเชิง
เรื่องนี้ควรมีหัวข้อของตัวเองเพราะเป็นหนึ่งในข้อผิดพลาดที่นักพัฒนาทำบ่อยที่สุด SHA-256 เป็นเครื่องมือที่ถูกสำหรับการตรวจสอบความสมบูรณ์ของไฟล์, การเซ็น API และการตรวจสอบ certificate มันเป็นเครื่องมือที่ผิดสำหรับการ hash รหัสผ่าน และการใช้สำหรับวัตถุประสงค์นั้นทำให้เกิดเหตุการณ์ความปลอดภัยจริง
ปัญหาคือความเร็ว SHA-256 ออกแบบให้เร็ว — GPU สมัยใหม่สามารถคำนวณ SHA-256 hash หลายพันล้านครั้งต่อวินาที ผู้โจมตีที่ได้ฐานข้อมูลรหัสผ่านที่ hash แล้วของคุณสามารถพยายามเดารหัสผ่านหลายพันล้านครั้งต่อวินาที แม้รหัสผ่านยาวสุ่มสามารถถูกถอดรหัสรวดเร็วหาก hash เร็ว
// ห้ามทำเช่นนี้สำหรับรหัสผ่าน
const hash = crypto.createHash('sha256').update(password).digest('hex'); // ใช้ bcrypt, scrypt หรือ Argon2 สำหรับรหัสผ่าน
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12); // cost factor 12 เครื่องมือ Bcrypt Test ให้คุณ hash และตรวจสอบรหัสผ่าน bcrypt ในเบราว์เซอร์ สำหรับการเข้าใจ cost factor bcrypt และเวลาคำนวณ มันเป็นอ้างอิงที่มีประโยชน์เมื่อตั้งค่า work factor ของแอปพลิเคชันของคุณ
HMAC: เพิ่มการ Authenticate ให้ Hash
Hash ธรรมดาไม่พิสูจน์อะไรเกี่ยวกับผู้คำนวณ — ใครก็ตามที่มีข้อมูลสามารถคำนวณ SHA-256 hash เดียวกัน HMAC (Hash-based Message Authentication Code) เพิ่ม secret key เข้าการคำนวณ ผลิต tag ที่สามารถสร้างซ้ำได้โดยใครก็ตามที่รู้คีย์ HMAC-SHA256 เป็นมาตรฐานสำหรับ:
- การตรวจสอบ signature webhook (GitHub, Stripe, Shopify ทั้งหมดใช้ HMAC-SHA256)
- AWS Signature Version 4 (การเซ็น request)
- JWT HS256 token (HMAC-SHA256 ของ header + payload)
- ความสมบูรณ์ของ cookie (การเซ็น session cookie เพื่อป้องกันการแก้ไข)
const crypto = require('crypto');
// เซ็นข้อความด้วย HMAC-SHA256
const mac = crypto
.createHmac('sha256', secretKey)
.update(message)
.digest('hex');
// ตรวจสอบ: เปรียบเทียบในเวลาคงที่ (ป้องกัน timing attack)
const isValid = crypto.timingSafeEqual(
Buffer.from(mac, 'hex'),
Buffer.from(received, 'hex')
);
หมายเหตุการใช้ timingSafeEqual สำหรับการเปรียบเทียบ การเปรียบเทียบค่า MAC ด้วยการเช็คความเท่ากันสตริงปกติรั่วข้อมูลเวลาที่ใช้ประโยชน์ได้ใน timing attack ใช้ฟังก์ชันการเปรียบเทียบในเวลาคงที่เสมอเมื่อตรวจสอบ MAC ใช้ HMAC Generator คำนวณค่า HMAC-SHA256 สำหรับการทดสอบและดีบักโดยไม่เขียนโค้ด
คำแนะนำในโลกจริง
ความสมบูรณ์ของไฟล์ทั่วไป (checksum)
ใช้ SHA-256 เป็นมาตรฐานสำหรับการตรวจสอบ package (npm lockfile, pip requirement hash, layer Docker image) เครื่องมือ SHA-256 Hash คำนวณ digest SHA-256 ในเบราว์เซอร์สำหรับ input ข้อความหรือค่าสตริง สำหรับ checksum ที่ไม่เกี่ยวกับความปลอดภัยด่วนที่ความเร็วสำคัญและคุณไว้ใจแหล่ง MD5 ยังยอมรับได้แต่ SHA-256 ดีกว่าในบริบทใดที่แชร์หรืออัตโนมัติ
TLS certificate และการเซ็นโค้ด
SHA-256 เป็นมาตรฐานที่ต้องการ Certificate authority ทุกตัวออก certificate SHA-256 อย่าใช้ MD5 หรือ SHA-1 สำหรับ certificate ใหม่ — พวกมันจะถูกปฏิเสธโดยเบราว์เซอร์และระบบปฏิบัติการสมัยใหม่
การ Authenticate API
ใช้ HMAC-SHA256 เป็นมาตรฐานที่กำหนด, รองรับดีในทุกภาษา และอัลกอริทึมที่คาดหวังโดยเอกสารความปลอดภัย API ส่วนใหญ่ คำนวณ digest ด้วยเครื่องมือ MD5 Hash หรือ SHA-256 Hash สำหรับการเปรียบเทียบด่วน และสร้าง HMAC signature ด้วย HMAC Generator
การ Hash รหัสผ่าน
ใช้ bcrypt (cost factor 12+), scrypt หรือ Argon2id อย่าใช้ MD5, SHA-1, SHA-256 หรือ SHA-512 โดยตรงสำหรับรหัสผ่าน แม้กับการ salt เครื่องมือ Bcrypt Test ช่วยคุณตรวจสอบ bcrypt hash ระหว่างการพัฒนา
ข้อมูลอายุยาวที่ต้องการความปลอดภัยทศวรรษ
เลือก SHA-512 หรือ SHA-3-256 ขนาด digest กว้างกว่าให้ความปลอดภัยเพิ่มต่อการก้าวหน้าใน cryptanalysis NIST แนะนำ SHA-512 และ SHA-3 สำหรับการใช้งานที่ต้องการความปลอดภัยระยะยาว ดูคำแนะนำอย่างเป็นทางการใน NIST FIPS 180-4 สำหรับข้อกำหนดอำนาจของอัลกอริทึม SHA-2
ระบบใหม่โดยไม่มีข้อจำกัด legacy
SHA-256 สำหรับการใช้งานทั่วไป Argon2id สำหรับรหัสผ่าน HMAC-SHA256 สำหรับรหัส authenticate หากต้องการ future-proof และยอมรับประสิทธิภาพต่ำเล็กน้อย SHA-3-256 เป็นทางเลือกที่แข็งแกร่งสำหรับ SHA-256 สำหรับการ hash วัตถุประสงค์ทั่วไป