HOTP
HOTP (mật khẩu một lần dựa trên HMAC, RFC 4226) là anh em dựa trên bộ đếm của TOTP. Trong khi TOTP tiến theo đồng hồ, HOTP tiến theo một bộ đếm chung mà cả token lẫn máy chủ đều tăng mỗi khi sử dụng mã. HOTP là chế độ chuẩn cho YubiKey OATH, token phần cứng cũ và một số luồng ngân hàng khi máy chủ không thể dựa vào đồng hồ đồng bộ.
URI scheme:Google Authenticator Key URI Format, scheme
otpauth:// mà mọi ứng dụng xác thực đồng thuận. Đặc tả liên quan:TOTP (RFC 6238), biến thể dựa trên thời gian xây dựng trên HOTP.
Tổng quan
QR đăng ký HOTP là URL theo scheme otpauth:// với hotp là loại. Nó mang bí mật HMAC chia sẻ và giá trị bộ đếm mà cả hai bên phải giữ đồng bộ. Định dạng:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL-encoded. Ví dụ:YubiKey:alice@example.com. - secret, khóa HMAC chia sẻ, mã hóa Base32 (RFC 4648 §6: A-Z, 2-7).
- counter, giá trị bộ đếm bắt đầu. Thường là
0, nhưng có thể tiếp tục từ giá trị đã biết khi đăng ký lại. - issuer, tên dịch vụ hiển thị trong ứng dụng xác thực.
- digits,
6(mặc định) hoặc8. RFC 4226 §5.3 quy định 6; 8 là mở rộng phổ biến. - algorithm,
SHA1trên thực tế. RFC 4226 chỉ định nghĩa SHA1; SHA256/512 là mở rộng RFC 6238 được thêm sau.
HOTP vs TOTP, nên dùng cái nào
| Thuộc tính | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Tiến theo | Bộ đếm (mỗi lần sử dụng thành công) | Đồng hồ (mỗi 30 giây) |
| Cần đồng bộ đồng hồ | Không | Có, trong ~30 giây |
| Đồng bộ lại khi lệch | Máy chủ chấp nhận N giá trị bộ đếm tiếp theo | Máy chủ chấp nhận ±1 cửa sổ |
| Triển khai điển hình | YubiKey, token phần cứng cũ, ngân hàng ngoại tuyến | Mọi 2FA người tiêu dùng, Google, Microsoft, 1Password, Authy |
| Tái sử dụng bộ đếm | Thảm họa, tiết lộ bí mật theo thời gian | Không áp dụng |
| Lỗ hổng nếu bí mật bị lộ | Mọi mã tương lai có thể đoán trước | Mọi mã quá khứ và tương lai có thể đoán trước |
Test vector chuẩn
RFC 4226 Phụ lục D cung cấp giá trị HOTP tham chiếu cho bí mật 12345678901234567890 (20 byte, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ) với đầu ra 6 chữ số:
| Bộ đếm | HOTP (6 chữ số) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
Payload QR tối giản để đăng ký tại bộ đếm 0:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0Trình xác thực bí mật Base32 trực tiếp
Cùng trình xác thực như trang TOTP. Bí mật HOTP dùng bảng chữ cái Base32 giống nhau (RFC 4648 §6: A-Z, 2-7). Chạy trên trình duyệt, không cần đến máy chủ.
Những điểm dễ sai
- Lệch bộ đếm. Nếu người dùng nhấn nút token nhưng máy chủ không ghi nhận mã (sự cố mạng, nhấp đúp), bộ đếm token chạy trước bộ đếm máy chủ. Máy chủ xử lý bằng "cửa sổ đồng bộ lại", thử N giá trị bộ đếm tiếp theo trước khi từ chối. Cửa sổ mặc định của YubiKey là ~3; triển khai bảo mật cao thu hẹp xuống 1.
- Tái sử dụng bộ đếm là thảm họa. Không bao giờ chấp nhận cùng giá trị bộ đếm hai lần. RFC 4226 §7.3 bắt buộc máy chủ từ chối mọi mã tại hoặc dưới bộ đếm được chấp nhận lần cuối.
- Xuất bộ đếm khi sao lưu. Ứng dụng xác thực xuất HOTP có thể xuất bí mật nhưng không xuất bộ đếm hiện tại. Nhập vào thiết bị mới sẽ khởi động lại bộ đếm từ 0, không khớp với máy chủ và đăng ký thực sự bị hỏng. TOTP miễn nhiễm với điều này; HOTP dễ bị ảnh hưởng.
- Base32 không phải Base64. Quy tắc giống TOTP: bí mật có
0,1,8,9, chữ thường,+hoặc/là Base64 và sẽ bị mọi ứng dụng RFC tuân thủ từ chối. - Chỉ SHA1 trên thực tế. RFC 4226 định nghĩa SHA1 là hàm HMAC. Hầu hết token phần cứng HOTP (kể cả YubiKey OATH) không triển khai SHA256/SHA512.
- Tham số digits thường bị bỏ qua. Nhiều token phần cứng cố định 6 chữ số và cắt lặng lẽ nếu yêu cầu 8. Kiểm tra trên phần cứng mục tiêu trước khi QR đến thẻ đã in.
- Không trộn HOTP và TOTP trong cùng QR. URI scheme dùng phần
TYPE(hotpvstotp) để chuyển chế độ. Một bí mật có thể phục vụ cả hai luồng, nhưng chia sẻ bí mật nghĩa là một bị xâm phạm thì cả hai đều thất bại.
Tương thích ứng dụng xác thực
| Ứng dụng / token | HOTP | SHA256/512 | 8 chữ số | Ghi chú |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/desktop) | Có | Có | Có | HOTP là chế độ chuẩn của YubiKey OATH. Hỗ trợ RFC 4226 đầy đủ. |
| Google Authenticator | Có | Bỏ qua (SHA1 only) | Bỏ qua (6 only) | Chuẩn mực thực tế. An toàn cho HOTP nhưng chỉ 6 chữ số SHA1. |
| 1Password | Có | Có | Có | Hỗ trợ RFC đầy đủ. Bộ đếm được lưu và xuất cùng với mục. |
| Bitwarden | Có | Có | Có | Hỗ trợ RFC đầy đủ. |
| Microsoft Authenticator | Có | Có | Có | Hỗ trợ RFC đầy đủ. |
| Authy | Không | , | , | Đã bỏ HOTP trong phiên bản gần đây. Chỉ TOTP. |
| Duo Mobile | Không | , | , | Dùng luồng push riêng; chỉ TOTP làm fallback. |
| Token phần cứng OATH (Feitian, Token2 v.v.) | Có | Tùy | Tùy | Thị trường HOTP phần cứng chuẩn; luôn là 6 chữ số SHA1 trừ khi datasheet nói khác. |
Xem thêm
- /hotp-qr-code/, bộ tạo HOTP với xác thực bộ đếm và Base32 trực tiếp.
- /standards/totp/, biến thể dựa trên thời gian (RFC 6238).
- /totp-2fa-qr-code/, bộ tạo TOTP.
- /standards/, quay lại mục lục tiêu chuẩn.