👦Security พื้นฐาน

เรื่องไม่ลับแต่คนส่วนใหญ่ไม่รู้กับหลักการทำ security

ในคอร์สนี้เราจะมาพูดกันถึงเรื่อง Security ขั้นพื้นฐานในการทำซอฟต์แวร์ โดยเนื้อหาจะเน้นไปที่เรื่องความเข้าใจและหลักในการปฏิบัตินะจ๊ะ

🦉 นิทานเรื่องแรก

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

ปัญหาของเรื่องมีอยู่ว่า

  • ม้าเร็วอาจจะถูกฝ่ายศตรูดักโจมตีเพื่อ แอบอ่านจดหมาย นั้นก็ได้ ซึ่งจะทำให้ฝ่ายศตรูได้เปรียบเพราะจะได้หาทางรับมือกับทางเจงกีสข่านได้นั่นเอง

  • ฝ่ายแม่ทัพจะรู้ได้ยังไงว่า ข้อความนั้นเป็นของจริง ที่ท่านเจงกีสข่านเขียนมาให้ ไม่ใช่ฝ่ายศตรูแอบปลอมแปลงมา หรือ โดนไส้ศึกทำของปลอมส่งมาให้

  • ถ้าแม่ทัพต้องเขียนจดหมายรายงานกลับมา เจงกีสข่านจะรู้ได้ยังไงว่า จดหมายนั้นเป็นของแม่ทัพจริงๆ

จากปัญหาที่ว่ามา เจงกีสข่าน ก็เลยไปศึกษาเรื่อง Cryptography 101 เลยได้วิธีการแก้ปัญหาทั้งหมดออกมาเป็นแบบนี้

💔 จดหมายโดนแอบอ่าน

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

เราเรียกหลักการนี้ว่าการทำ Encryption โดยเราจะเอาข้อความต้นฉบับที่อ่านได้ หรือที่เรียกว่า Plain Text ไปทำการเข้ารหัสด้วย กุญแจลับ แล้วสิ่งที่ได้ก็คือข้อความที่อ่านไม่ออก หรือที่เรียกว่า Chipher Text นั่นเอง ตามรูปเลย

เช่น เจงกีสข่าน เขียนจดหมายไปว่า เจอกันที่ใต้เข้าเหลียงซาน เขาก็จะเอาข้อความที่เป็น Plain Text นี้ไปเข้ารหัสด้วยกุญแจลับ แล้วก็จะได้ Cipher Text ออกมาเป็นข้อความที่อ่านไม่ออกตามด้านล่างนี้

Tj/qsc0XaalXwMhfWWDFfC9kHlGNA/YQhTXDbu3jEC7jROmPKSNzhcRJTQtmQuTbqdosWtEK83XJhBO8cekh7YJiacffeMu7b+bEyvE+wlE=

ถัดมาฝั่งแม่ทัพพอได้จดหมายมาแล้ว เขาก็จะทำการเอาจดหมายที่มีข้อความมั่วๆนี้มาทำการถอดรหัสด้วยกุญแจลับที่เจงกีสข่านมอบให้ไว้ เพื่อให้ได้ข้อความที่เจงกีสข่านเขียนไว้นั่นเอง โดยหลักการนี้เราเรียกว่า Decryption นั่นเอง ตามรูปเลย

เทียบกับโลกจริง การป้องกันการถูกแอบอ่านจดหมายนั้นมีไว้เพื่อป้องกันไม่ให้ มีคนแอบมารู้รหัสลับต่างๆที่เราส่งผ่าน network/internet ยังไงล่ะ เช่น เวลาเราใส่รหัสผ่าน ข้อมูลบัตรเครดิต อะไรพวกนี้ยังไงล่ะ ซึ่งนอกจากการป้องกันโดยการใช้ encryption ต่างๆแล้ว ช่องทางในการรับส่งข้อมูลก็ต้องเป็นช่องทางพิเศษด้วยนะ เช่น สังเกตุดีๆเวลาที่เราจะใส่รหัสผ่านกับเว็บอะไรก็ตาม มันจะต้องอยู่บน HTTPS ด้วย เพราะนั่นคือ secure channel ยังไงล่ะ แต่ถ้าเว็บไหนตอนที่เราใส่ความลับนั้นไม่ได้อยู่บน HTTPS ให้โปรดรู้ไว้เลยว่า คุณอาจจะโดนดักความลับอยู่ก็เป็นได้

💔 จดหมายถูกแก้ไข

เจงกีสข่านจำได้ว่าตอนไปกู้เงินโดนคนอื่นแอบโกงโดยการเติมเลขศูนย์ต่อท้ายลงไป ทำให้ต่อมาเขาต้องเขียนกำกับลงไปเป็นข้อความด้วยว่าเขากู้เงินไปจริงๆเท่าไหร่ เช่น 200 (สองร้อยบาทถ้วน) เพื่อเป็นการเอาไว้ตรวจสอบ ตอนที่มีคนไปแอบแก้เลข 200 เป็น 20,000 ก็จะไม่มีผลเพราะมันเขียนไว้แล้วว่า สองร้อยบาทถ้วน ดังนั้นเจงกีสข่านเลยเอาหลักการที่ว่ามาใช้นั้นก็คือการทำให้ ข้อความสามารถถูกตรวจสอบได้ นั่นเอง โดยหลักการนี้เราเรียกมันว่าการทำ HASH นั่นเอง

ดังนั้นในจดหมายที่ส่งไป มันจะมีของที่สามารถตรวจสอบเจ้าจดหมายได้ว่ามันถูกแก้ไขหรือเปล่า ซึ่งถ้ามันถูกแก้ไข ผลตรวจก็จะบอกว่าจดหมายนั้นถูกแก้ไขนั่นเอง (รายละเอียดอ่านด้านล่างต่อ)

หลักการ HASH function นั้นแสนจะเรียบง่าย นั่นคือ การเอาข้อความธรรมดา ไปผ่านกระบวนการ hash แล้วเราจะได้ ข้อความอีกแบบกลับมานั่นเอง

เช่น เอาข้อความว่า saladpuk ไปผ่าน hash function เราก็จะได้ผลลัพท์ประมาณนี้ออกมา

6e1033fe5939f2659d21a51b27a41a14

และการทำ hash มันจะมีเรื่องพิเศษของมันคือ

1.ผลลัพท์เดิมเสมอ ถ้าเอาข้อความเดิมไปผ่านการ hash ไม่ว่าจะทำกี่ที ก็จะได้ผลลัพท์เดิมเสมอ เช่นคำว่า saladpuk **ไม่ว่ายังไงเราก็จะได้ผลลัพท์กลับมาเป็นตัวด้านล่างอยู่ดี

6e1033fe5939f2659d21a51b27a41a14

แต่ถ้าเอาคำว่า Saladpuk (ตัวแรกเป็นตัว S ใหญ่) ไปผ่าน hash function ผลลัพท์ที่ได้กลับมาจะเป็นคนละโลกกันเลย

fce7659c775781e2e3b979799e0ee0d6

2.อาจะได้ผลลัพท์เดียวกัน ข้อความต่างกันอาจจะได้ผลลัพท์เดียวกันก็ได้ เช่น เอาคำว่า Helloworld ไปผ่านการ hash อาจจะได้ผลลัพท์เดียวกับ การเอาคำว่า saladpuk ไป hash ก็ได้ (เป็นแค่ตัวอย่างนะ)

3.ไม่สามารถทำ reverse engineer ได้ เราไม่สามารถเอาผลลัพท์กลับมาหาว่า ข้อความก่อน hash คืออะไรได้เลย

4.ขนาดตายตัว ไม่ว่าข้อความจะยาวแค่ไหนก็ตาม ผลลัพท์ที่ได้จากการ hash จะมีความยาวเท่ากันเสมอ เช่นเอาคำว่า demo hash function with a long long message ไปผ่าน hash function ผลลัพท์ที่ได้ก็จะยาวเท่ากับตัวอย่างแรกเสมอ

ab9003e1e895c62ab2c73f9f550a5275

จากที่ว่ามาทั้ง 4 ข้อเราก็สรุปออกมาเป็นภาพได้ราวๆนี้

💔 จดหมายปลอม

เพื่อป้องกันการปลอมแปลงเอกสาร เจงกิสข่านเลยให้แม่ทัพของเขาลงตราประทัพประจำกองทัพเอาไว้ ดังนั้นถ้าจดหมายนั้นมีตราประทับอยู่ก็น่าจะเป็นจดหมายจากแม่ทัพของเขาจริงๆยังไงล่ะ ซึ่งการทำแบบนี้เขาเรียกว่าการทำ Digital Signature

โดยหลักในการทำ Digital Signature นั้นจะใช้หลักการที่เล่าให้ฟังทั้ง 2 เรื่องคือ Encryption & Description และ HASH มาร่วมกันทำ Digital Signature นั่นเอง

แต่ในรอบนี้การเข้ารหัสจะทำการสร้างกุญแจออกมา 2 ดอก เราเรียกมันว่า กุญแจคู่ เพราะเจ้ากุญแจทั้งสองอันนี้มันเกิดมาคู่กัน ไม่สามารถหากุญแจอันไหนมาแทนที่ได้นั่นเอง โดยลักษณะพิเศษของมันคือ ถ้าเอากุญแจอันนึงไปเข้ารหัสข้อความเสร็จแล้ว เกิดอยากถอดรหัสขึ้นมาจะต้องใช้กุญแจอีกดอกถอดรหัสเท่านั้น นั่นคือสาเหตุว่าทำไมมันถึงเรียกมันว่ากุญแจคู่นั่นเอง โดยเราเรียกกุญแจแบบนี้ว่า Public-Key Cryptography โดยคนสร้างกุญแจจะเก็บมันไว้กับตัว 1 ดอกซึ่งเราเรียกมันว่า Private Key เพราะคนสร้างจะเก็บมันไว้อย่างดีไม่ให้ใครนั่นเอง ส่วนอีกดอก เราเรียกว่า Public Key ซึ่งเขาจะมอบให้กับคนอื่นเพื่อเอาไว้เปิดอ่านข้อความของเขา ซึ่งถ้าข้อความนั้นถูกเปิดด้วย public key ของเขาได้ นั่นแสดงว่าคนที่เขียนคือเจ้าตัวแน่นอนนั่นเอง

โดยหลักการทำงานของฝั่งที่จะเขียนจดหมายลับจะต้องทำตามในรูปนี้

อธิบายรูป

  1. ฝ่ายผู้สร้างเขียนจดหมายจะต้องนำข้อความในจดหมายไปผ่าน HASH function เสียก่อน เพื่อให้สามารถตรวจสอบได้ว่าข้อความจะต้องเป็นแบบนี้เท่านั้นนะ เพราะถ้าข้อความถูกแก้ไข มันจะทำให้ผลลัพท์ของ hash เปลี่ยนไปนั่นเอง

  2. ทำการเข้ารหัสด้วย Private Key เพื่อไม่ให้คนอื่นอ่านออก และเป็นการยืนยันว่าคนที่ส่งเกิดจากคนที่ใช้ private key นี้เท่านั้น ซึ่งมันก็เหมือนกับเป็นการลงลายเซ็นไปในตัว เพราะถ้าจะเปิดอ่านจะต้องใช้ public key ของเขาเท่านั้น ดังนั้นผลลัพท์ที่ได้จะเป็น ข้อความ และ สิ่งที่ตรวจสอบข้อความได้ว่ามันถูกแก้ไขหรือเปล่านั่นเอง

ถัดมาฝั่งที่รับจดหมายก็จะทำการตรวจสอบ ตามขั้นตอนในรูปด้านล่างนี้

อธิบายรูป

  1. ผู้รับจดหมายก็จะเอาจดหมายไปทำการถอดรหัสด้วย Public key ที่คนเขียนได้ส่งมอบให้ ซึ่งถ้าใช้กุญแจนี้เปิดได้ก็แสดงว่าคนส่งคือคนที่ใช้ private key คู่ตรงข้ามของมันเท่านั้น ส่วนผลลัพท์จากการถอดรหัสจะได้ข้อความและผลลัพท์ของการ hash ออกมา

  2. ผู้รับจดหมายก็จะลองเอาข้อความที่ได้ไปทำการ hash ซ้ำอีกครั้ง เพื่อดูผลลัพท์จากการ hash ว่าตรงกับ hash ที่อยู่ในจดหมายหรือเปล่า ซึ่งถ้าตรงกันก็แสดงว่าจดหมายไม่ได้ถูกแก้ไข และ มาจากคนส่งที่ถูกต้องจริงๆนั่นเอง

🎯 บทสรุป

🔥 Encryption & Description

เป็นการเข้ารหัสและถอดรหัส เพื่อป้องกันไม่ให้คนอื่นรู้ข้อความว่าเรากำลังคุยอะไรกันอยู่ ซึ่งเจ้าตัวนี้ก็จะแตกย่อยออกเป็นหลายๆแบบเลย เช่น Symmetric Encryption หรือ Asymmetric Cryptography ซึ่งรายละเอียดลองไปศึกษาดูต่อกับแต่ละภาษาที่ถนัดเอาละกันนะ

แนะนำให้อ่าน สำหรับสาย .NET Developer แนะนำให้อ่านเรื่อง Cryptography จากทาง Microsoft โดยตรงได้เลยครับจากลิงค์ด้านล่างนี้ Microsoft document - Cryptography models

🔥 HASH

เป็นการแปลงข้อความตัวนึงให้กลายเป็นอีกตัวนึง โดยมีหลายวิธีการเช่นกัน เช่น MAC ก็จะเป็นตระกูล MD5, SHA1 หรือพวก HMAC ก็จะเป็นตระกูล HMAC-256, SHA-2, SHA-3 ไรงี้

ข้อควรระวัง ในเรื่องการทำ Security นั้นจะมีการอัพเดทมาเป็นระยะๆว่า algorithm แบบไหนที่ไม่ควรใช้แล้ว เช่น MD5, SHA-1 ไรงี้เราไม่ควรใช้แล้วนะครับ เพราะมันมีคนทำ map table ไว้จนหมดแล้ว ถ้าแค่เค้าเห็นผลลัพท์เขาก็จะรู้ข้อความลับของเราได้เลยโดยที่ไม่ต้องไปถอดรหัสอะไรเลย (ใช้เวลาไม่ถึงวิ) ก็แทบจะเรียกว่าเราเก็บ plain text ไว้เลยก็ว่า

🔥 รวมๆ

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

Last updated