Back to Home

Khám phá Timebased OTP

Bạn đã bao giờ tự hỏi Google Authenticator hoạt động như thế nào chưa? Hoặc từng thắc mắc làm thế nào ngân hàng có thể sử dụng token để tạo mật khẩu (mật khẩu này thay đổi liên tục theo thời gian) và người dùng có thể sử dụng mật khẩu này để đăng nhập vào hệ thống ngân hàng. Điều bí ẩn là token này là một thiết bị cực nhỏ, tiêu thụ rất ít điện năng và không có kết nối internet, làm sao thiết bị này có thể tạo ra mật khẩu có thể được xác thực bởi hệ thống máy chủ ngân hàng (làm sao ngân hàng có thể xác thực được loại mật khẩu này)?

Trong bài viết này, mình sẽ giải thích cơ chế hoạt động của Timebased OTP, cũng là nguyên tắc cốt lõi của dạng mật khẩu hiện thực hóa các hệ thống 2FA (Two Factor Authentication). Tuy nhiên để đơn giản hóa, mình sẽ giản lược bớt các chi tiết kỹ thuật chi tiết mà chỉ chú trọng vào luồng chính để các bạn tiện hình dung và theo dõi cho nên sẽ không match 100% so với thực tế.

Sơ đồ hoạt động

Mô tả

  1. Máy chủ tạo số S ngẫu nhiên cho mỗi người dùng.

  2. Người dùng sẽ lưu trữ S trong ứng dụng di động của mình dưới dạng giá trị bí mật.

    1. Đối với Google Authenticator, việc này được thực hiện thông qua việc quét QRCode

    2. Đối với token ngân hàng, số này sẽ được thiết lập cho từng người dùng cụ thể mỗi lần cấp phát cho người dùng.

  3. Trên thiết bị của khách hàng (Mobile App hoặc token) sẽ có đồng hồ được kích hoạt và máy chủ sẽ ghi nhận thời gian này là T0.

  4. Sau mỗi khoảng thời gian T (thông thường là 30 giây), mật khẩu mới Px sẽ được tạo

Demo

Chi tiết thuật toán

Quy trình tạo password PxP_x (Lưu ý rằng các tính toán ở đây được mình cố tình chọn các số đơn giản, trong thực tế thì không đơn giản như vậy để tăng tính bảo mật)

Tại thời điểm TxT_x, một password PxP_x sẽ được tạo ra nhờ vào giá trị bí mật SS và một biến đếm thời gian CxC_x. CxC_x sẽ được update tăng dần theo mỗi khoảng thời gian TTthường là 15s-30s, và được tính như sau: Cx=TxT0T\displaystyle Cx = \frac {T_x - T_0} T

Lúc đó, PxP_x sẽ được tính bởi: Px=SCxmod999,983P_x = S^{C_x} \mod 999,983. Lưu ý là giá trị 999,983999,983 là một số được chọn để đảm bảo password được tạo ra giới hạn giá trị giới hạn trong 6 chữ số. (again, đây là một công thức mình dùng để đơn giản hóa tính toán chứ không phải dùng trong thực tế nhé)

Comments

0/300

Leave name/email blank to comment anonymously

No comments yet. Be the first to comment!