Mật khẩu một lần dựa trên thời gian

**Mật khẩu một lần dựa trên thời gian** (tiếng Anh: **Time-based one-time password**, viết tắt: **TOTP**) là một thuật toán máy tính tạo ra mật khẩu một lần (OTP) sử dụng thời gian hiện tại làm nguồn duy nhất. Là một phần mở rộng của thuật toán mật khẩu một lần dựa trên HMAC (HOTP), thuật toán này đã được sử dụng làm tiêu chuẩn  của Lực lượng Chuyên trách về Kỹ thuật Liên mạng (IETF). TOTP là nền tảng của Sáng kiến Xác thực mở (OATH) và được sử dụng trong một số hệ thống xác thực hai yếu tố.

## Lịch sử

Thông qua sự hợp tác của một số thành viên OATH, một dự thảo TOTP đã được phát triển để tạo ra một tiêu chuẩn được hỗ trợ bởi ngành công nghiệp. Nó bổ sung cho tiêu chuẩn HOTP một lần dựa trên sự kiện và nó cung cấp cho các tổ chức và doanh nghiệp người dùng cuối nhiều lựa chọn hơn trong việc lựa chọn các công nghệ phù hợp nhất với các yêu cầu ứng dụng và nguyên tắc bảo mật của họ. Vào năm 2008, OATH đã gửi một bản thảo đặc điểm kỹ thuật của TOTP cho IETF. Phiên bản này kết hợp tất cả các phản hồi và bình luận mà các tác giả nhận được từ cộng đồng kỹ thuật dựa trên các phiên bản trước được gửi tới IETF. Tháng 5 năm 2011, TOTP chính thức trở thành tiêu chuẩn RFC 6238.

## Thuật toán

Để thiết lập xác thực TOTP, người xác thực và trình xác thực phải thiết lập trước cả tham số HOTP và tham số TOTP sau:
* *T*, Thời gian Unix để bắt đầu đếm các bước thời gian (mặc định là 0),
* *T*, một khoảng thời gian sẽ được sử dụng để tính toán giá trị của bộ đếm *C* (mặc định là 30 giây).

Cả trình xác thực và người xác thực đều tính toán giá trị TOTP, sau đó trình xác thực kiểm tra xem giá trị TOTP do người xác thực cung cấp có khớp với giá trị TOTP được tạo cục bộ hay không. Một số trình xác thực cho phép các giá trị lẽ ra phải được tạo trước hoặc sau thời gian hiện tại để tính đến độ lệch nhẹ của đồng hồ, độ trễ mạng và độ trễ của người dùng.

TOTP sử dụng thuật toán HOTP, thay thế bộ đếm bằng giá trị không giảm dựa trên thời gian hiện tại:

 giá trị TOTP(*K*) = Giá trị HOTP(*K*, *C*),

tính giá trị bộ đếm

C_T = \left\lfloor\frac{T - T_0}{T_X}\right\rfloor,

tại đây mà
* *C* là số lượng thời lượng *T* giữa *T* và *T *,
* *T* là thời gian hiện tại tính bằng giây kể từ một epoch cụ thể,
* *T* là epoch được chỉ định tính bằng giây kể từ Unix epoch (ví dụ: nếu sử dụng thời gian Unix, thì *T* là bằng 0),
* *T* là độ dài của một khoảng thời gian (ví dụ: 30 giây).

Thời gian Unix không tăng lên một cách nghiêm ngặt. Khi một giây nhuận được chèn vào UTC, thời gian Unix lặp lại một giây. Nhưng một giây nhuận không làm cho phần nguyên của thời gian Unix giảm và *C* cũng không giảm miễn là *T* là bội số của một giây.

## Bảo mật

Không giống như mật khẩu, mã TOTP chỉ sử dụng một lần, vì vậy thông tin xác thực bị xâm nhập chỉ có hiệu lực trong một thời gian giới hạn. Tuy nhiên, người dùng phải nhập mã TOTP vào trang xác thực, điều này có thể tạo ra khả năng xảy ra các cuộc tấn công lừa đảo. Do khoảng thời gian ngắn để mã TOTP hợp lệ, kẻ tấn công phải ủy quyền thông tin đăng nhập trong thời gian thực.

Thông tin đăng nhập TOTP cũng dựa trên một mã bí mật được chia sẻ cho cả máy khách và máy chủ, tạo ra nhiều vị trí mà từ đó mã bí mật có thể bị đánh cắp. Kẻ tấn công có quyền truy cập vào mã bí mật được chia sẻ này có thể tạo mã TOTP mới, hợp lệ theo ý muốn. Đây có thể là một vấn đề cụ thể nếu kẻ tấn công vi phạm cơ sở dữ liệu xác thực lớn.

## Xem thêm

* Botan (thư viện phần mềm)
* FreeOTP
* Google Authenticator
* đaOTP

## Tham khảo

## Liên kết ngoài
* Step by step Python implementation in a Jupyter Notebook 
* Designing Docker Hub Two-Factor Authentication, (section "Using Time-Based One-Time Password (TOTP) Authentication").