Hệ thống xác thực đa yếu tố (MFA) gồm 2 bước kiểm tra tuần tự:
Bước 1 — mật khẩu: mật khẩu thử p (chuỗi, có thể rỗng) được coi là hợp lệ khi
SHA-256(salt∥p)=H
trong đó salt là chuỗi byte giải mã từ hex, p được mã hoá UTF-8, phép ∥ là nối byte, và H (hex) là giá trị băm lưu sẵn. Nếu mật khẩu sai, quá trình dừng lại ngay, không kiểm tra OTP.
Bước 2 — TOTP có cho phép lệch giờ: nếu mật khẩu đúng, hệ thống kiểm tra mã TOTP (RFC 6238, dùng HMAC-SHA1, 6 chữ số, bước thời gian X=30 giây, mốc T0=0 — xem thuật toán TOTP ở bài "Sinh mã OTP theo thời gian") mà người dùng nhập có khớp với TOTP tại một trong 3 bộ đếm C−1,C,C+1 (với C=⌊T/30⌋) hay không — tức cho phép đồng hồ client lệch ±1 bước thời gian. Nếu khớp với bất kỳ giá trị nào trong 3 giá trị đó thì hợp lệ.
Cho salt (hex), H (hex), mật khẩu thử p, khoá TOTP K (hex), thời điểm Unix T, và mã OTP người dùng nhập o (chuỗi 6 chữ số), hãy in ra đúng một trong ba kết quả:
FAIL_PASSWORD nếu mật khẩu sai.FAIL_OTP nếu mật khẩu đúng nhưng mã OTP không khớp với cả 3 giá trị trong cửa sổ trên.OK nếu cả hai bước đều hợp lệ.Gồm 6 dòng:
Một dòng duy nhất: OK, FAIL_PASSWORD hoặc FAIL_OTP.
Ví dụ:
Đầu vào:
001122
8a73f6486c271244213e090cf992aa8b9483fb37cfcc8279f1403c6fc8563739
Passw0rd!
3132333435363738393031323334353637383930
59
287082
Đầu ra:
OK
Đầu vào:
001122
8a73f6486c271244213e090cf992aa8b9483fb37cfcc8279f1403c6fc8563739
WrongPass
3132333435363738393031323334353637383930
59
287082
Đầu ra:
FAIL_PASSWORD
Đang tải editor...