ธนาคารแห่งประเทศไทย (ธปท.) กำหนดให้ธนาคารและผู้ให้บริการ mobile banking ต้องมีการยืนยันตัวตนแบบหลายปัจจัยสำหรับธุรกรรมที่มีมูลค่าเกินเกณฑ์ที่กำหนด ในอดีตส่วนใหญ่พึ่งพา OTP ทาง SMS แต่การหลอกลวงแบบสวมซิม (SIM swap) ที่เพิ่มขึ้นทำให้แอปธนาคารจำนวนมากหันมาใช้รหัสแบบ TOTP ที่สร้างขึ้นในเครื่องโดยตรง ซึ่งความลับไม่เคยผ่านเครือข่ายของผู้ให้บริการมือถือเลย
ความลับที่ใช้ร่วมกันบวกกับเวลา
ระหว่างการตั้งค่า เซิร์ฟเวอร์และแอปยืนยันตัวตนแลกเปลี่ยนคีย์ลับที่ใช้ร่วมกันหนึ่งตัว (นี่คือสิ่งที่เข้ารหัสอยู่ใน QR code) จากนั้นทั้งสองฝ่ายคำนวณ HMAC แยกกันจากความลับนั้นและเวลา unix ปัจจุบันที่ปัดเป็นช่วง 30 วินาที — ได้รหัสเดียวกันโดยไม่ต้องสื่อสารกัน
เหตุใดสิ่งนี้จึงทำงานได้โดยไม่มีอินเทอร์เน็ต
เนื่องจากรหัสถูกคำนวณในเครื่องจากความลับและนาฬิการะบบของอุปกรณ์ แอปยืนยันตัวตนจึงไม่ต้องการการเชื่อมต่อเครือข่ายเพื่อสร้างรหัส ข้อกำหนดเดียวคือนาฬิกาของเซิร์ฟเวอร์และโทรศัพท์ต้องซิงค์กันภายในช่วงคลาดเคลื่อนเล็กน้อยที่ยอมรับได้ (โดยปกติ ±30–60 วินาที)
เหตุใดรหัสจึงเปลี่ยนทุก 30 วินาที
ช่วงเวลาสั้น ๆ จำกัดหน้าต่างที่รหัสที่ถูกดักจับยังคงใช้ได้ ลดความเสี่ยงที่ผู้โจมตีจะนำไปใช้ซ้ำ เซิร์ฟเวอร์มักยอมรับทั้งช่วงเวลาปัจจุบันและช่วงก่อนหน้าเพื่อชดเชยความล่าช้าของเครือข่ายเล็กน้อยเมื่อกรอกรหัส
ทำไมต้องใช้สิ่งนี้
- เข้าใจกลไกของการยืนยันตัวตนสองปัจจัยเมื่อตั้งค่าหรือแก้ปัญหาแอปยืนยันตัวตน
- ทดสอบการใช้งาน TOTP ของตัวเองเมื่อพัฒนาระบบยืนยันตัวตน
- สร้างรหัสสำหรับการทดสอบอัตโนมัติโดยไม่ต้องกรอกด้วยมือจากโทรศัพท์
สิ่งที่ TOTP ไม่สามารถป้องกันได้
TOTP ป้องกันการขโมยรหัสผ่านแยกจากรหัสได้อย่างน่าเชื่อถือ แต่ไม่สามารถป้องกันฟิชชิงแบบเรียลไทม์ได้ — หากเหยื่อกรอกทั้งรหัสผ่านและรหัส TOTP ปัจจุบันลงในเว็บไซต์ปลอมแปลง ผู้โจมตีสามารถนำค่าทั้งสองไปใช้บนเว็บไซต์จริงได้ทันทีในขณะที่รหัสยังใช้งานได้อยู่ มีเพียงกุญแจฮาร์ดแวร์ตามมาตรฐาน FIDO2/WebAuthn ที่ผูกติดกับโดเมนที่กำหนดเชิงรหัสลับเท่านั้นที่ป้องกันการโจมตีเช่นนี้ได้