การรักษาความปลอดภัยข้อมูล ตอนที่ 1
การเข้ารหัสแบบคีย์เดียว

การรักษาความปลอดภัยข้อมูล ตอนที่ 1

1. เกริ่นนำการรักษาความปลอดภัยข้อมูล

เรารักษาความปลอดภัยข้อมูลเนื่องจากเจ้าของข้อมูลไม่ต้องการให้ผู้อื่นที่ไม่ใช่เป้าหมายได้รับข้อมูลที่ตนเองเผยแพร่ไป หรือแม้ว่าจะได้รับข้อมูลแต่ก็ไม่สามารถเข้าใจเนื้อความในข้อมูลนั้นได้  ดังนั้นวิธีง่ายๆเลยคือนำข้อมูลมาเข้ารหัสบางอย่างไว้ แม้ว่าผู้รับสารจะไม่ใช่ผู้รับตัวจริงแต่เค้าก็ย่อมไม่เข้าใจเนื้อความในข้อมูลนั้นเนื่องจากแปลความไม่ออก คำว่าข้อมูลในที่นี้อาจจะเป็นได้ทั้ง ตัวอักษรข้อความ ภาพ หรือ วิดีโอที่มีทั้งเสียงและภาพก็ได้ ไม่ว่าจะอยู่ในรูปแบบไหนเมื่อเข้ารหัสแล้ว เป้าหมายก็คือ จะต้องเป็นผู้รับเท่านั้นที่จะสามารถเข้าใจเนื้อความของข้อมูลที่ผู้ส่งส่งไปนั้นได้

2. การจู่โจมโดยผู้สอดแนม (Man-in-the-Middle Attack)

คำว่าผู้สอดแนม (เรียกแบบไทยๆง่ายๆว่า Middle Man Attack ก็น่าจะพอได้ครับ) ในที่นี้ หมายถึงใครก็ได้ที่อยู่ตรงกลางระหว่างผู้ส่งกับผู้รับ เค้ามีโอกาสได้รับสารที่ผู้ส่งส่งไปอาจจะด้วยวิธีการลักขโมยมา หรือว่าเป็นบุรุษเดินสารก็ได้ ในภาพต่อไปนี้แสดงให้เห็นการส่งสารระหว่างอลิซ (Alice) กับบ็อบ (Bob) (เนื่องจากในวิชา Security ทั่วไปนิยมใช้ชื่อ 3 ชื่อนี้มากๆ คือ Alice, Bob และ Eve เราเรียนตามก็ใช้ตามเค้าแล้วกันครับ)
รูปภาพ 1 การส่งสารจากอลิซไปให้บ็อบโดยมีอีฟเป็นผู้สอดแนม
ในภาพข้างต้นจะเห็นว่าอลิซเป็นผู้ส่งสาร ข่าวสารข้อมูลไหลผ่านช่องทางสื่อสาร ใช้คำว่าแชนแนลแทนช่องทางสื่อสาร และใช้คำว่าเมสเสจทับศัพท์แทนคำว่าข่าวสารในภาษาไทย ส่วนผู้รับคือบ็อบเป็นผู้รอรับเมสเสจทางแชนแนลที่กำหนดไว้ ในภาพด้านบนจะเห็นว่า อลิซสามารถส่งเมสเสจไปยังบ็อบได้โดยยังไม่ใครมาสอดแนม
                 ในภาพด้านล่าง จะเห็นว่าอีฟทำหน้าที่เป็นผู้สอดแนม ภาษาอังกฤษเรียกวิธีการจู่โจมแบบนี้ว่า Man-in-the-middle หรือย่อๆว่า MITM (อ่านว่ามิ้ม) อีฟสอดแนมที่แชนแนลและรับเมสเสจที่อลิซส่งมาก่อนที่จะไปถึงบ็อบ อีฟอ่านเมสเสจนั้นเข้าใจเนื้อความว่าอลิซต้องการบอกอะไรแก่บ็อบ หลังจากนั้นอีฟอาจจะแก้ไขเมสเสจและส่งคืนกลับไปให้บ็อบ ในขั้นตอนนี้อีฟทำเพื่อไม่ให้บ็อบสงสัยว่ามีผู้สอดแนม ในกรณีที่อีฟรู้ว่าบ็อบจะไม่คุยกับอลิซเพื่อยืนยันเนื้อความกันอีก อีฟอาจจะแก้ไขเนื้อความให้ผิดไปจากต้นฉบับเดิมก็ได้ (แบบที่ภาษาบ้านเราเรียกว่า ฤาษีแปลงสาร ไงครับ ในที่นี้จะแปลงให้ดีให้ร้ายได้ทั้งนั้น) แต่ถ้าอีฟรู้ว่าบ็อบอาจจะมีการยืนยันเนื้อความกับอลิซ อีฟอาจจะไม่แก้ไขเนื้อหาใดๆ เอาแค่ว่ารู้ว่าอลิซกำลังคุยอะไรกับบ็อบอยู่ก็พอ
                 จะเห็นว่าการจู่โจมโดยผู้สอดแนมนี้ สามารถแก้ไขได้ด้วย 2 วิธี วิธีแรกคือ ถ้าแชนแนลที่อลิซใช้ส่งข่าวให้บ็อบเป็นแชนแนลที่ปลอดภัย (Secure Channel) อลิซย่อมไม่สามารถเข้าถึงและสอดแนมได้ อีกวิธีนึงคือ ถ้าเนื้อหาข่าวสารที่อลิซส่งไปให้บ็อบผ่านการเข้ารหัสไว้และอีฟไม่รู้ว่าจะถอดรหัสอย่างไร แม้ว่าอีฟจะเข้าถึงแชนแนลและได้ข้อมูลไปก็ย่อมไม่เข้าใจสิ่งที่อลิซต้องการคุยกับบ็อบ นั่นก็คือสอดแนมไม่สำเร็จและข้อมูลมีความมั่นคงปลอดภัยนั่นเอง

3. การเข้ารหัสแบบคีย์เดียว (Symmetric Key)

เป็นวิธีการเข้ารหัสข้อมูลโดยใช้คีย์ (ผู้เขียนขอใช้ทับศัพท์คำว่า Key ว่าคีย์ แทนการใช้คำว่ากุญแจซึ่งฟังแล้วรู้สึกเข้าใจยาก) คีย์ในที่นี้เหมือนกับกุญแจบ้านทั่วไป คือก่อนเราจะออกจากบ้านถ้าไม่ต้องการให้ขโมยเข้าบ้านเราก็เอาแม่กุญแจล็อคประตูบ้านเอาไว้ ขโมยที่ไม่มีลูกกุญแจ (เปรียบลูกกุญแจนี่ก็คือคีย์นั่นเอง) ย่อมไม่สามารถบิดเปิดแม่กุญแจแล้วเข้าบ้านเราได้ (ไม่นับวิธีการอื่นนะครับ ขโมยจริงๆอาจจะไม่ใช้ลูกกุญแจงัดเข้าบ้านก็ได้ครับ) ทีนี้เรามีลูกกุญแจเดียวถ้าต้องการให้พี่น้องเราเข้าบ้านได้ด้วยเราก็ต้องเอากุญแจไปก็อปปี้ใช่มั้ยครับ กุญแจที่ก็อปมาได้ก็แจกจ่ายกันไปให้กับพี่น้องที่เราไว้ใจและอนุญาตให้เข้าบ้านเรา ซึ่งจะเห็นว่าพี่น้องที่ได้กุญแจเราไปจะได้กุญแจแบบเดียวกับตัวต้นฉบับเลย เรียกว่าไม่ผิดเพี้ยนกัน
                 วิธีการเข้ารหัสข้อมูลแบบคีย์เดียว ใช้วิธีการเดียวกันกับตัวอย่างลูกกุญแจข้างต้นคือให้ผู้ส่งข้อมูลกำหนดรหัสขึ้นมาเป็นคีย์ และส่งรหัสนั้นไปให้กับผู้รับข้อมูล เมื่อถึงจังหวะที่จะส่งข้อมูลไปให้ผู้รับ ก็ให้ผู้ส่งใช้คีย์ที่ตกลงกันไว้นี้เข้ารหัสข้อมูลแล้วส่งข้อมูลที่เข้ารหัสแล้วไปให้ผู้รับปลายทาง เมื่อผู้รับปลายทางได้รับข้อมูลแล้วก็จะเอาคีย์ที่ตกลงกันไว้ถอดรหัสและได้ข้อมูลต้นฉบับกลับออกมา สามารถแสดงขั้นตอนได้ดังภาพต่อไปนี้
รูปภาพ 2 การส่งและรับข้อมูลที่เข้ารหัสด้วยวิธีการคีย์เดียว
ในภาพข้างต้นสามารถอธิบายในแต่ละขั้นตอนได้ดังนี้
1.       สร้างคีย์                       อลิซเป็นผู้ส่ง ก่อนจะส่งจะสร้างคีย์ขึ้นมาเตรียมไว้
2.       ข้อมูลไม่ปกปิด            ข้อมูลที่ไม่เข้ารหัสไว้เราเรียกว่าเพลนเท็กซ์ (Plain) หรือเคลียร์เท็กซ์ (Clear) เป็นข้อมูลที่ต้องการส่งไปให้ผู้รับ
3.       เข้ารหัส                        อลิซใช้คีย์ที่สร้างขึ้นเข้ารหัสข้อมูลไม่ปกปิดด้วยกรรมวิธีบางอย่าง เราเรียกว่าเป็นอัลกอริธึมการเข้ารหัสแบบคีย์เดียว (Symmetric Key Algorithm) ตัวอย่างของอัลกอริธึมยอดนิยมในสายนี้คือ DES (Data Encryption Standard) หรือ AES (Advance Encryption Standard) เมื่อเข้ารหัสแล้วจะได้ออกมาเป็นข้อมูลปกปิด เรียกว่าเป็นไซเฟอร์เท็กซ์ (Cipher Text) ซึ่งใครก็ตามที่ไม่มีคีย์สำหรับถอดรหัสจะไม่สามารถเข้าใจเนื้อความได้
4.       ส่งคีย์                            อลิซจะต้องหาทางส่งคีย์ไปให้กับบ็อบ (เปรียบเทียบกับลูกกุญแจก็คือเอาไปก็อปปี้ให้นั่นเอง) ถ้าคิดภาพคีย์ไม่ออกก็เช่นรหัสผ่าน (Password) ที่เราใช้กันนั่นแหละครับ นั่นคืออลิซต้องหาทางส่งรหัสผ่านไปให้กับบ็อบ ขั้นนี้จะเห็นว่ามีจุดอ่อนอยู่ เดี๋ยวเราค่อยว่ากันทีหลังครับ สมมุติว่าบ็อบได้รับคีย์แล้ว
5.       ส่งรับข้อมูลและถอดรหัส   อลิซจะส่งข้อมูลที่เข้ารหัสไปให้กับบ็อบโดยไม่สนใจว่าแชนแนลปลอดภัยหรือไม่ เพราะถือว่าใครได้ไปก็ถอดไม่ได้อยู่ดี เมื่อบ็อบได้ข้อมูลมาบ็อบจะถอดรหัสด้วยคีย์ที่รับมาก่อนหน้านั้นด้วยอัลกอริธึมเดียวกันกับที่ใช้ในการเข้ารหัส ก็จะทำให้ได้รับข้อมูลเดิมต้นฉบับกลับมาและเข้าใจเนื้อความได้         
6.       ถ้าถูกสอดแนม             สมมุติว่าถ้าอีฟสอดแนมและได้ข้อมูลมาระหว่างทาง อีฟย่อมไม่สามารถเข้าใจเนื้อความได้เนื่องจากไม่มีคีย์ในการถอดรหัสนั่นเอง
จะเห็นว่าวิธีการนี้ปลอดภัยระดับหนึ่ง แต่มีจุดอ่อนอยู่ 2 อย่าง อย่างแรกคือขั้นที่ 4 ตอนส่งคีย์ ถ้าในขั้นตอนส่งคีย์นั้นอีฟสอดแนมและได้รับคีย์ไป ก็ย่อมสามารถถอดรหัสได้ และจุดอ่อนอีกข้อก็คือถ้าคีย์เป็นคีย์ที่ไม่แข็งแรง เช่นถ้าเป็นรหัสผ่านก็เป็นคำที่เดาได้ง่าย ผู้สอดแนมย่อมสามารถคาดเดาคีย์และถอดรหัสได้เช่นกัน
                 สิ่งที่คนทั่วไปมักเข้าใจผิดก็คือ เข้าใจว่าอัลกอริธึมที่ใช้เข้ารหัสควรจะต้องถูกปกปิดด้วย ในทางอุดมคติถือว่าอัลกอริธึมที่ใช้เข้ารหัสสามารถเปิดเผยให้คนทั่วไปรับรู้วิธีการได้ อัลกอริธึมที่ดีจะไม่ซับซ้อนมากนัก (เพราะถ้าซับซ้อนมากจะกินแรงคอมพิวเตอร์สูง) ใช้เวลาเข้ารหัสและถอดรหัสไม่นาน แต่สำหรับผู้ที่ไม่มีคีย์ที่ถูกต้องจะต้องใช้เวลานานมากมายมหาศาลในการถอดรหัสให้สำเร็จ ตัวอย่างเช่น ถ้าใช้อัลกอริธึม AES ที่มีคีย์ยาว 256 บิตเข้ารหัสข้อมูล และใช้วิธีการถอดรหัสแบบ Brute-Force คือไล่คีย์ไปเรื่อยๆโดยไม่เดาหาคีย์ถูก จะต้องทดลองคีย์ถอดรหัสไปเรื่อยๆนานถึง 9.1732631e50[1] ปี (แบบคนทั่วไปเข้าใจคือประมาณ 9 x 10^50 หรือ 9 แล้วต่อท้ายด้วยเลขศูนย์ 0 อีก 50 ตัว) ซึ่งถือว่าต้องใช้เวลานานมากกว่าอายุของจักรวาลนับตั้งแต่กำเนิดมาเสียอีก


[1] อ่านเพิ่มเติมได้ที่ https://www.reddit.com/r/theydidthemath/comments/1x50xl/time_and_energy_required_to_bruteforce_a_aes256/

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การติดตั้ง Shibboleth Single Sign-On
ตอนที่ 12 - การทำ SLO (Single Log-out)

ตัวอย่างการเข้ารหัส AES ด้วย Java และถอดรหัสด้วย C#.NET

การรักษาความปลอดภัยแบบ OWASP