ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การใช้ Two-Factor Authentication (2FA)

บทความนี้กล่าวถึง Two-Factor Authentication (2FA) ซึ่งเป็นระบบรักษาความปลอดภัยที่ต้องการการยืนยันตัวตนด้วยสองปัจจัยเพื่อเข้าถึงระบบ โดยเน้นที่การใช้งาน TOTP (Ti...

การใช้ Two-Factor Authentication (2FA)

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการใช้ Rate Limiting เพื่อป้องกันการโจมตีด้วยการจำกัดจำนวนการเข้าถึง แต่ในบทนี้ เราจะมาดูอีกหนึ่งวิธีที่สำคัญในการเพิ่มความปลอดภัยให้กับระบบของเรา นั่นคือ Two-Factor Authentication (2FA) หรือการยืนยันตัวตนแบบสองปัจจัย

ความหมายของ 2FA

Two-Factor Authentication (2FA) เป็นระบบรักษาความปลอดภัยที่ต้องการให้ผู้ใช้ยืนยันตัวตนด้วยสองปัจจัยที่แตกต่างกัน ก่อนที่จะสามารถเข้าถึงบัญชีหรือระบบได้ โดยทั่วไปแล้ว ปัจจัยเหล่านี้จะแบ่งออกเป็น:

  • สิ่งที่คุณรู้ (Something you know): เช่น รหัสผ่าน (Password) หรือคำถามลับ (Security Question)
  • สิ่งที่คุณมี (Something you have): เช่น โทรศัพท์มือถือ, Token Generator, หรือ Hardware Key
  • สิ่งที่คุณเป็น (Something you are): เช่น ลายนิ้วมือ (Fingerprint) หรือการสแกนใบหน้า (Facial Recognition) (มักใช้ในระบบที่ต้องการความปลอดภัยสูงมาก)

การใช้ 2FA ช่วยเพิ่มความปลอดภัยอย่างมาก เพราะถึงแม้ว่าแฮกเกอร์จะสามารถขโมยรหัสผ่านของคุณได้ (ปัจจัยแรก) พวกเขาก็ยังจำเป็นต้องเข้าถึงปัจจัยที่สองของคุณด้วย ซึ่งทำให้การเข้าถึงบัญชีของคุณเป็นไปได้ยากขึ้น

Trade-offs: การใช้งาน 2FA เพิ่มความยุ่งยากในการเข้าสู่ระบบ (User Experience) แต่ก็เพิ่มความปลอดภัยอย่างมาก ซึ่งเป็น trade-off ที่คุ้มค่าสำหรับระบบที่ต้องการความปลอดภัยสูง เช่น ระบบธนาคาร, อีเมล, หรือระบบจัดการข้อมูลส่วนตัว

การใช้งาน TOTP (Time-based One-Time Password)

TOTP เป็นรูปแบบ 2FA ที่ได้รับความนิยมอย่างแพร่หลาย โดยใช้ Algorithm ในการสร้างรหัสผ่านแบบใช้ครั้งเดียว (One-Time Password - OTP) ที่เปลี่ยนแปลงทุกๆ 30 วินาที หรือ 1 นาที โดยอาศัยเวลา (Time) เป็นปัจจัยหลักในการสร้างรหัส

หลักการทำงานของ TOTP:

  1. Secret Key Generation: ระบบจะสร้าง Secret Key ที่เป็น Unique Key สำหรับผู้ใช้แต่ละคน และเก็บ Secret Key นี้ไว้ทั้งใน Server และใน Application Authenticator (เช่น Google Authenticator, Authy, Microsoft Authenticator)
  2. OTP Generation: ทั้ง Server และ Application Authenticator จะใช้ Secret Key ร่วมกับเวลาปัจจุบัน (current time) ในการสร้าง OTP โดยใช้ Algorithm ที่กำหนด (ส่วนใหญ่เป็น HMAC-SHA1)
  3. Verification: เมื่อผู้ใช้ป้อน OTP จาก Application Authenticator, Server จะคำนวณ OTP ด้วย Secret Key และเวลาปัจจุบัน แล้วเปรียบเทียบกับ OTP ที่ผู้ใช้ป้อน หากตรงกัน แสดงว่าผู้ใช้มี Secret Key ที่ถูกต้องและสามารถยืนยันตัวตนได้

ตัวอย่างการใช้งาน TOTP ใน PHP:

เราสามารถใช้ Library ที่มีอยู่แล้วในการจัดการ TOTP ได้ เช่น SpomkyLabs/otphp

<?php

use OTPHP\TOTP;

// สร้าง Secret Key (เก็บไว้ในฐานข้อมูลอย่างปลอดภัย)
$secret = TOTP::createSecret();
echo "Secret Key: " . $secret . "\n";

// สร้าง TOTP Object
$totp = TOTP::create($secret);

// สร้าง QR Code URL สำหรับให้ผู้ใช้สแกนด้วย Authenticator App
$qrCodeUrl = $totp->getQrCodeUri('user@example.com', 'My Application');
echo "QR Code URL: " . $qrCodeUrl . "\n";

// สร้าง OTP
$otp = $totp->now();
echo "Current OTP: " . $otp . "\n";

// ตรวจสอบ OTP ที่ผู้ใช้ป้อน
$userInputOtp = '123456'; // สมมติว่าผู้ใช้ป้อน OTP นี้
$isValid = $totp->verify($userInputOtp);

if ($isValid) {
    echo "OTP is valid!\n";
} else {
    echo "OTP is invalid!\n";
}

?>

คำอธิบาย Code:

  • TOTP::createSecret(): สร้าง Secret Key ที่เป็น Random String
  • TOTP::create($secret): สร้าง TOTP Object โดยใช้ Secret Key ที่สร้างขึ้น
  • $totp->getQrCodeUri(): สร้าง QR Code URL ที่สามารถนำไปแสดงให้ผู้ใช้สแกนด้วย Authenticator App เพื่อเพิ่ม Account ใน App
  • $totp->now(): สร้าง OTP จากเวลาปัจจุบัน
  • $totp->verify($userInputOtp): ตรวจสอบว่า OTP ที่ผู้ใช้ป้อนถูกต้องหรือไม่

ข้อควรระวัง:

  • Secret Key Storage: ต้องเก็บ Secret Key ไว้ในฐานข้อมูลอย่างปลอดภัย โดยใช้ Encryption
  • Time Synchronization: Server และ Application Authenticator ต้องมีการ Synchronize เวลาที่ถูกต้อง เพื่อให้สามารถสร้าง OTP ที่ตรงกันได้
  • Error Handling: ควรมีการจัดการ Error ที่อาจเกิดขึ้น เช่น กรณีที่ผู้ใช้ป้อน OTP ผิดหลายครั้ง

การใช้งาน SMS Verification

SMS Verification เป็นอีกรูปแบบหนึ่งของ 2FA ที่ใช้การส่งรหัส OTP ผ่าน SMS ไปยังโทรศัพท์มือถือของผู้ใช้

หลักการทำงานของ SMS Verification:

  1. Phone Number Verification: ระบบจะขอให้ผู้ใช้ยืนยันหมายเลขโทรศัพท์มือถือ โดยอาจส่ง SMS ที่มี Verification Code ไปให้ผู้ใช้ป้อน
  2. OTP Generation: เมื่อผู้ใช้ต้องการเข้าสู่ระบบ, ระบบจะสร้าง OTP ที่เป็น Random Number หรือ String
  3. SMS Sending: ระบบจะส่ง SMS ที่มี OTP ไปยังหมายเลขโทรศัพท์มือถือที่ผู้ใช้ได้ยืนยันไว้
  4. Verification: ผู้ใช้จะป้อน OTP ที่ได้รับทาง SMS, และระบบจะตรวจสอบว่า OTP นั้นถูกต้องหรือไม่

ตัวอย่างการใช้งาน SMS Verification ใน PHP:

เราสามารถใช้ API ของผู้ให้บริการ SMS Gateway ต่างๆ เช่น Twilio, Nexmo, หรือ Vonage ในการส่ง SMS

<?php

// ตัวอย่างการใช้ Twilio API
require __DIR__ . '/vendor/autoload.php';

use Twilio\Rest\Client;

// Your Account SID and Auth Token from twilio.com/console
$account_sid = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // แทนที่ด้วย Account SID ของคุณ
$auth_token = "your_auth_token"; // แทนที่ด้วย Auth Token ของคุณ

// หมายเลขโทรศัพท์ของผู้รับ
$to = "+66812345678"; // แทนที่ด้วยหมายเลขโทรศัพท์ของผู้รับ

// หมายเลขโทรศัพท์ของ Twilio
$from = "+15017250604"; // แทนที่ด้วยหมายเลขโทรศัพท์ของ Twilio ของคุณ

// สร้าง OTP
$otp = rand(100000, 999999);

// ข้อความ SMS
$message = "Your verification code is: " . $otp;

try {
    // Initialize the Twilio client
    $client = new Client($account_sid, $auth_token);

    // Send the SMS
    $client->messages->create(
        $to,
        [
            'from' => $from,
            'body' => $message,
        ]
    );

    echo "SMS sent successfully!\n";

    // เก็บ OTP ไว้ใน Session หรือฐานข้อมูล (และหมดอายุหลังจากช่วงเวลาที่กำหนด)
    session_start();
    $_SESSION['otp'] = $otp;
    $_SESSION['otp_expiry'] = time() + (5 * 60); // หมดอายุใน 5 นาที

} catch (Exception $e) {
    echo "Error sending SMS: " . $e->getMessage() . "\n";
}

?>

คำอธิบาย Code:

  • ต้องติดตั้ง Twilio PHP Library ก่อน: composer require twilio/sdk
  • แทนที่ $account_sid, $auth_token, $to, และ $from ด้วยค่าที่ถูกต้อง
  • rand(100000, 999999): สร้าง OTP ที่เป็น Random 6-Digit Number
  • เก็บ OTP ไว้ใน Session หรือฐานข้อมูล และกำหนดเวลาหมดอายุ เพื่อป้องกันการนำ OTP เก่ามาใช้ซ้ำ

ข้อควรระวัง:

  • SMS Delivery Reliability: การส่ง SMS อาจไม่น่าเชื่อถือเสมอไป เนื่องจากปัจจัยต่างๆ เช่น เครือข่าย, ผู้ให้บริการ, หรือ Spam Filtering
  • SMS Cost: การส่ง SMS มีค่าใช้จ่าย ดังนั้นควรพิจารณาปริมาณการใช้งานและเลือกผู้ให้บริการที่เหมาะสม
  • Security: SMS ไม่ได้เข้ารหัส ดังนั้นอาจถูกดักฟังได้ (แต่โอกาสเกิดขึ้นน้อย)

Trade-offs: SMS Verification ใช้งานง่ายและสะดวกสำหรับผู้ใช้ แต่มีความปลอดภัยน้อยกว่า TOTP และมีค่าใช้จ่ายมากกว่า

แนวปฏิบัติที่ดี:

  • เสนอทางเลือก: ควรให้ผู้ใช้เลือกได้ว่าจะใช้ TOTP หรือ SMS Verification
  • สำรอง: เตรียมช่องทางสำรองในการเข้าถึงบัญชี ในกรณีที่ผู้ใช้ไม่สามารถเข้าถึง 2FA ได้ (เช่น Recovery Code)
  • แจ้งเตือน: แจ้งเตือนผู้ใช้เมื่อมีการเปิดใช้งานหรือเปลี่ยนแปลงการตั้งค่า 2FA

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

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์