0Pricing
Security+ Academy · บทเรียน

การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305

ทำความเข้าใจว่ารหัส AEAD ให้ทั้งการรักษาความลับและความถูกต้องครบถ้วนพร้อมกันได้อย่างไร และเหตุใดการใช้ nonce ใน AES-GCM ผิดจึงนำไปสู่การกู้คืนกุญแจอย่างร้ายแรง

การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305 เป็นบทเรียน Security+ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Security+ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Security+ Academy มีบทเรียนทั้งหมด 4 บทเรียน

การเข้ารหัสที่มีการยืนยันตัวตนคืออะไร

การเข้ารหัสที่มีการยืนยันตัวตน (AE) แก้ปัญหาพื้นฐานประการหนึ่ง: การเข้ารหัสแบบดั้งเดิมให้เพียงการรักษาความลับ — ทำให้ข้อมูลเป็นความลับ — แต่ไม่ได้ตรวจสอบว่าข้อความเข้ารหัสถูกแก้ไขหรือไม่ ผู้โจมตีอาจสลับบิตในข้อความเข้ารหัส และผู้รับจะถอดรหัสออกมาเป็นข้อมูลเสียหายโดยไม่รู้ว่าข้อมูลถูกแก้ไข การเข้ารหัสที่มีการยืนยันตัวตนพร้อมข้อมูลประกอบ (AEAD) เพิ่มหลักประกันด้านความถูกต้องครบถ้วนและความเป็นของแท้ไปพร้อมกัน โดยสร้างทั้งข้อความเข้ารหัสและ แท็กการยืนยันตัวตน ซึ่งตรวจจับการแก้ไขใด ๆ ได้

AES-GCM: โหมดตัวนับพร้อม GMAC

AES-GCM (โหมด Galois/ตัวนับ) ผสานองค์ประกอบสองส่วน ได้แก่ AES-CTR (โหมดตัวนับ) สำหรับการเข้ารหัส และ GMAC (รหัสยืนยันข้อความ Galois) สำหรับความถูกต้องครบถ้วน AES-CTR สร้างกระแสกุญแจโดยเข้ารหัสค่าตัวนับแล้วทำ XOR กับข้อความต้นฉบับ — ทำให้สามารถประมวลผลการเข้ารหัสแบบขนานได้ ต่างจากโหมด CBC GMAC คำนวณแท็กการยืนยันตัวตนจากข้อความเข้ารหัสและข้อมูลประกอบ แท็กที่ได้ (128 บิต) จะถูกส่งไปพร้อมกับข้อความเข้ารหัส การเปลี่ยนแปลงแม้เพียงหนึ่งบิตจะทำให้แท็กใช้ไม่ได้

# AES-256-GCM encryption with openssl
openssl enc -aes-256-gcm -in plaintext.txt -out encrypted.bin \
  -K $(openssl rand -hex 32) \
  -iv $(openssl rand -hex 12)

ค่าที่ใช้ครั้งเดียว: สำคัญและเปราะบาง

AES-GCM ต้องใช้ค่าที่ใช้ครั้งเดียว (nonce) ซึ่งโดยทั่วไปมีขนาด 96 บิต (12 ไบต์) ค่านี้ต้องไม่ซ้ำกันในการเข้ารหัสแต่ละครั้งด้วยคีย์เดียวกัน ไม่จำเป็นต้องเก็บเป็นความลับ แต่ห้ามใช้ซ้ำโดยเด็ดขาด การใช้ nonce ซ้ำใน AES-GCM มีผลร้ายแรงอย่างยิ่ง หากเข้ารหัสข้อความสองข้อความด้วยคีย์และ nonce เดียวกัน ผู้โจมตีสามารถใช้ XOR กับข้อความเข้ารหัสทั้งสองเพื่อหักล้างกระแสคีย์ และอาจกู้คืนข้อความต้นฉบับทั้งสองได้ ช่องโหว่นี้บางครั้งเรียกว่า «การใช้ nonce อย่างไม่ถูกต้อง» และเคยทำให้เกิดการโจมตีเพื่อกู้คืนคีย์ในระบบจริง

อธิบายการโจมตีจากการใช้ Nonce อย่างไม่ถูกต้อง

เมื่อมีการใช้ nonce ของ AES-GCM ซ้ำ ผู้โจมตีสามารถคำนวณ C1 XOR C2 = P1 XOR P2 (ผล XOR ของข้อความต้นฉบับทั้งสอง) ได้ เนื่องจากข้อความทั้งสองใช้กระแสคีย์เดียวกัน นอกจากนี้ การใช้ nonce ซ้ำยังทำให้สามารถกู้คืน คีย์การยืนยันตัวตน H ได้ ซึ่งหมายความว่าผู้โจมตีสามารถปลอมแปลงแท็กยืนยันตัวตนที่ถูกต้องสำหรับข้อความใด ๆ ได้ ทำลายทั้งการรักษาความลับและความถูกต้องครบถ้วนของข้อมูลโดยสิ้นเชิง ระบบอย่าง Sony PS3 เคยได้รับผลกระทบจากการโจมตีรูปแบบนี้โดยตรง วิธีป้องกันคือใช้ nonce แบบสุ่ม (สร้างด้วย CSPRNG) หรือใช้ตัวนับแบบกำหนดแน่นอนที่ไม่มีวันเริ่มนับใหม่

ChaCha20-Poly1305: ทางเลือกแบบรหัสลับกระแส

ChaCha20-Poly1305 เป็นรหัสลับ AEAD อีกแบบที่กำหนดให้ใช้ใน TLS 1.3 ChaCha20 เป็นรหัสลับกระแสที่ Daniel Bernstein ออกแบบ โดยสร้างกระแสคีย์ด้วยการดำเนินการบวก-หมุนบิต-XOR (ARX) ไม่ใช้ตารางค้นหา ทำงานด้วยระยะเวลาคงที่อย่างสมบูรณ์ และทำงานได้รวดเร็วมากบน CPU ที่ไม่มีตัวเร่งฮาร์ดแวร์สำหรับ AES Poly1305 เป็น MAC แบบใช้ครั้งเดียว (รหัสยืนยันข้อความ) ที่คำนวณแท็กยืนยันตัวตนจากข้อความเข้ารหัส เมื่อนำทั้งสองอย่างมาใช้ร่วมกัน จะให้ความปลอดภัยเทียบเท่า AES-GCM แต่ทำงานบนอุปกรณ์เคลื่อนที่และอุปกรณ์ IoT ได้เร็วกว่าอย่างมาก

เหตุใดจึงใช้ ChaCha20-Poly1305 บนอุปกรณ์เคลื่อนที่

ตัวประมวลผลเดสก์ท็อปและเซิร์ฟเวอร์รุ่นใหม่ที่ใช้สถาปัตยกรรม x86 และ ARM64 มีคำสั่งฮาร์ดแวร์ AES-NI ซึ่งทำให้ AES-GCM ทำงานได้รวดเร็วมาก อย่างไรก็ตาม ตัวประมวลผลสำหรับอุปกรณ์เคลื่อนที่และอุปกรณ์ IoT จำนวนมากไม่มี AES-NI จึงทำให้ AES-GCM ที่ทำงานด้วยซอฟต์แวร์ค่อนข้างช้า ChaCha20-Poly1305 ได้รับการออกแบบให้ทำงานด้วยซอฟต์แวร์ได้รวดเร็ว โดยใช้การคำนวณทางคณิตศาสตร์ที่เรียบง่าย จึงทำให้อุปกรณ์เคลื่อนที่มีประสิทธิภาพใกล้เคียงกันโดยไม่ต้องใช้ตัวเร่งฮาร์ดแวร์ Google เพิ่ม ChaCha20-Poly1305 ลงใน TLS เพื่อเป็นทางเลือกสำหรับอุปกรณ์ Android โดยเฉพาะ และปัจจุบันก็เป็นชุดรหัสลับหลักใน TLS 1.3

ข้อมูลที่เชื่อมโยง: การปกป้องส่วนหัว

ตัว «AD» ใน AEAD ย่อมาจาก ข้อมูลที่เชื่อมโยง ซึ่งหมายถึงข้อมูลเมทาดาทาที่เป็นข้อความต้นฉบับและผ่านการยืนยันตัวตน แต่ไม่ได้เข้ารหัส วิธีนี้ช่วยให้คุณยืนยันตัวตนของข้อมูลที่ต้องอ่านได้ (เช่น ส่วนหัวแพ็กเก็ตหรือฟิลด์ประเภทระเบียน) พร้อมกับป้องกันการแก้ไขข้อมูล ใน TLS 1.3 ไบต์ของส่วนหัวระเบียนจะถูกรวมเป็นข้อมูลที่เชื่อมโยงในการคำนวณ AEAD หากผู้โจมตีแก้ไขส่วนหัว (เช่น เปลี่ยนความยาวระเบียน) การตรวจสอบแท็กยืนยันตัวตนจะล้มเหลวและการเชื่อมต่อจะถูกยุติ

AEAD เทียบกับการเข้ารหัสแล้วทำ MAC

ก่อนที่ AEAD จะกลายเป็นมาตรฐาน นักวิทยาการรหัสลับแนะนำวิธี เข้ารหัสแล้วทำ MAC (EtM) โดยเข้ารหัสข้อความต้นฉบับก่อน แล้วคำนวณ MAC จากข้อความเข้ารหัส วิธีนี้ปลอดภัย แต่ต้องดำเนินการสองขั้นตอนแยกกันและใช้คีย์สองคีย์ รูปแบบ AEAD เช่น AES-GCM รวมการดำเนินการทั้งสองอย่างไว้ด้วยคีย์เดียว ช่วยลดความซับซ้อนในการนำไปใช้และกำจัดการโจมตีด้วยช่องโหว่ออราเคิลแพดดิ้งทั้งกลุ่ม ซึ่งเคยสร้างปัญหาให้กับ การทำ MAC แล้วเข้ารหัส (MtE) ซึ่งเป็นลำดับที่ใช้ใน TLS รุ่นเก่า (CBC + HMAC) TLS 1.3 ที่ใช้ AEAD จึงหลีกเลี่ยงปัญหาเหล่านี้ได้ทั้งหมด

AES-128-GCM เทียบกับ AES-256-GCM

ทั้ง AES-128-GCM และ AES-256-GCM ได้รับการรับรองโดย NIST และถือว่าปลอดภัยเมื่อต่อกรกับคอมพิวเตอร์แบบดั้งเดิม AES-128 ให้ความปลอดภัยระดับ 128 บิตและทำงานได้เร็วกว่าเล็กน้อย ส่วน AES-256 ให้ความปลอดภัยระดับ 256 บิต จึงมีระยะเผื่อมากกว่าสำหรับการวิเคราะห์รหัสลับในอนาคตและภัยคุกคามจากคอมพิวเตอร์ควอนตัม สำหรับแอปพลิเคชันส่วนใหญ่ในปัจจุบัน AES-128-GCM ก็เพียงพอ แต่ระบบข้อมูลลับของรัฐบาล (NSA Suite B) กำหนดให้ใช้ AES-256 TLS 1.3 รองรับทั้งสองแบบ และเซิร์ฟเวอร์สามารถจัดลำดับความสำคัญตามนโยบายความปลอดภัยของตนได้

กระบวนการตรวจสอบแท็กยืนยันตัวตน

เมื่อถอดรหัสข้อความเข้ารหัส AEAD ผู้รับต้องตรวจสอบแท็กยืนยันตัวตนก่อนถอดรหัส กระบวนการมีดังนี้: คำนวณแท็กที่คาดหมายขึ้นใหม่จากข้อความเข้ารหัส คีย์ และ nonce ที่ได้รับ เปรียบเทียบแท็กนั้นกับแท็กที่ได้รับโดยใช้ฟังก์ชันเปรียบเทียบที่ใช้เวลาคงที่ และดำเนินการถอดรหัสต่อเมื่อแท็กตรงกันเท่านั้น การเปรียบเทียบด้วยเวลาคงที่มีความสำคัญอย่างยิ่ง หากการเปรียบเทียบหยุดทันทีเมื่อพบไบต์แรกที่ไม่ตรงกัน ผู้โจมตีอาจใช้การโจมตีช่องข้างเคียงด้านเวลาเพื่อปลอมแปลงแท็กที่ถูกต้องทีละไบต์ ไลบรารี AEAD ใด ๆ ที่ใช้การเปรียบเทียบแบบหยุดก่อนจบจะมีช่องโหว่

การใช้งาน AEAD ในโลกจริง

อัลกอริทึม AEAD ถูกใช้อย่างแพร่หลายในระบบความปลอดภัยสมัยใหม่: TLS 1.3 ใช้ AES-GCM และ ChaCha20-Poly1305 สำหรับการเข้ารหัสระเบียนทั้งหมด WireGuard VPN ใช้ ChaCha20-Poly1305 เท่านั้น Signal Protocol ใช้สำหรับการเข้ารหัสข้อความ และโปรโตคอล QUIC (พื้นฐานของ HTTP/3) ใช้ AES-GCM เมื่อคุณเห็นชุดรหัสลับอย่าง TLS_AES_256_GCM_SHA384 ค่า SHA384 หมายถึงฟังก์ชันแฮช HKDF สำหรับการสร้างคีย์ ไม่ใช่กลไกตรวจสอบความถูกต้อง เนื่องจากแท็ก GCM เป็นผู้จัดการเรื่องความถูกต้องครบถ้วนของข้อมูล

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจแนวคิดของ CompTIA Security+ (SY0-701) จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า อัลกอริทึม AEAD ให้ทั้งการรักษาความลับและความถูกต้องครบถ้วนของข้อมูลพร้อมกันผ่านแท็กยืนยันตัวตนที่ตรวจจับการแก้ไขข้อความเข้ารหัสได้ทุกกรณี การใช้ nonce ของ AES-GCM ซ้ำมีผลร้ายแรงอย่างยิ่ง เพราะทำให้กู้คืนกระแสคีย์และปลอมแปลงคีย์ยืนยันตัวตนได้ ดังนั้น nonce ต้องไม่ซ้ำกันในการเข้ารหัสแต่ละครั้ง และChaCha20-Poly1305เป็นทางเลือกที่มีประสิทธิภาพสำหรับ AES-GCM บนอุปกรณ์ที่ขาดตัวเร่งฮาร์ดแวร์ AES บทถัดไป เราจะสำรวจฟังก์ชันสร้างคีย์เพื่อรักษาความปลอดภัยของรหัสผ่าน

คำถามที่พบบ่อย

บทเรียน “การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Security+ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Security+ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305”

ทำความเข้าใจว่ารหัส AEAD ให้ทั้งการรักษาความลับและความถูกต้องครบถ้วนพร้อมกันได้อย่างไร และเหตุใดการใช้ nonce ใน AES-GCM ผิดจึงนำไปสู่การกู้คืนกุญแจอย่างร้ายแรง คุณปฏิบัติ Security+ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Security+ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Security+ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Security+ Academy นี้ได้ไหม

ได้ บทเรียน Security+ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การจับมือ TLS 1.3 และการกลับมาใช้เซสชัน 0-RTT
  2. การเข้ารหัสที่ยืนยันตัวตน: AES-GCM และ ChaCha20-Poly1305
  3. ฟังก์ชันสร้างกุญแจ: PBKDF2, bcrypt และ Argon2
  4. การเข้ารหัสหลังยุคควอนตัม: CRYSTALS-Kyber และ Dilithium
← กลับไปที่ Security+ Academy