Mã OTP là mật khẩu chỉ dùng một lần, xuất hiện mỗi khi bạn đăng nhập hoặc xác nhận một giao dịch quan trọng, rồi nhanh chóng trở nên vô giá trị. Dãy số ngắn ngủi đó đứng giữa tài khoản của bạn và người lạ, nên cách mã sinh ra và thời gian mã tồn tại quyết định rất nhiều tới độ an toàn của thao tác đang thực hiện.
Mã OTP là gì?
OTP là viết tắt của One-Time Password, tức mật khẩu dùng một lần. Khác với mật khẩu cố định bạn gõ mỗi lần đăng nhập, mã OTP chỉ xác nhận đúng một thao tác cụ thể, trong một khoảng thời gian ngắn, rồi tự hết hiệu lực dù bạn chưa kịp dùng hay đã dùng xong. Cơ chế này ra đời để vá điểm yếu lớn nhất của mật khẩu tĩnh: mật khẩu tĩnh một khi lộ ra thì kẻ xấu dùng lại được nhiều lần, còn mã OTP lộ ra muộn vài phút cũng chỉ còn là dãy số đã hết hạn.
Trong đời sống hằng ngày tại Việt Nam, bạn gặp mã OTP khi đăng nhập ngân hàng, khi bật bảo mật hai lớp cho email, hoặc khi đổi mật khẩu. Nhập đúng mã chứng tỏ bạn đang giữ thiết bị hoặc kênh liên lạc đã đăng ký với dịch vụ, tức lớp xác thực thứ hai đứng sau mật khẩu.

Vì sao mã trong ứng dụng xác thực đổi mỗi 30 giây?
Loại mã đổi mỗi 30 giây mà bạn thấy trong ứng dụng xác thực có tên riêng là TOTP, viết tắt của Time-based One-Time Password. Chuẩn này được mô tả trong RFC 6238 của tổ chức IETF, công bố năm 2011. Khi bạn quét mã QR để bật xác thực hai lớp, máy chủ và ứng dụng trên điện thoại của bạn cùng giữ một khóa bí mật chung, rồi hai bên tự tính ra cùng một mã từ thời gian hiện tại mà không cần trao đổi thêm.
Cách tính có thể tóm gọn trong một công thức duy nhất, trong đó thời gian Unix hiện tại được chia cho 30 để tạo ra một bộ đếm, rồi bộ đếm đó đi qua hàm HMAC với khóa bí mật chung:
T = floor(thời gian Unix hiện tại / 30); TOTP = HOTP(khóa bí mật, T), lấy 6 chữ số cuối
Cứ mỗi 30 giây, bộ đếm T tăng thêm 1, mã mới hoàn toàn khác mã trước, và mã cũ không còn giá trị. Con số 30 giây là bước thời gian mặc định mà RFC 6238 khuyến nghị, đủ dài để bạn kịp đọc và nhập mã, nhưng đủ ngắn để mã bị lộ cũng nhanh chóng vô dụng. Phép tính kiểm chứng theo vector thử trong Phụ lục B của RFC 6238 cho ra kết quả khớp hoàn toàn: tại thời điểm Unix 59, bộ đếm bằng 1, mã SHA-1 8 chữ số là 94287082, và bản rút gọn 6 chữ số của cùng phép tính là 287082.
Một chi tiết thực tế khiến nhiều người thắc mắc: mã trên màn hình đổi sau 30 giây, nhưng mã vừa hết hạn đôi khi vẫn được chấp nhận. Nguyên nhân nằm ở dung sai lệch giờ: đồng hồ điện thoại và đồng hồ máy chủ có thể chênh nhau vài giây, nên máy chủ thường chấp nhận thêm mã của cửa sổ trước hoặc cửa sổ sau, tức dung sai ±1 cửa sổ. Vì vậy, một mã TOTP trên thực tế có thể được chấp nhận trong tối đa khoảng 90 giây, dù mã hiển thị chỉ tồn tại 30 giây.

Ba dạng mã thường gặp: SMS OTP, TOTP và HOTP
Ba dạng mã dưới đây bao quát gần hết những gì bạn gặp hằng ngày, và điểm khác biệt cốt lõi nằm ở chỗ mã sinh ra ở đâu và điều gì khiến mã hết hạn.
SMS OTP là mã do máy chủ sinh ngẫu nhiên rồi gửi qua tin nhắn tới số điện thoại bạn đã đăng ký. Mã này được máy chủ lưu tạm cùng một thời hạn, thường là vài phút tùy dịch vụ, và sẽ vô hiệu khi hết hạn hoặc sau khi dùng. Ưu điểm của SMS OTP là không cần cài thêm ứng dụng, nhưng mã phải đi qua mạng di động, nên phụ thuộc sóng, có thể tới chậm, và có thể bị chiếm đoạt nếu kẻ xấu tráo SIM để chuyển số điện thoại của bạn sang SIM khác.
TOTP, như đã trình bày ở mục trước, sinh ngay trên thiết bị của bạn từ khóa bí mật và thời gian, hoạt động cả khi không có sóng hay mạng, và đổi mã mỗi 30 giây. HOTP là tiền thân của TOTP, được chuẩn hóa trong RFC 4226 từ năm 2005, và thay thời gian bằng một bộ đếm tăng dần sau mỗi lần bấm. Token cứng bấm nút lấy mã là ví dụ điển hình của HOTP, và điểm yếu của dạng này là bộ đếm có thể lệch nếu bạn bấm lấy mã nhiều lần mà không dùng, khiến mã trên thiết bị đi trước mã máy chủ đang chờ.
| Dạng mã | Mã sinh ra ở đâu | Điều gì khiến mã đổi | Cần mạng không |
|---|---|---|---|
| SMS OTP | Máy chủ sinh ngẫu nhiên, gửi qua tin nhắn | Hết hạn sau vài phút hoặc sau khi dùng | Cần sóng di động |
| TOTP | Ứng dụng xác thực, từ khóa bí mật và thời gian | Mỗi 30 giây | Không, sau khi quét mã QR lần đầu |
| HOTP | Token cứng hoặc ứng dụng, từ khóa bí mật và bộ đếm | Mỗi lần bấm lấy mã | Không |
Khi cần một mã dùng thử để hình dung cách mã dùng một lần được tạo ra, bạn có thể mở Trình tạo mã OTP của Công Cụ Việt. Công cụ này thuộc nhóm công cụ bảo mật của site, cùng nhóm với Trình tạo chuỗi mật khẩu ngẫu nhiên đã được so sánh kỹ trong bài So sánh trình tạo mật khẩu ngẫu nhiên. Về lâu dài, nhiều dịch vụ đang chuyển từ mã dùng một lần sang passkey, vốn không còn dãy số để kẻ xấu lừa lấy trong lúc đăng nhập.

Mã ngắn không đồng nghĩa mã an toàn tuyệt đối
Thời gian sống ngắn giúp mã OTP chống lại kiểu tấn công dùng lại mã đã lộ, nhưng không chặn được kiểu lừa đảo dùng mã ngay lập tức. Một trang đăng nhập giả mạo có thể hỏi mã OTP của bạn và nhập mã đó vào trang thật trong cùng cửa sổ 30 giây, đủ nhanh để qua mặt hệ thống. Vì vậy, nguyên tắc quan trọng nhất khi dùng mã OTP là không bao giờ đọc mã cho người khác qua điện thoại hay tin nhắn, kể cả khi người gọi tự xưng là nhân viên ngân hàng hoặc nhân viên hỗ trợ kỹ thuật, vì không dịch vụ nghiêm túc nào hỏi mã này của bạn.
Với SMS OTP, dấu hiệu đáng cảnh giác là điện thoại đột ngột mất sóng kéo dài trong khi bạn không di chuyển, vì đó có thể là dấu hiệu số điện thoại đã bị chuyển sang SIM khác. Với mã trong ứng dụng xác thực, rủi ro lớn nhất lại nằm ở khâu lưu trữ: nếu mất điện thoại mà không còn mã khôi phục, bạn có thể mất luôn quyền truy cập tài khoản.

Checklist áp dụng nhanh:
- Khi dịch vụ cho chọn, ưu tiên mã trong ứng dụng xác thực thay cho mã SMS, vì mã sinh ngay trên thiết bị và không phụ thuộc sóng di động.
- Bật đồng bộ giờ tự động trên điện thoại, và nếu mã vừa đổi ngay lúc nhập thì chờ mã của cửa sổ tiếp theo thay vì nhập lại mã cũ.
- Lưu mã khôi phục vào nơi an toàn tách khỏi điện thoại ngay khi bật xác thực hai lớp, và không đọc mã OTP cho bất kỳ ai qua điện thoại hay tin nhắn.
Câu hỏi thường gặp
Mã đổi ngay lúc đang nhập thì phải làm sao?
Bạn chờ mã mới của cửa sổ tiếp theo rồi nhập mã đó, vì mã cũ đã hết giá trị hiển thị và việc nhập lại mã cũ chỉ làm mất thêm thời gian. Nếu mã mới vẫn bị từ chối nhiều lần liên tiếp, bạn kiểm tra lại đồng bộ giờ tự động trên điện thoại trước khi thử tiếp.
Đi nước ngoài không có sóng thì còn nhận được mã xác thực không?
Mã trong ứng dụng xác thực vẫn sinh bình thường vì mã tính từ khóa bí mật và thời gian, không cần sóng hay mạng. Mã SMS thì ngược lại, phụ thuộc sóng di động và dịch vụ chuyển vùng, nên có thể tới chậm hoặc không tới khi bạn ở ngoài vùng phủ sóng quen thuộc.
Mất điện thoại thì lấy lại tài khoản bật xác thực hai lớp bằng cách nào?
Bạn dùng mã khôi phục mà dịch vụ đã cấp khi bật xác thực hai lớp, hoặc đi theo quy trình khôi phục tài khoản của chính dịch vụ đó, thường yêu cầu xác minh danh tính qua email hoặc giấy tờ. Vì vậy, mã khôi phục cần được lưu trước khi sự cố xảy ra, chứ không thể tạo lại sau khi điện thoại đã mất.
Nguồn tham khảo: RFC 4226 (HOTP, IETF, 2005); RFC 6238 (TOTP, IETF, 2011) kèm vector thử tại Phụ lục B; các con số trong ví dụ kiểm chứng được tính tay theo đúng thuật toán RFC 6238 với khóa bí mật 12345678901234567890 tại thời điểm Unix 59. Bài viết mang tính giáo dục về khái niệm bảo mật, không phải tư vấn bảo mật cho một hệ thống cụ thể.

