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

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การเข้ารหัสช่วยให้ข้อมูลเป็นความลับ แต่ไม่ได้ป้องกันการถูกแก้ไขหรือแอบเปลี่ยนข้อมูล
- การโจมตีแบบ bit-flipping อาจทำให้ระบบถอดรหัสข้อมูลที่ถูกสลับบิตกลายเป็นข้อมูลขยะหรือข้อมูลที่ดูเหมือนปกติ
- AES-GCM จัดเป็น AEAD ที่รวมการรักษาความลับและการตรวจสอบความถูกต้องไว้ในขั้นตอนเดียว
- การเลือกใช้อัลกอริทึมที่รองรับการตรวจสอบความสมบูรณ์ช่วยตัดความเสี่ยงจากการลืมเพิ่มระบบเช็คข้อมูล
คนส่วนใหญ่มักเข้าใจว่าหน้าที่หลักของการเข้ารหัสคือการเก็บรักษาข้อมูลไม่ให้รั่วไหล ทว่าความจริงแล้วนั่นเป็นเพียงครึ่งหนึ่งของภารกิจทั้งหมด และจุดบอดในครึ่งหลังนี่เองมักทำให้ระบบที่มีการรักษาความปลอดภัยอย่างรัดกุมเกิดช่องโหว่ขึ้นมาได้อย่างเงียบๆ บทความนี้เป็นส่วนหนึ่งของซีรีส์บันทึกการเรียนรู้การพัฒนาโปรเจกต์ CryptoGraphy
หากระบบมีการเข้ารหัสข้อมูลโดยปราศจากกลไกตรวจสอบการดัดแปลง ผู้ไม่หวังสามารถดักจับและแก้ไขบิตข้อมูลใน ciphertext ได้โดยไม่ต้องรู้กุญแจเข้ารหัส แม้พวกเขาจะอ่านข้อความต้นฉบับไม่ออก แต่ในบางโหมดการเข้ารหัส การสลับบิตเหล่านี้จะทำให้ระบบพยายามถอดรหัสออกมาเป็นข้อมูลที่เสียหาย หรือในกรณีที่แย่กว่านั้นคือกลายเป็นข้อมูลที่มีโครงสร้างสมบูรณ์แต่ไม่ใช่ข้อความที่ส่งมาจริงๆ
คำถามว่า "มีใครแอบอ่านข้อมูลนี้ได้ไหม" กับ "มีใครแอบเปลี่ยนข้อมูลนี้โดยที่เราไม่รู้ตัวหรือเปล่า" คือสองการรับประกันความปลอดภัยที่แยกออกจากกันอย่างสิ้นเชิง และระบบที่ดีจำเป็นต้องมีทั้งสองอย่างพร้อมกัน
ในทางปฏิบัติ ช่องโหว่จากการถูกแก้ไขข้อมูลกลางทาง (Tampering) มักอันตรายไม่แพ้การถูกขโมยข้อมูล เนื่องจากระบบซอฟต์แวร์ทั่วไปมักถูกออกแบบมาให้เชื่อถือข้อมูลที่ถอดรหัสสำเร็จ หากไม่มีกลไกตรวจสอบความสมบูรณ์มารองรับ ระบบอาจนำข้อมูลที่ถูกดัดแปลงไปประมวลผลต่อจนเกิดความเสียหายร้ายแรง เช่น การแก้ไขสิทธิ์ผู้ใช้งานหรือยอดเงินในระบบโดยที่ไม่มีข้อผิดพลาดแจ้งเตือน
ชุดคำสั่งใน crypto.py จึงเลือกใช้ AES-GCM แทนที่จะเป็น AES ในโหมด CBC แบบดั้งเดิม โดยมีโครงสร้างการทำงานดังนี้:
- กำหนดค่า nonce ขนาด 12 ไบต์โดยใช้ os.urandom
- ฟังก์ชัน encrypt จะทำการเข้ารหัสข้อความต้นฉบับร่วมกับกุญแจและ nonce
- ฟังก์ชัน decrypt จะทำหน้าที่ถอดรหัสและตรวจสอบความถูกต้องไปพร้อมกัน

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ชื่อย่อ GCM ย่อมาจาก Galois/Counter Mode ซึ่งอยู่ในกลุ่มอัลกอริทึมที่เรียกว่า AEAD หรือ Authenticated Encryption with Associated Data โดยสามารถทำหน้าที่สองอย่างพร้อมกันในขั้นตอนเดียว ได้แก่ การเข้ารหัสข้อมูลให้เป็นความลับ และการสร้างแท็กตรวจสอบความสมบูรณ์ของข้อมูลขึ้นมา
"การเปลี่ยนแปลงแม้เพียงบิตเดียวของ ciphertext หลังจากเข้ารหัส จะทำให้ AES-GCM.decrypt ไม่คืนค่าข้อมูลที่เสียหาย แต่จะโยนข้อยกเว้นและปฏิเสธการส่งคืนข้อมูลใดๆ ทันที"
ผู้พัฒนาโปรเจกต์ CryptoGraphy
ระบบที่ใช้ AES-GCM จะได้ผลลัพธ์เพียงสองทางเท่านั้น คือได้รับข้อความต้นฉบับที่ถูกต้องแม่นยำ หรือไม่ได้อะไรเลย ไม่มีผลลัพธ์แบบที่สามที่ระบบจะยอมรับข้อมูลที่ถูกแอบแก้ไขโดยไม่รู้ตัว ในขณะที่โหมด AES-CBC ดั้งเดิมไม่มีคุณสมบัตินี้ ทำให้ระบบยอมถอดรหัสข้อมูลที่ถูกป่วนจนได้ผลลัพธ์ที่ผู้โจมตีต้องการ
ความแตกต่างระหว่าง "ข้อมูลนี้เป็นความลับ" กับ "ข้อมูลนี้เป็นความลับและมั่นใจได้ว่าไม่มีใครแตะต้อง" ดูเหมือนเป็นเรื่องของคำพูด แต่ในทางปฏิบัติมันคือเส้นแบ่งระหว่างระบบที่เสี่ยงต่อการถูกโจมตีแบบ bit-flipping กับระบบที่ปลอดภัยโดยปริยายจากคุณสมบัติของโหมดการเข้ารหัสที่เลือกใช้
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น