Mật khẩu (Password) là công nghệ bảo mật lỗi thời nhất lịch sử loài người.
- Dễ đoán: "123456", "password".
- Dễ lộ: Dùng chung mật khẩu cho nhiều web.
- Dễ phishing: Nhập vào trang fake.
MFA (Multi-Factor Authentication) yêu cầu kẻ tấn công phải có hai thứ:
- Thứ bạn biết (Password).
- Thứ bạn có (Điện thoại/Token).
1. TOTP (Time-based One-Time Password)
Đây là chuẩn công nghiệp cho mã 2FA (6 số thay đổi mỗi 30s) mà bạn thấy trên Google Authenticator hoặc Authy.
Cơ chế hoạt động (Không cần Internet!)
- Setup: Server tạo ra một chuỗi bí mật (Secret Key).
- QR Code: Server mã hóa Secret Key thành QR Code. User dùng App quét mã này để lưu Secret vào điện thoại.
- Generate: Cả Server và Điện thoại đều dùng Secret Key + Thời gian hiện tại (Unix Time) để tính toán ra mã 6 số. Do dùng chung công thức, mã này trùng khớp nhau dù điện thoại đang Offline.
2. Quy trình triển khai (Implementation Flow)
Bước 1: Generate Secret & QR
Sử dụng thư viện otplib và qrcode.
import { authenticator } from 'otplib';
import qrcode from 'qrcode';
// 1. Tạo secret ngẫu nhiên cho user
const secret = authenticator.generateSecret();
// 2. Tạo URL chuẩn (otpauth://)
const otpauth = authenticator.keyuri('user@email.com', 'MyApp', secret);
// 3. Tạo QR Code image url
const imageUrl = await qrcode.toDataURL(otpauth);
// -> Gửi imageUrl xuống Client để hiển thị cho User quétBước 2: Verify Token
Khi user nhập 6 số từ app:
const isValid = authenticator.check(userToken, userSecret);
if (isValid) {
// Save secret vào DB (Chính thức bật 2FA)
await db.user.update({ where: { id }, data: { twoFactorSecret: secret } });
}3. Backup Codes (Mã dự phòng)
Chuyện gì xảy ra nếu User mất điện thoại? Họ sẽ bị khóa vĩnh viễn khỏi tài khoản. => Luôn phải tạo ra 10 mã dự phòng (Backup Codes) khi kích hoạt 2FA. User phải lưu lại để dùng trong tình huống khẩn cấp.
4. UI/UX Tips
- Đừng bắt bật 2FA ngay: Hãy để nó là tùy chọn (Settings -> Security).
- Enforce for Admin: Với tài khoản Admin/Staff, BẮT BUỘC phải bật 2FA.
- Trust This Device: Cho phép user tick "Không hỏi lại trên thiết bị này trong 30 ngày". (Lưu 1 cookie đặc biệt).
Kết luận
Triển khai 2FA không khó về code, nhưng khó về UX. Đừng làm nó quá phiền phức khiến user nản lòng. Nhưng với các ứng dụng Fintech hay quản trị, 2FA là tính năng "Must-have" để ngủ ngon mỗi tối.