เมื่อวานเกิดความคิดอยากทำของเล่นใหม่จาก Product ของ LINE แต่ปัญหาคือ บริการนี้จะต้องมีการ Login หรือ Authenticate ก่อนใช้บริการ เลยจำเป็นที่จะต้องไล่ Reverse ระบบเข้ารหัสของ LINE ที่ใช้ในการ Authenticate โดยมีประเด็นหลักๆ ดังนี้
- LINE ใช้งาน OAuth ในการเข้าสู่ระบบบริการของตัวเอง
- LINE ป้องกันการ Strip SSL Connection ระดับนึง ด้วยการเข้ารหัสก่อนส่งข้อมูลไปยัง Server ด้วย Public Key ที่ไม่ซ้ำกัน
- LINE ใช้กระบวนการเข้ารหัส Public Key ด้วย RSA รูปแบบ PKCS1
- หลังจากเข้าสู่ระบบเรียบร้อยแล้ว Line จะใช้วิธีการส่ง Token ไปหา Web Service API Callback เพื่อยืนยันการเข้าสู่ระบบ
ผมจะพูดถึงการทำงานจุดนึง ที่น่าสนใจมากๆ ในการรักษาความปลอดภัยของข้อมูลผู้ใช้ คือ “การเข้ารหัส Password ก่อนจะดำเนินการส่งข้อมูลไปยัง Server” โดยกระบวนการทำงานโดยสรุปสั้นๆ มีดังนี้
- LINE จะใช้ URL บางอย่าง (ไม่ขอเปิดเผย URL นะครับ) ในการเข้าไปขอ Public Key จาก Server เพื่อใช้ในการเข้ารหัสที่เรากรอกเข้ามา หลังจากนั้นแล้ว เราจะได้เข้าข้อมูลมา 2 ชุดคือ session_key และ rsa_key
- กระบวนการเข้ารหัสจะเริ่มขึ้น โดยการเอา session_key ไปรวมกันกับ E-Mail และ Password ที่เรากรอกเข้ามา โดยจะมีการแทรก Spacial Character ระหว่างชุดข้อมูล เพื่อใช้ในการแบ่งข้อมูลออกจากกัน หลังจากถอดรหัสแล้ว
- หลังจากที่มีการขอ Public Key จาก Server ของ LINE มาแล้ว ก็จะต้องทำการกรองเอา Public Key แท้ๆ ออกมาก่อน (สิ่งที่ Server ส่งมา ยังไม่สามารถนำมาเข้ารหัสได้)
- หลังจากนั้นก็จะมีการนำข้อมูลที่ผ่านการรวมแล้วและกรองเอา Public Key แท้ๆ ออกมาแล้ว ก็จะมีการเอาข้อมูลที่รวมกันตอนแรก มาเข้ารหัสกับ Public Key ที่ผ่านการกรองมา จะได้ Password ที่ผ่านการเข้ารหัสเรียบร้อยแล้ว ส่งไปยัง Server ของ LINE
โดยชุดรหัสที่ระบบ Login ขอมาจาก Server LINE จะไม่เหมือนกันในแต่ละช่วงเวลา เพียงแค่วินาทีเดียว Key ที่ถูกส่งมาจะถูกเปลี่ยนทันที
การเข้ารหัสครั้งนี้ แสดงให้เห็นถึงการใส่ใจในความปลอดภัยของข้อมูลผู้ใช้งานจาก LINE ทำให้เราอุ่นใจระดับนึง ทำให้กระบวนการถอดรหัสนั้น ทำได้ลำบากมากขึ้นกว่าเดิมหลายเท่าเลยทีเดียว