ในโลกอินเตอร์เน็ตที่ความเป็นส่วนตัวเป็นเรื่องซีเรียส การเข้ารหัสย่อมเป็นสิ่งที่ขาดไม่ได้ พอดีเราได้มีโอกาศศึกษาการเข้าแบบที่เรียกว่า End to End Encryption ไปนิดหน่อย วันนี้ก็เลยจะเอามาเล่าต่อกัน

End to End Encryption (E2EE)

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

ก่อนที่เราจะไปดูเรื่องรูปแบบการ implement เรามาทบทวนเกี่ยวกับการเข้ารหัสเบื้องต้นกันสักหน่อย

blue locked door
Photo by Chris Barbalis / Unsplash

Symmetric encryption

Symmetric encryption คือการเข้ารหัสแบบโดยใช้กุญแจ (Key) อันนึง แล้วก็ได้ผลลัพธ์เป็นข้อมูลที่เข้ารหัสแล้ว (Ciphertext) หลังจากนั้นถ้าต้องการถอดรหัสก็ใช้กุญแจอันเดิมถอด ก็จะได้ข้อมูลต้นฉบับออกมา เหมือนๆ กับเวลาที่เราล็อกกุญแจบ้าน ใครก็ตามที่มีลูกกุญแจแบบเดียวกับเรา ก็สามารถปลดล็อกได้เลย ดังนั้นในการเข้ารหัสแบบนี้เราจึงต้องเก็บรักษากุญแจไว้เป็นความลับ ให้มีเฉพาะคนที่มีสิทธิ์เท่านั้นที่จะมีกุญแจนี้ได้

Asymmetric encryption

Asymmetric encryption เป็นการเข้ารหัสแบบใช้คู่กุญแจ โดยกุญแจสองอันนี้จะเรียกว่า private key และ public key เมื่อเราเข้ารหัสข้อมูลด้วยกุญแจอันใดอันหนึ่ง เราจะต้องใช้กุญแจอีกอันหนึ่งเพื่อถอดรหัสเท่านั้น ไม่สามารถใช้กุญแจอันเดียวกันทั้งเขารหัสและถอดรหัสได้ ในการเข้ารหัสรูปแบบนี้เราจะเก็บ private key ไว้เป็นความลับ เฉพาะเราคนเดียว แล้วส่งมอบ public key ให้กับคนอื่นที่มีสิทธิ์อ่านข้อมูลได้ และเนื่องจากมี private key อยู่กับเราคนเดียว ผู้รับข้อมูลก็วางใจได้ว่าข้อมูลที่อ่านได้มาจากเราแน่นอน เพราะไม่มีใครสามารถสร้างข้อมูลเทียมโดยไม่ใช้ private key ของเราได้ แต่ในทางกลับกันข้อมูลที่ถูกเข้ารหัสจาก public key จะไม่สามารถระบุแหล่งที่มาได้ เพราะเราสามารถแจกจ่าย public key ให้คนอื่นหลายคน

brown gift box
Photo by Nathan Lemon / Unsplash

Implementation

เนื่องจาก E2EE เองก็ไม่ได้บอกไว้ว่าจะต้องเข้ารหัสแบบไหนดังนั้นเราก็อาจจะทำได้หลายแบบ ดังนี้

ใช้ Symmetric encryption

ใช้กุญแจอันเดียวกันไปเลย ทั้งต้อทางและปลายทาง พอต้นทางเข้ารหัสเสร็จ ก็ส่ง Ciphertext ไปปลายทาง แล้วปลายทางก็ใช้กุญแจเดียวกันนั้นถอดรหัส แต่เดี๋ยวก่อน เราจะเจอคำถามว่า

กุญแจนี่ใครสร้าง?

แต่ละคนสร้างเองเลย ถ้าแบบนั้่นให้คนอื่นอย้างไร?

มีกุญแจเดียวใช้กับทุกคนเลยได้ไหม?

แล้ว Server จะถอดรหัสได้ด้วยไหม ถ้าได้มันก็ไม่ใช้ E2EE สิ?

ใช้ Asymmetric encryption

ต่างคนต่างสร้างกุญแจไปเลย ปลายางใช้ public key ถอดได้

แล้วปล่ยทางจะรู้ public key ได้อย่างไร?

เมื่อบอกว่า public key ให้ใครก็ได้ ก็ตั้ง key server ไปเลย

ถ้างั้น server ก็ถอดรหัสได้สิ ก็ไม่เป็น E2EE?

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

ถ้าข้อมูลใหญ่ก็ช้าสิ? Asymmetric encryption ยิ่งช้าๆ อยู่แล้ว

ใช้ปนกันไปเลย (Hybrid encryption)

แบบ Symmetric encryption มีปัญหาเรื่องกุญแจ แต่เร็ว แบบ Asymmetric encryption มีปัญหาเรื่องช้า แต่เชื่อถือได้ แนวทางใหม่คือใช้ปนกันไป

เราจะใช้ Asymmetric encryption ในการส่งกุญแจของ Symmetric encryption แล้วหลังจากนั้นค่อยใช้ Symmetric encryption สื่อสารกัน

closeup photo of black cat
Photo by Eduardo Mallmann / Unsplash

คราวนี้ที่น่าเป็นห่วงคือ key server ที่เราใช้กระจาย public key เพราะถ้ามี Man in the middle ปลอมตัวเป็น key server ก็จะดักฟังข้อมูลได้ หรือเรา (เจ้าของบริการ) เจาะจงให้ key server จ่าย key ปลอม เพื่อที่จะดักฟังแล้วค่อย encrypt ใหม่ก่อนส่งไปปลายทาง

ข้มมูลประกอบ

End-to-End Encryption (E2EE) for Dropbox, Google Drive and Co. : https://www.boxcryptor.com/en/blog/post/end-to-end-encryption-e2ee-for-dropbox-google-drive-and-co/

Symmetric encryption benchmarks : http://bench.cr.yp.to/results-stream.html

Asymmetric encryption benchmarks : http://bench.cr.yp.to/results-encrypt.html