การแฮชและความถูกต้องครบถ้วนของข้อมูล
เรียนรู้ว่า SHA-256, MD5 และ HMAC สร้างค่าไดเจสต์ที่มีความยาวคงที่เพื่อตรวจสอบว่าข้อมูลไม่ได้ถูกแก้ไขระหว่างการส่งหรือการจัดเก็บได้อย่างไร
การแฮชและความถูกต้องครบถ้วนของข้อมูล เป็นบทเรียน Security+ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Security+ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Security+ Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันแฮชคืออะไร
ฟังก์ชันแฮชเชิงเข้ารหัส คืออัลกอริทึมทางคณิตศาสตร์ที่รับ input ขนาดใดก็ได้และสร้าง output ที่มีความยาวคงที่ เรียกว่า hash, ไดเจสต์ หรือ ลายนิ้วมือ ฟังก์ชันแฮชเป็นการทำงานทางเดียว กล่าวคือ เมื่อมี hash แล้ว ควรเป็นไปไม่ได้ในทางปฏิบัติด้านการคำนวณที่จะระบุ input เดิมได้ ฟังก์ชันเหล่านี้ให้ผลแน่นอน คือ input เดิมจะสร้าง hash เดิมเสมอ ฟังก์ชันแฮชเป็นพื้นฐานของ การตรวจสอบความถูกต้องครบถ้วนของข้อมูล ลายเซ็นดิจิทัล การจัดเก็บรหัสผ่าน และกลไกความปลอดภัยอื่น ๆ อีกมากมาย
คุณสมบัติของฟังก์ชันแฮชที่ปลอดภัย
ฟังก์ชันแฮชเชิงเข้ารหัสที่ปลอดภัยต้องมีคุณสมบัติสำคัญสี่ประการ ความต้านทานต่อการหาอินพุตต้นทาง: เมื่อกำหนด hash output มาให้ จะไม่สามารถค้นหา input ใด ๆ ที่สร้างผลลัพธ์นั้นได้ในทางปฏิบัติด้านการคำนวณ ความต้านทานต่อการหาอินพุตต้นทางลำดับที่สอง: เมื่อกำหนด input มาให้ จะไม่สามารถค้นหา input อื่นที่มี hash เดียวกันได้โดยง่าย ความต้านทานต่อการชนกัน: จะไม่สามารถค้นหา input ที่แตกต่างกันสองค่าและทำให้เกิด hash output เดียวกันได้โดยง่าย ผลกระทบแบบ Avalanche: การเปลี่ยน input แม้เพียง bit เดียวทำให้ hash output แตกต่างไปโดยสิ้นเชิง จึงตรวจจับการแก้ไขได้
# Avalanche effect demonstration
echo -n 'Hello' | sha256sum
# 185f8db32... (completely different when one char changes)
echo -n 'Hello!' | sha256sum
# 334d016f7... (entirely different hash)
# Same input ALWAYS produces same hash (deterministic)
echo -n 'Security+' | sha256sum
echo -n 'Security+' | sha256sum
# Both outputs are identicalMD5: ถูกทำลายและเลิกใช้แล้ว
MD5 (Message Digest 5) สร้าง hash ขนาด 128 บิต และเคยถูกใช้อย่างแพร่หลาย อย่างไรก็ตาม นักวิจัยได้แสดงให้เห็นถึง การโจมตีด้วยการชนกัน ต่อ MD5 ในปี 2004 ซึ่งหมายความว่าสามารถค้นหา input สองค่าที่แตกต่างกันแต่มี hash เดียวกันได้ นี่เป็นหายนะต่อการตรวจสอบความถูกต้องครบถ้วน เพราะผู้โจมตีอาจแทนที่ file ที่เป็นอันตรายด้วย hash MD5 เดียวกับต้นฉบับ MD5 ถูกทำลายอย่างสมบูรณ์สำหรับความปลอดภัยเชิงเข้ารหัส และห้ามใช้เพื่อตรวจสอบความถูกต้องครบถ้วน ลายเซ็นดิจิทัล หรือการแฮชรหัสผ่าน บางครั้งยังพบการใช้ MD5 สำหรับ checksum ที่ไม่เกี่ยวกับความปลอดภัย (การตรวจสอบ file แบบเดิม) ซึ่งยอมรับได้เฉพาะสำหรับตรวจจับความเสียหายจากอุบัติเหตุเท่านั้น
ตระกูล SHA: SHA-1, SHA-256, SHA-3
ตระกูล Secure Hash Algorithm (SHA) เป็นชุดฟังก์ชันแฮชที่สำคัญที่สุดสำหรับ Security+ SHA-1 (160 บิต) เคยเป็นมาตรฐานมาหลายปี แต่ถูกทำลายด้วยการโจมตีด้วยการชนกันที่ใช้งานได้จริงในปี 2017 (โครงการ SHAttered ของ Google) และปัจจุบันเลิกใช้แล้ว SHA-256 (เป็นส่วนหนึ่งของตระกูล SHA-2 และมี output ขนาด 256 บิต) เป็นมาตรฐานอุตสาหกรรมในปัจจุบันสำหรับลายเซ็นดิจิทัล ใบรับรอง TLS และการตรวจสอบความถูกต้องครบถ้วนของ file SHA-3 (Keccak) เป็นอัลกอริทึมทางเลือกของ NIST ที่ต้านทานการโจมตีซึ่งมุ่งเป้าไปที่โครงสร้างของ SHA-2 ได้ แม้ว่า SHA-256 ยังคงเป็นตัวเลือกหลักสำหรับแอปพลิเคชันส่วนใหญ่
# Common hash computations
echo -n 'password123' | sha256sum
# a665a4592...64 hex chars = 256 bits
echo -n 'password123' | sha512sum
# b109f3bb...128 hex chars = 512 bits (SHA-512)
# File integrity check
sha256sum /path/to/downloaded_file.iso > file.sha256
sha256sum -c file.sha256
# file.iso: OKฟังก์ชันแฮชสำหรับการจัดเก็บรหัสผ่าน
การจัดเก็บรหัสผ่านเป็นข้อความธรรมดาไม่สามารถยอมรับได้ไม่ว่าในกรณีใด เมื่อผู้ใช้สร้างรหัสผ่าน ระบบจะจัดเก็บ hash ไว้ในฐานข้อมูลแทนตัวรหัสผ่าน เมื่อผู้ใช้เข้าสู่ระบบ รหัสผ่านที่ป้อนจะถูกนำไปสร้าง hash แล้วเปรียบเทียบกับ hash ที่จัดเก็บไว้ อย่างไรก็ตาม SHA-256 มาตรฐานเร็วเกินไปสำหรับการจัดเก็บรหัสผ่าน ผู้โจมตีใช้ GPU ทดสอบ hash ได้หลายพันล้านค่าต่อวินาทีจากฐานข้อมูลรหัสผ่านที่ถูกขโมย ฟังก์ชัน การแฮชรหัสผ่าน ที่ออกแบบมาโดยเฉพาะ เช่น bcrypt, PBKDF2 และ Argon2 จะเพิ่มต้นทุนการคำนวณ (ปัจจัยด้านงาน) และข้อกำหนดด้านหน่วยความจำ ทำให้การถอดรหัสจำนวนมากทำได้ยากในทางปฏิบัติ
# bcrypt hash example (Python-style pseudocode)
import bcrypt
password = b'mySecretPassword'
# Hash with work factor of 12 (2^12 = 4096 iterations)
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
# Stored in DB: $2b$12$H0qS/LkPkAiH8KlxJb3lFuK...
# Verify (never compare raw hashes for bcrypt)
bcrypt.checkpw(password, hashed) # Returns Trueการเติม Salt: ป้องกันตาราง Rainbow
ตาราง rainbow คือตารางค้นหาที่คำนวณไว้ล่วงหน้า ซึ่งจับคู่รหัสผ่านที่พบบ่อยกับ hash ของรหัสผ่านเหล่านั้น ทำให้ผู้โจมตีค้นหา hash และพบรหัสผ่านต้นฉบับได้ทันที เพื่อป้องกันตาราง rainbow ต้องมีการ เติม salt ให้กับ hash ของรหัสผ่าน salt คือค่าสุ่มที่เติมลงในรหัสผ่านก่อนการแฮช ทำให้ hash ของผู้ใช้แต่ละรายไม่ซ้ำกัน แม้ว่าผู้ใช้สองรายจะมีรหัสผ่านเดียวกันก็ตาม ระบบจะจัดเก็บ salt ไว้คู่กับ hash (ไม่จำเป็นต้องเก็บเป็นความลับ) แม้ผู้โจมตีจะมีฐานข้อมูลรหัสผ่านทั้งหมดของคุณ ตาราง rainbow ที่คำนวณไว้ล่วงหน้าก็ไร้ประโยชน์ เพราะ hash แต่ละค่าถูกสร้างโดยใช้ salt ที่แตกต่างกัน
# Salt demonstration
# Without salt: same password = same hash (rainbow table attack works)
# SHA256('password123') = always the same hash
# With salt: same password + random salt = unique hash
# SHA256('password123' + 'aBc8xZ') = unique hash for this user
# SHA256('password123' + 'mK2pYq') = completely different hash
# The salt is stored in the database alongside the hashed value
# Format: $salt$hash or combined as in bcrypt outputHMAC: เพิ่มการยืนยันตัวตนให้การแฮช
HMAC (Hash-based Message Authentication Code) คือโครงสร้างที่ใช้ฟังก์ชันแฮชร่วมกับคีย์ลับเพื่อสร้างรหัสยืนยันตัวตน ต่างจาก hash ธรรมดา ตรงที่ HMAC สามารถคำนวณและตรวจสอบได้เฉพาะฝ่ายที่รู้คีย์ลับเท่านั้น จึงให้ทั้ง ความถูกต้องครบถ้วน (ตรวจจับการเปลี่ยนแปลง) และ การยืนยันตัวตน (พิสูจน์ว่าข้อความมาจากผู้ที่มีคีย์) HMAC-SHA256 ถูกใช้อย่างแพร่หลายในการยืนยันตัวตนของ API (การลงนามคำขอ API) โทเค็น JWT และการดำเนินการ MAC ของ TLS โดยป้องกันไม่ให้ผู้โจมตีที่ดักจับข้อความแทนที่ข้อความนั้นด้วยข้อความทางเลือกที่สร้างขึ้น
# Compute HMAC-SHA256 with OpenSSL
openssl dgst -sha256 -hmac 'my-secret-api-key' -hex api_request.json
# Output: HMAC-SHA256(api_request.json)= 3d4e2f...
# Only someone with 'my-secret-api-key' can generate or verify this HMAC
# Used in AWS Signature V4 for API authentication
# Used in JWT HS256 algorithm for token integrityฟังก์ชันแฮชในลายเซ็นดิจิทัล
ฟังก์ชันแฮชมีบทบาทสำคัญในลายเซ็นดิจิทัล เมื่อต้องลงนามเอกสารขนาดใหญ่ คุณจะไม่เข้ารหัสเอกสารทั้งฉบับด้วยคีย์ส่วนตัว เพราะจะช้ามาก แต่จะดำเนินการดังนี้: (1) คำนวณ hash ของเอกสาร (ทำได้รวดเร็วและสร้างไดเจสต์ขนาดเล็กที่มีความยาวคงที่) จากนั้น (2) ลงนาม hash ขนาดเล็กนั้นด้วยคีย์ส่วนตัว ลายเซ็นก็คือ hash ที่ถูกเข้ารหัสนั่นเอง การตรวจสอบใช้รูปแบบเดียวกัน: ถอดรหัสลายเซ็นเพื่อรับ hash สร้าง hash ของเอกสารแยกกัน แล้วเปรียบเทียบกัน SHA-256 เป็นข้อบังคับในใบรับรอง PKI สมัยใหม่ทั้งหมด ส่วน SHA-1 ห้ามใช้ในใบรับรองใหม่
การตรวจสอบความถูกต้องครบถ้วนของ File (FIM)
การตรวจสอบความถูกต้องครบถ้วนของ File (FIM) ใช้ฟังก์ชันแฮชเพื่อตรวจจับการเปลี่ยนแปลงที่ไม่ได้รับอนุญาตใน file ระบบที่สำคัญ ในขั้นตั้งต้น เครื่องมือ FIM จะสร้าง hash ของ file ที่ติดตามทั้งหมดและจัดเก็บ hash เหล่านั้นอย่างปลอดภัย จากนั้นจะสร้าง hash ของ file ใหม่เป็นระยะ ๆ (หรืออย่างต่อเนื่อง) และเปรียบเทียบกับค่าตั้งต้น หากไม่ตรงกัน แสดงว่า file ถูกแก้ไข ซึ่งอาจเกิดจากมัลแวร์หรือการดำเนินการของผู้ดูแลระบบที่ไม่ได้รับอนุญาต เครื่องมือ FIM เช่น Tripwire, AIDE (Linux) และเครื่องมือตรวจสอบความถูกต้องครบถ้วนในตัวของ Windows ใช้ hash SHA-256 กรอบการปฏิบัติตามข้อกำหนด เช่น PCI-DSS กำหนดให้ใช้ FIM เพื่อปกป้องสภาพแวดล้อมข้อมูลผู้ถือบัตร
# AIDE (Advanced Intrusion Detection Environment) - Linux FIM
# Initialize baseline database
aide --init
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# Check for changes (run via cron daily)
aide --check
# Output shows any files that were added, changed, or deleted
# File: /etc/passwd changed
# MD5 : old_hash != new_hashChecksum เทียบกับ Hash เชิงเข้ารหัส
สิ่งสำคัญคือต้องแยกความแตกต่างระหว่าง checksum กับ hash เชิงเข้ารหัส Checksum เช่น CRC32 ออกแบบมาเพื่อตรวจจับความเสียหายของข้อมูลโดยบังเอิญระหว่างการส่งข้อมูล ทำงานรวดเร็วและเรียบง่าย แต่ผู้โจมตีสามารถปลอมแปลงได้ง่าย ส่วน hash เชิงเข้ารหัส (SHA-256) ออกแบบให้ต้านทานการชนกันและแสดงให้เห็นการแก้ไข แม้ต้องเผชิญกับการดัดแปลงโดยผู้ประสงค์ร้าย ใช้ checksum เมื่อคุณต้องการเพียงตรวจสอบว่าไฟล์ดาวน์โหลดไม่เสียหายระหว่างการส่ง ใช้ hash เชิงเข้ารหัสเมื่อต้องตรวจสอบว่า file ไม่ได้ถูกฝ่ายตรงข้ามแก้ไขโดยเจตนา
การโจมตีด้วยการชนกันของ Hash ในทางปฏิบัติ
การโจมตีด้วยการชนกันของ Hash ส่งผลกระทบในโลกจริง ในปี 2017 นักวิจัยสร้าง file PDF สองไฟล์ที่มี hash SHA-1 เดียวกัน ซึ่งแสดงให้เห็นว่าใบรับรอง SHA-1 สามารถปลอมแปลงได้ ในปี 2008 นักวิจัยใช้การชนกันของ MD5 เพื่อสร้างใบรับรอง CA ปลอมที่ดูเหมือนถูกต้อง การโจมตีเหล่านี้เป็นเหตุผลที่เบราว์เซอร์ปฏิเสธใบรับรอง MD5 และ SHA-1 และเป็นเหตุผลที่ผู้ออกใบรับรองต้องใช้ SHA-256 เป็นอย่างน้อย การเข้าใจการโจมตีด้วยการชนกันจะช่วยให้คุณอธิบายได้ว่าเหตุใดจึงตัดสินใจเลิกใช้อัลกอริทึม และเหตุใดคำกล่าวว่า “แต่ยังสร้าง hash ได้อยู่” จึงไม่ใช่เหตุผลที่เพียงพอสำหรับการใช้อัลกอริทึมที่ถูกทำลายแล้ว
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจแนวคิด CompTIA Security+ (SY0-701) จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า ฟังก์ชันแฮช สร้างไดเจสต์ที่มีความยาวคงที่เพื่อใช้ตรวจสอบความถูกต้องครบถ้วน MD5 และ SHA-1 ถูกทำลายและเลิกใช้แล้ว SHA-256 เป็นมาตรฐานปัจจุบัน การเติม salt ป้องกันการโจมตีด้วยตาราง rainbow และ HMAC เพิ่มการยืนยันตัวตนให้การแฮชโดยใช้คีย์ลับร่วมกัน บทถัดไปเราจะสำรวจเรื่อง การแลกเปลี่ยนคีย์และการเข้ารหัสแบบผสม
คำถามที่พบบ่อย
บทเรียน “การแฮชและความถูกต้องครบถ้วนของข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแฮชและความถูกต้องครบถ้วนของข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Security+ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Security+ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแฮชและความถูกต้องครบถ้วนของข้อมูล”
เรียนรู้ว่า SHA-256, MD5 และ HMAC สร้างค่าไดเจสต์ที่มีความยาวคงที่เพื่อตรวจสอบว่าข้อมูลไม่ได้ถูกแก้ไขระหว่างการส่งหรือการจัดเก็บได้อย่างไร คุณปฏิบัติ Security+ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Security+ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Security+ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การแฮชและความถูกต้องครบถ้วนของข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Security+ Academy นี้ได้ไหม
ได้ บทเรียน Security+ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อัลกอริทึมการเข้ารหัสแบบสมมาตร
- การเข้ารหัสแบบอสมมาตรและคู่กุญแจ
- การแฮชและความถูกต้องครบถ้วนของข้อมูล
- การแลกเปลี่ยนกุญแจและการเข้ารหัสแบบผสม