Bộ tạo TOTP

Kết quả

Mỗi khi Google Authenticator hay Authy hiển thị một mã sáu chữ số thay đổi sau mỗi 30 giây, đó chính là TOTP: một giá trị HMAC được tính từ khóa bí mật dùng chung và thời gian Unix hiện tại, đã được chuẩn hóa trong RFC 6238. Bộ tạo này tính ra đúng các mã đó từ bất kỳ khóa bí mật Base32 nào, rất tiện để gỡ lỗi một tích hợp xác thực hai yếu tố (2FA) mới, tìm hiểu vì sao một dịch vụ từ chối mã của bạn, hoặc quan sát thuật toán phản ứng thế nào với các tham số khác nhau. Hãy chỉ dùng khóa thử nghiệm: mã được tính trên máy chủ của chúng tôi, nên các khóa bí mật thật đang bảo vệ tài khoản của bạn phải nằm trong ứng dụng xác thực, không phải trên bất kỳ trang web nào.

Bộ tạo TOTP này hoạt động như thế nào

  1. 1

    Dán khóa bí mật Base32

    Gồm chữ cái A-Z và chữ số 2-7, đúng định dạng bên trong mã QR otpauth://. Khoảng trắng và chữ thường không sao; ký tự khác sẽ bị báo là Base32 không hợp lệ.

  2. 2

    Chọn thuật toán băm

    Hầu hết mọi dịch vụ dùng SHA-1; chỉ chuyển sang SHA-256 hoặc SHA-512 khi dịch vụ yêu cầu rõ ràng.

  3. 3

    Đặt số chữ số và chu kỳ

    Chọn 6, 7 hoặc 8 chữ số và cửa sổ 30 hoặc 60 giây. Tổ hợp tiêu chuẩn là 6 chữ số mỗi 30 giây.

  4. 4

    Đọc mã hiện tại

    Mã được làm mới mỗi giây, và bộ đếm ngược cho biết cửa sổ hiện tại còn lại bao nhiêu giây.

  5. 5

    So sánh URI otpauth

    Công cụ hiển thị URI otpauth:// tương ứng với các tham số của bạn, để bạn đối chiếu với nội dung mà mã QR thiết lập của dịch vụ mã hóa.

Giải thích thuật toán một cách đơn giản

TOTP là HOTP (mật khẩu dùng một lần dựa trên HMAC, RFC 4226) trong đó bộ đếm được thay bằng thời gian Unix hiện tại chia cho bước thời gian (thường là 30 giây):

counter = floor(unix_time / 30)
hash = HMAC-SHA1(secret, counter_as_8_byte_big_endian)
offset = last byte of hash AND 0x0F
truncated = 4 bytes from offset, with the top bit zeroed
code = truncated mod 10^digits

Thiết bị của bạn và máy chủ thực hiện cùng một phép tính trên cùng một khóa bí mật và cùng một đồng hồ, nên cả hai cho ra cùng một mã mà mã đó chưa bao giờ phải truyền đi đâu cả. Mã 6 chữ số đơn giản là HMAC đã cắt gọn lấy phần dư theo 10^6. Không có phép màu, chỉ là băm.

Các tham số thường gặp

Dịch vụ Thuật toán Chữ số Chu kỳ
Hầu hết website và ứng dụng SHA-1 6 30 giây
GitHub SHA-1 6 30 giây
Cloudflare SHA-1 6 30 giây
Tài khoản Microsoft SHA-1 6 30 giây
Một số ngân hàng và VPN doanh nghiệp SHA-256 hoặc SHA-512 8 60 giây

Nếu một dịch vụ từ chối mã của bạn, hãy kiểm tra số chữ số và chu kỳ trước, rồi mới đến thuật toán. Cũng cần lưu ý rằng một số ứng dụng xác thực âm thầm bỏ qua các tham số không mặc định (Google Authenticator trước đây coi mọi thứ là SHA-1, 6 chữ số, 30 giây), vì vậy hãy luôn thử với đúng ứng dụng mà người dùng của bạn sẽ dùng.

Cất giữ khóa bí mật an toàn

  • Không bao giờ gửi khóa bí mật 2FA qua email hay tin nhắn. Một khi đã nằm trong hộp thư, nó sẽ tồn tại vô thời hạn trong nhật ký và bản sao lưu của nhà cung cấp.
  • Đăng ký bằng cách quét mã QR. Mã QR chứa một URI otpauth://totp/... gói khóa bí mật, thuật toán, số chữ số và chu kỳ vào một khối duy nhất, không thể hiểu nhầm.
  • Sao lưu ngay lúc đăng ký. Lưu mã khôi phục, hoặc chính khóa bí mật, vào trình quản lý mật khẩu; mất điện thoại mà không có chúng là bạn bị khóa ngoài tài khoản.
  • Mỗi dịch vụ một khóa riêng. Dịch vụ nào cũng phát hành khóa bí mật riêng khi thiết lập; nếu một khóa bị lộ, hãy đăng ký lại 2FA ở đó để khóa cũ hết hiệu lực.

Lệch thời gian

TOTP chỉ hoạt động khi hai đồng hồ khớp nhau. Trang này tính mã bằng đồng hồ của máy chủ, nên nếu mã ở đây khác với ứng dụng xác thực trên điện thoại, nghi phạm đầu tiên là đồng hồ của thiết bị. Đa số hệ thống kiểm tra chấp nhận lệch một cửa sổ về mỗi phía (30 đến 60 giây); vượt quá mức đó, hãy đồng bộ đồng hồ thiết bị qua NTP trước khi đổ lỗi cho khóa bí mật.

Chỉ dùng khóa thử nghiệm tại đây

Công cụ này tính mã trên máy chủ của chúng tôi: khóa bí mật bạn nhập được truyền qua HTTPS ở mỗi lần cập nhật, và cũng xuất hiện trong URL của trang khi bạn di chuyển giữa các bước của công cụ. Điều đó hoàn toàn ổn cho phát triển, demo và gỡ lỗi với các khóa dùng xong bỏ. Nhưng đây không phải chỗ cho khóa bí mật thật đang bảo vệ email hay tài khoản ngân hàng của bạn; những khóa đó phải nằm trong ứng dụng xác thực chuyên dụng trên điện thoại. Nếu bạn đã lỡ dán một khóa thật ra ngoài ứng dụng xác thực, hãy đăng ký lại 2FA ở dịch vụ đó để thay khóa.

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

Hãy coi trang này là công cụ dành cho lập trình và kiểm thử, không phải két sắt. Mã được tính ở phía máy chủ, nên khóa bí mật đi đến máy chủ của chúng tôi qua HTTPS và có thể xuất hiện trong URL của trang giữa các bước. Cứ thoải mái dùng khóa demo hoặc khóa phát triển; tuyệt đối không dán khóa thật của tài khoản mà bạn coi trọng. Nếu đã lỡ dán, hãy đăng ký lại 2FA ở dịch vụ đó để thay khóa.

Kiểm tra tham số trước: thuật toán, số chữ số và chu kỳ phải trùng khớp hoàn toàn với những gì dịch vụ đã cấp. Sau đó kiểm tra đồng hồ: trang này dùng đồng hồ máy chủ, nên nếu lệch thì thường là do thiết bị còn lại. Cuối cùng, nhớ rằng một số ứng dụng bỏ qua tham số không mặc định; ví dụ kinh điển là Google Authenticator.

Chỉ Base32: chữ cái từ A đến Z và chữ số từ 2 đến 7, có thể kèm ký tự đệm =. Khoảng trắng được loại bỏ và chữ thường được chuyển đổi tự động. Khóa dạng hex hoặc byte thô phải được chuyển sang Base32 trước, nếu không công cụ sẽ báo khóa Base32 không hợp lệ.

Bạn sẽ bị khóa ngoài 2FA của tài khoản đó. Hãy dùng quy trình khôi phục của dịch vụ (mã khôi phục, xác minh danh tính, phương án SMS dự phòng). Khi thiết lập, luôn cất mã khôi phục hoặc mã QR ban đầu ở nơi an toàn.

Có. Hãy tạo một khóa bí mật ngẫu nhiên ở phía máy chủ, tối thiểu 128 bit (RFC 4226 khuyến nghị 160), hiển thị nó đúng một lần dưới dạng mã QR, rồi xác thực mã người dùng gửi lên bằng cách tính cùng một HMAC, thường chấp nhận lệch một cửa sổ về mỗi phía. Thư viện trưởng thành có cho mọi nền tảng: pyotp (Python), otplib (JavaScript), rotp (Ruby).

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác