Mật khẩu admin panel dieukhien.tencongty.vn bị lộ do phishing. Hacker đăng nhập ngay — vì chỉ cần nhập đúng mật khẩu là vào được. Bây giờ thử tưởng tượng: ngay cả khi kẻ đó có mật khẩu, vẫn có một lớp thứ hai yêu cầu mã 6 số thay đổi mỗi 30 giây, chỉ tồn tại trên điện thoại của bạn. Đó là nguyên lý của 2FA bằng TOTP (Time-based One-Time Password).

TOTP không cần SMS, không cần internet khi tạo mã, và không có đường bypass qua email reset. Đây là dạng 2FA được khuyến nghị cho mọi hệ thống quản trị quan trọng — và bài này sẽ hướng dẫn bạn triển khai cũng như kiểm thử nó từng bước.

Tạo mã TOTP ngay: mở công cụ tạo mã TOTP, nhập secret key của bạn, công cụ sẽ sinh mã 6 số hiện hành và đếm ngược thời gian còn lại. Không cần cài app, cũng không cần đăng nhập.

TOTP hoạt động thế nào? Khác SMS OTP ra sao?

TOTP là một thuật toán chuẩn (RFC 6238): mã 6 số được tính từ secret key cố định kết hợp với thời gian hiện tại (làm tròn theo khoảng 30 giây). Cả máy chủ lẫn ứng dụng xác thực (Google Authenticator, Authy…) đều tính mã theo cùng công thức — nếu đồng hồ đúng, hai bên cho ra kết quả giống nhau.

Tiêu chíSMS OTPTOTPQua mạngCó — gửi qua SMS/SIMKhông — tính offline trên thiết bịNguy cơ SIM swapCóKhôngCần internet khi tạo mãCóKhôngThay đổi theoMỗi lần gửi yêu cầuMỗi 30 giây (time-based)Ứng dụng phổ biếnKhông cần app riêngGoogle Authenticator, Authy, Aegis

Nền tảng kỹ thuật: TOTP dùng HMAC-SHA1 (hoặc SHA-256/SHA-512) với secret là khóa và timestamp là thông điệp — kết quả rút gọn thành 6 chữ số. Hiểu được cơ chế này giúp ích khi cần debug mã không khớp giữa server và client.

4 bước cài và kiểm thử TOTP

Bước 1 — Sinh secret key và kiểm thử mã OTP đầu tiên

Mỗi tài khoản cần một secret key riêng — đây là "hạt nhân" của TOTP. Secret thường là một chuỗi Base32 (ví dụ JBSWY3DPEHPK3PXP), do hệ thống sinh ngẫu nhiên khi bạn bật 2FA.

👉 Tạo và kiểm thử TOTP: công cụ tạo mã TOTP (nhập secret Base32, xem mã 6 số hiện tại và đếm ngược còn bao nhiêu giây).

Ví dụ: nhập secret JBSWY3DPEHPK3PXP vào công cụ — bạn sẽ thấy mã 6 số hiện hành và dải countdown. Đây là mã bạn cần nhập vào ứng dụng của mình để xác nhận 2FA đang hoạt động đúng trước khi hoàn tất kích hoạt.

Lỗi hay gặp:

  • Kích hoạt 2FA mà chưa test mã: bật 2FA xong mà quên quét QR hoặc test thử — đăng xuất ra rồi vào lại không được vì app chưa có secret. Luôn test mã trước khi bấm "Hoàn tất".

  • Dùng secret demo làm secret thật: JBSWY3DPEHPK3PXP là ví dụ công khai trong tài liệu — không dùng làm secret thật cho tài khoản sản xuất.

  • Lưu secret ở nơi không an toàn: secret TOTP phải được bảo vệ tương tự mật khẩu. Nếu bị lộ, kẻ tấn công có thể tạo mã OTP mà không cần điện thoại của bạn.

Bước 2 — Xác minh logic xác thực bằng auth hash

Khi xây dựng tính năng 2FA vào ứng dụng, bạn cần kiểm tra rằng logic so sánh mã OTP chạy đúng — kể cả với window lệch thời gian (±1 khoảng 30 giây).

👉 Kiểm tra auth hash: công cụ tạo auth hash (sinh hash xác thực, kiểm tra giá trị expected vs actual).

Ví dụ: dùng công cụ để tính giá trị hash mong đợi với secret và timestamp cho trước, rồi so sánh với những gì server của bạn đang tính — nếu khác nhau, lỗi nằm ở encoding hoặc cách xử lý timestamp.

Lỗi hay gặp:

  • Không xử lý window lệch: nếu đồng hồ server lệch vài chục giây so với điện thoại người dùng, mã hợp lệ có thể bị từ chối. Chuẩn RFC 6238 khuyến nghị chấp nhận window ±1 (tức mã của khoảng trước và khoảng sau đều hợp lệ) để giảm thiểu lỗi đồng hồ nhỏ.

Bước 3 — Kiểm tra nền tảng HMAC của TOTP

Hiểu được HMAC-SHA1 đang tính toán gì giúp bạn debug khi mã không khớp giữa server và client mà không biết bắt đầu từ đâu.

👉 Kiểm tra HMAC: công cụ kiểm tra HMAC (nhập key và message, xem HMAC output — hữu ích khi debug TOTP thủ công).

Ví dụ debug thực tế: nếu server và client cùng secret nhưng ra mã khác nhau, có thể do encoding khác nhau (Base32 vs raw bytes) hoặc timestamp tính theo múi giờ khác nhau. Kiểm tra từng bước HMAC sẽ giúp xác định chính xác điểm sai thay vì đoán mò.

Lỗi hay gặp:

  • Nhầm encoding secret: TOTP chuẩn dùng secret dạng Base32 decode trước khi tính HMAC, không phải chuỗi Base32 thô. Sai bước này sẽ cho ra mã hoàn toàn khác dù secret đúng.

Bước 4 — Tạo QR code để quét bằng Google Authenticator

Cách người dùng thêm secret vào app xác thực (Google Authenticator, Authy…) thông thường là quét QR code. QR này mã hóa URI dạng otpauth://totp/... chứa secret, issuer và account name.

👉 Tạo QR: công cụ tạo mã QR (dán URI otpauth://totp/..., tải QR PNG để nhúng vào trang bật 2FA).

Định dạng URI chuẩn:

otpauth://totp/TenCongTy:user@congty.vn?secret=JBSWY3DPEHPK3PXP&issuer=TenCongTy&algorithm=SHA1&digits=6&period=30

Lỗi hay gặp:

  • Issuer và account name có ký tự đặc biệt không encode: nên URL-encode toàn bộ các phần nếu có ký tự đặc biệt, để tránh app xác thực đọc sai.

  • Không thêm issuer: nếu thiếu, app xác thực chỉ hiện account name mà không có tên ứng dụng — người dùng không phân biệt được tài khoản nào khi có nhiều mục.

Nếu mã OTP không khớp thì xử lý thế nào?

Lý do phổ biến nhất khiến TOTP không khớp là đồng hồ lệch giữa server và điện thoại người dùng. Một vài điểm cần kiểm tra:

  • Server: đảm bảo NTP đang chạy và đồng hồ hệ thống chính xác. Lệch quá 30 giây là đủ để mã hết hạn trước khi kiểm tra xong.

  • Điện thoại người dùng: trên Android và iOS có thể đồng bộ lại thời gian thủ công. Trong Google Authenticator còn có tùy chọn "Correct time" riêng.

  • Cửa sổ chấp nhận: cấu hình server chấp nhận thêm ±1 khoảng 30 giây (tổng 90 giây window) để giảm thiểu lỗi đồng hồ nhỏ mà không làm suy yếu đáng kể bảo mật.

Nếu đã kiểm tra đồng hồ mà vẫn lỗi, hãy dùng công cụ tạo mã TOTP với cùng secret để xem mã dự kiến, rồi đối chiếu với mã app đang hiện — đây là cách debug nhanh nhất để xác định sai ở server hay client.

Câu hỏi thường gặp (FAQ)

2FA bằng TOTP có mạnh hơn SMS OTP không? Về kỹ thuật thì có: TOTP không đi qua mạng di động, không bị SIM swap hay chặn tin nhắn. Điểm yếu duy nhất là nếu điện thoại bị đánh cắp và không có PIN bảo vệ app, hoặc nếu secret bị lộ. Với đa số hệ thống quản trị, TOTP vẫn là lựa chọn tốt hơn SMS OTP rõ rệt.

Nếu mất điện thoại thì đăng nhập bằng gì? Đây là câu hỏi cần trả lời trước khi bật 2FA. Hầu hết hệ thống cung cấp recovery codes (mã dự phòng dùng một lần) khi bật 2FA — hãy lưu chúng vào nơi an toàn, không phải trên điện thoại đang dùng. Một số app như Authy có cloud backup; Aegis có backup file mã hóa.

Một secret có thể dùng cho nhiều tài khoản không? Về kỹ thuật thì công thức tính mã không phụ thuộc vào tài khoản, chỉ phụ thuộc secret và thời gian. Nhưng bảo mật tốt là mỗi tài khoản có secret riêng: nếu secret bị lộ thì chỉ ảnh hưởng một tài khoản đó, không kéo theo những tài khoản khác.

TOTP có thể bị phishing không? Có, nhưng khó hơn nhiều. Kẻ tấn công phải làm real-time phishing — chuyển tiếp mã ngay trong vòng 30 giây, với toàn bộ cơ sở hạ tầng phức tạp hơn. Nếu bảo mật là ưu tiên tối cao, WebAuthn/passkey mạnh hơn vì hoàn toàn chặn phishing theo cách TOTP không làm được.


BKNS Tools — bộ công cụ bảo mật miễn phí cho developer và sysadmin Việt. Tạo mã TOTP · Auth hash · Kiểm tra HMAC · Tạo QR code — không cần đăng nhập.