How Time-based One-Time Passwords (TOTP) work ?

6 min read

Giới thiệu

TOTP là viết tắt của time-based one-time password (or passcode). TOTP code được tạo ra bằng thuật toán sử dụng shared secret key và current unix time làm đầu vào. Code này nhằm mục đích cấp cho người dùng quyền truy cập một lần vào ứng dụng.

TOTP có thể được triển khai bằng cả token phần cứng và phần mềm:
– Mã thông báo phần cứng TOTP thường là chìa khóa vật lý hoặc khóa bảo mật hiển thị mã hiện tại trên màn hình được tích hợp trong thiết bị.
– Mã thông báo phần mềm TOTP thường là ứng dụng xác thực trên thiết bị di động (như Authy hoặc Google Authenticator ) hiển thị mã hiện tại trên màn hình điện thoại.

Không giống như mật khẩu – là dạng tĩnh và có thể dễ dàng bị đánh cắp – mã TOTP thay đổi theo các khoảng thời gian đã đặt (mặc định là 30s) và rất khó để kẻ tấn công xâm phạm. Điều này khiến xác thực TOTP trở thành yếu tố thứ hai mạnh mẽ trong luồng xác thực đa yếu tố (MFA) hoặc xác thực hai yếu tố (2FA) .

TOTP được Lực lượng đặc nhiệm kỹ thuật Internet (IETF) công bố với tên gọi RFC 6238 vào năm 2011.

Lợi ích của việc sử dụng TOTP là gì ?

  • An toàn hơn so với việc chỉ sử dụng mật khẩu: TOTP được thiết kế để sử dụng một lần, giúp chúng chống lại replay attacks lại khi kẻ tấn công chặn và ghi lại dữ liệu (như mật khẩu tĩnh) để sử dụng sau. Sử dụng mã một lần làm yếu tố thứ hai cũng làm giảm rủi ro khi mật khẩu người dùng bị đánh cắp.  
  • Sẵn sàng áp dụng rộng rãi: Người dùng thích trình xác thực di động TOTP vì không cần phải nhớ mã và không yêu cầu phần cứng mới. Trình xác thực di động có thể được sử dụng cho cả bối cảnh doanh nghiệp và người tiêu dùng. Các ứng dụng xác thực hỗ trợ xác thực sinh trắc học sẽ thêm yếu tố thứ hai mạnh mẽ và bảo vệ người dùng ngay cả khi thiết bị của họ bị đánh cắp.
  • Có thể hoạt động ngoại tuyến: Vì thuật toán TOTP sử dụng khóa bí mật chung và thời gian Unix làm đầu vào, máy chủ và máy khách có thể tự tạo và xác thực mã một lần mà không cần kết nối Internet. Điều này giúp TOTP có thể sử dụng trong nhiều tình huống khác nhau, bao gồm khi người dùng đi du lịch quốc tế, đang trên máy bay hoặc nói chung là ở khu vực có kết nối mạng kém.

Nhược điểm của việc sử dụng TOTP

  • Sử dụng shared secrets: Seed được sử dụng trong quá trình tạo TOTP là shared secrets, đây không bao giờ là một biện pháp bảo mật lý tưởng. Shared secrets khiến máy chủ trở thành mục tiêu hấp dẫn đối với kẻ tấn công. Nếu chúng đánh cắp các bí mật, chúng có thể tạo mật mã để truy cập gian lận vào tài khoản người dùng. Điều quan trọng là shared secret phải được lưu trữ an toàn trên cả phía máy khách và máy chủ.
  • Tùy thuộc vào thiết bị của người dùng: Nếu thiết bị của người dùng bị đánh cắp, mất hoặc hỏng, trình xác thực TOTP sẽ không còn hoạt động như mong đợi. Trong những trường hợp này, ứng dụng phải tìm cách khác để xác thực người dùng trước khi cấp lại trình xác thực TOTP. Tuy nhiên, khả năng thiết bị bị mất hoặc bị đánh cắp thấp hơn nhiều so với khả năng mật khẩu bị đánh cắp hoặc bị rò rỉ.

HOTP

Để hiểu về TOTP thì bạn phải hiều về HOTP vì TOTP chính là phần mở rộng của HOTP.

HOTP là viết tắt của “HMAC-Based One-Time Password”. Thuật toán này được công bố dưới dạng RFC4226 bởi Internet Engineering Task Force (IETF). HOTP định nghĩa một thuật toán để tạo mật khẩu một lần từ khóa bí mật và bộ đếm.

Bạn có thể sử dụng thuật toán này theo hai bước:

1. Bước đầu tiên là tạo hàm băm HMAC từ khóa bí mật và bộ đếm.

hmacHash = HMAC-SHA-1(secretKey, counter);

2. Trong mã này, đầu ra sẽ là một chuỗi dài 20 byte. Chuỗi dài đó không phù hợp để làm mật khẩu một lần. Vì vậy, chúng ta cần một cách để cắt bớt chuỗi đó. HOTP định nghĩa một cách để cắt bớt chuỗi đó theo độ dài mong muốn của chúng ta.

truncatedHash = (hmacHash[offset++] & 0x7f) << 24 | (hmacHash[offset++] & 0xff) << 16 | (hmacHash[offset++] & 0xff) << 8 | (hmacHashh[offset++] & 0xff);
finalOTP = (truncatedHash % (10 ^ numberOfDigitsRequiredInOTP));

Đây là cách đơn giản và tin cậy để có thể lấy được mã OTP ngắn vài ký tự từ một chuỗi dài 20 byte.

TOTP

TOTP là viết tắt của “Time-Based One – Time Password”. Điều này được IETF công bố dưới dạng RFC6238 .

TOTP sử dụng thuật toán HOTP để lấy mật khẩu một lần. Điểm khác biệt duy nhất là nó sử dụng “Time” thay cho “counter”.

Điều đó có nghĩa là thay vì khởi tạo bộ đếm và theo dõi nó, chúng ta có thể sử dụng thời gian làm bộ đếm trong thuật toán HOTP để lấy OTP. Vì máy chủ và điện thoại đều có quyền truy cập vào thời gian, nên không bên nào trong số chúng phải theo dõi bộ đếm.

Ngoài ra, để tránh vấn đề múi giờ khác nhau của máy chủ và điện thoại, chúng ta có thể sử dụng Unix timestamp, không phụ thuộc vào múi giờ.

Tuy nhiên, thời gian Unix được định nghĩa bằng giây, vì vậy nó thay đổi mỗi giây. Điều đó có nghĩa là mật khẩu được tạo sẽ thay đổi mỗi giây, điều này không tốt. Thay vào đó, chúng ta cần thêm một khoảng thời gian đáng kể trước khi thay đổi mật khẩu. Ví dụ: Ứng dụng Google Authenticator thay đổi mã sau mỗi 30 giây.

counter = currentUnixTime / 30

QR and secret key

Mặc dù ta có thể yêu cầu người dùng nhập khóa bí mật trực tiếp vào ứng dụng điện thoại của họ, nhưng vì muốn tạo khóa bí mật khá dài vì lý do bảo mật. Yêu cầu người dùng nhập một chuỗi dài như vậy sẽ không phải là trải nghiệm thân thiện với người dùng.

Vì hầu hết điện thoại thông minh đều được trang bị camera, chúng ta có thể sử dụng camera và yêu cầu người dùng quét mã QR để lấy khóa bí mật từ camera. Vì vậy, tất cả những gì chúng ta cần làm là chuyển đổi khóa bí mật thành mã QR và hiển thị cho người dùng.

Kết thúc

Xác thực hai yếu tố đang ngày càng phổ biến. Rất nhiều ứng dụng web đang triển khai nó để tăng cường bảo mật.

Không giống như phương pháp dựa trên SMS, phương pháp TOTP cũng không đòi hỏi nhiều nỗ lực bổ sung. Vì vậy, tính năng này đáng để triển khai cho bất kỳ ứng dụng nào.

Tham khảo

Avatar photo

Unity IAP: Triển khai Mua Hàng Consumable

Giới Thiệu Việc tích hợp tính năng mua hàng trong ứng dụng Unity là không thể tránh khỏi. Mua hàng trong ứng dụng có...
Avatar photo Tam Canh Le Chi
6 min read

Leave a Reply

Your email address will not be published. Required fields are marked *