บทความนี้เขียนเพื่อเป็นส่วนหนึ่งของความตระหนักต่อการเข้ารหัส
เพราะการเข้ารหัสไม่ใช่เรื่องไกลตัว
เราคงเคยได้ยินลูกกุญแจสีเขียวที่ถ้ามีแล้วเว็บจะปลอดภัยขึ้นกันมาบ้าง
ลูกกุญแจสีเขียวนี้ เราเรียกกันว่า HTTPS
กลไกการทำงานของ HTTPS นั้นเอาเข้าจริงแบ่งเป็นสองระบบซ้อนกัน คือ HTTP ที่ใช้กันอยู่ปกติ และตัว S ที่เพิ่มขึ้นมา
HTTP: อะไรยังไง ทำไมไม่ปลอดภัย
เวลาเราส่งเว็บอะไรก็ตาม เรากำลังส่งข้อมูลอยู่บนระบบที่เราเรียกว่า TCP
ซึ่ง โอเค เอางี้ มันคือท่อ อยากส่งอะไรก็ส่งไป
แต่แม่ก็คือแม่ท่อก็คือท่อ กว่าข้อมูลจะไปถึงปลายทาง ก็ผ่านคนตั้งมากมาย ทั้งเครื่องกลางบริษัท หรือแม้แต่ผู้ให้บริการเน็ต ข้อมูลหลายอย่างสามารถถูกดักฟังได้ เช่น ข้อมูลว่าเราขอเข้าถึงเว็บหน้าไหนของเว็บอะไร
โอเค อาจจะไม่ซีเรียสว่าเราเข้าเว็บอะไรมั่ง แต่เอาเข้าจริงถ้าสมมติดักได้ว่าเราเข้าเว็บอะไรบ้าง ก็แปลว่าเค้าสามารถบล็อกเว็บได้
ซึ่ง โดยปกติแล้ว ข้อมูลตรงนี้ ส่วนที่ผู้ให้บริการเน็ตต้องรู้มีแค่ชื่อเว็บจนถึง .com เท่านั้น ส่วนอื่นไม่เกี่ยวเลย
(รูปข้างล่างสีแสดงตามส่วนว่าข้อมูลตรงไหนสำหรับใคร)
โอเค เหมือนที่บอก อาจจะไม่ซีเรียสว่าเราเข้าเว็บอะไร แต่ถ้าสมมติข้อมูลที่ส่งไปมันเป็นแบบนี้ล่ะ
เออ เอาดิ อยากให้มีใครดูพาสเวิร์ดเราเปล่าล่ะ…
ดังนั้น จึงมีการคิดค้นการเข้ารหัสข้อมูลที่วิ่งผ่านท่อทั้งหมดตรงนี้ออกมา เป็น Secure Channel Protocol หรือก็คือตัว S ที่ต่อเข้ามาข้างหลัง
ขั้นตอนการเข้ารหัส
การเข้ารหัสของ HTTPS จะไม่เหมือนการเข้ารหัสแบบ Public-Private key โดยที่ไม่ส่าจะเข้าหรือถอดรหัส ก็จะใช้ตัวถอดหรือเข้ารหัสชุดเดียวกัน ทำได้ทั้งเข้าและถอด
กติกาเดิมคือ ถ้าเข้าด้วยรหัสลับร่วมชุดไหน ต้องใช้ชุดนั้นตลอด (เช่นในกรณีนี้ เข้าม่วงต้องถอดม่วง สีเหลืองไม่เกี่ยว)
คำถามก็คือ ทั้งฝั่งเราและอีกฝั่ง ต้อง “รู้” ภาษาถอดรหัสภาษาเดียวกัน ดังนั้นขั้นตอนแรกของการเข้ารหัส เราจะเริ่มจากการแลกเปลี่ยนข้อมูลกันก่อน เราเรียกขั้นตอนนี้ว่า Handshaking
ทุกอย่างเริ่มจากเมื่อฝั่งเราขอข้อมูลไปที่เซิร์ฟเวอร์ เรากำลังบอกเซิร์ฟเวอร์ด้วยว่าเราเข้ารหัสภาษาอะไรเป็น
หลังจากเซิร์ฟเวอร์ทราบว่าเราเข้ารหัสภาษาอะไรเป็นบ้าง ก็จะโยนข้อมูลกลุ่มหนึ่งเข้ามา เป็นข้อมูลที่มัดรวมกันเรียกว่า Certificate มีข้อมูลว่า
- นี่กำลังคุยกับเว็บอะไร
- เว็บนี้มีบริษัทน่าเชื่อถือๆ รับรองไหม
- สรุปเราจะตกลงเข้ารหัสด้วยวิธีใด
และนอกจากนี้ ข้อมูลที่มัดรวมกันนี้จะมี Public Key ที่ฝั่งเซิร์ฟเวอร์มี Private Key ไว้ถอดได้
อ้าว ไหนบอกไม่ใช้ Public-Private key ไง
ไม่ต้องตกใจ เดี๋ยวดูต่อ
เมื่อเซิรฟ์เวอร์ส่ง Public Key ให้เครื่องเรา เครื่องเราจะทำการสร้าง “รหัสลับร่วม” ขึ้นมา โดยรหัสลับร่วมชุดนี้จะกลายเป็นตัวเข้ารหัสระหว่างสองเครื่องในเวลาต่อมา
ขั้นตอนต่อไปคือ เราเอารหัสลับร่วมของเราไปเข้ารหัสอีกทีหนึ่งด้วย Public Key ที่เพิ่งได้มา ก่อนส่งกลับไปที่เซิร์ฟเวอร์ หมายถึงว่าระหว่างทางไปเซิร์ฟเวอร์ จะไม่มีใครแอบดึงรหัสลับร่วมเราออกมาได้
หลังจากนั้นที่เซิร์ฟเวอร์ พอได้รหัสลับร่วมที่ถูกเข้ารหัสโดย Public Key มาแล้ว ก็จะทำมาถอดโดย Private Key กลายเป็นตอนนี้มีรหัสลับร่วมกันอยู่ทั้งสองฝั่ง
ก่อนจะทำการสื่อสารกันจริง จะมีการทดสอบดูว่ารหัสลับร่วมตรงกันไหม ด้วยการลองถอดข้อมูลที่ไม่ได้จริงจังกับการเข้ารหัสอะไรมากมาย
เมื่อทั้งสองฝ่ายตกลงกันได้ ก็เริ่มกระบวนการคุยกันแบบเข้ารหัส 😀
ดังนั้นหลังจากนี้ ถ้าไม่นับในส่วนของสีแดง ข้อมูลทุกอย่างที่เราวิ่งไปขอที่เซิร์ฟเวอร์กลับมา ก็จะถูกเข้ารหัส และข้อมูลจากเซิร์ฟเวอร์ที่วิ่งมาหาเรา ก็จะถูกเข้ารหัส ทำให้คนกลางไม่สามารถเข้าถึงได้
กระบวนการที่สำคัญจริงๆ ในก็คือช่วงแรกที่เราพยายามส่งรหัสลับร่วมให้เซิร์ฟเวอร์ เพราะต้องมั่นใจว่าไม่มีใครสามารถอ่านรหัสลับร่วมได้
หากอ่านรหัสลับร่วมได้ ก็หมายถึงว่าข้อมูลที่เราทำการเข้ารหัสสามารถถูกถอดเป็นข้อมูลไม่เข้ารหัสได้นั่นเอง
จากกระบวนการนี้จะเห็นว่า ตัว S ที่เพิ่มข้ึนมานั้นสามารถเอาไปใช้ได้อีกหลายบริการ เช่น FTPS (FTP ที่เข้ารหัส [คนละอันกับ SFTP ที่ขึ้นอยู่บน SSH]), RTMPS (ติดต่อกับ streaming server ตระกูล RTMP โดยเข้ารหัส)
แล้วถ้าเซิร์ฟเวอร์ถูกสับขาหลอกข้อมูลล่ะ 😛
Leave a Reply