Chuyển đến nội dung chính

Giải mã cơ chế 2FA: Tại sao ứng dụng vẫn tạo mã đúng khi không có kết nối Internet?

 


Một câu hỏi thú vị mà nhiều người dùng thường đặt ra: Tại sao khi điện thoại ở chế độ máy bay, không có mạng, nhưng mã xác thực (OTP) vẫn trùng khớp hoàn toàn với máy chủ đặt tại nước ngoài?





Thực tế, quá trình này không dựa trên sự giao tiếp trực tiếp giữa điện thoại và máy chủ tại thời điểm sinh mã. Bí mật nằm ở một thuật toán có tên gọi là TOTP (Time-based One-Time Password).

1. Khởi tạo: Giao thức "Bắt tay" ban đầu

Mọi thứ bắt đầu từ mã QR bạn quét khi thiết lập 2FA lần đầu tiên. Mã QR này thực chất chứa một Khóa bí mật (Secret Key).

  • Thiết bị cá nhân: Khi bạn quét mã, ứng dụng (Google Authenticator, Microsoft Authenticator...) sẽ lưu trữ Secret Key này vào bộ nhớ an toàn trên máy.

  • Máy chủ (Server): Đồng thời, Server cũng lưu trữ chính xác mã khóa đó trong hồ sơ tài khoản của bạn.

  • Bảo mật: Sau khi quá trình thiết lập hoàn tất, Secret Key sẽ được ẩn đi vĩnh viễn để đảm bảo tính an toàn.

2. Nguyên lý đồng bộ hóa độc lập

Để tạo ra dãy 6 chữ số định kỳ mỗi 30 giây, cả ứng dụng và máy chủ đều thực hiện một phương trình toán học với ba thành phần cố định:

[Secret Key] + [Dấu mốc thời gian] + [Thuật toán băm] = Mã OTP

  • Sử dụng chung "chìa khóa": Cả hai bên đều giữ cùng một Secret Key.

  • Sử dụng chung "đồng hồ": Cả hai cùng căn cứ vào giờ chuẩn quốc tế (Unix Timestamp).

  • Sử dụng chung "công thức": Cả hai cùng sử dụng một giải thuật đặc biệt (thường là HMAC-SHA1).

Vì các tham số đầu vào hoàn toàn giống nhau, kết quả đầu ra (6 chữ số) chắc chắn sẽ trùng khớp 100% mà không cần phải "nói chuyện" với nhau qua Internet.

3. Những lỗ hổng cần lưu ý

Dù cơ chế này rất thông minh và bảo mật, người dùng vẫn cần đối mặt với hai rủi ro chính:

  • Rò rỉ Secret Key: Nếu bạn để lộ ảnh chụp mã QR ban đầu, kẻ gian có thể sao chép Secret Key vào thiết bị của họ và tạo ra mã OTP y hệt như bạn.

  • Sai lệch thời gian (Clock Drift): Nếu đồng hồ trên điện thoại của bạn chạy sai so với giờ quốc tế, mã sinh ra sẽ không khớp với Server, dẫn đến việc không thể đăng nhập.

Nhận xét

Bài đăng phổ biến từ blog này

Thiết kế giao diện với DotNetBar (Phần 1)

Đây là phiên bản DotNetBar hỗ trợ C# và Visual Basic https://www.dropbox.com/s/wx80jpvgnlrmtux/DotNetBar.rar  , phiên bản này hỗ trợ giao diện Metro cực kỳ “dễ thương” Các bạn load về và cài đặt, khi cài đặt xong sẽ có source code mẫu của tất cả các control. Để sử dụng được các control của DotNetBar các bạn nhớ add item vào controls box. Thiết kế giao diện với DotNetBar, giao diện sẽ rất đẹp. Link các video hướng dẫn chi tiết cách sử dụng và coding: http://www.devcomponents.com/dotnetbar/movies.aspx Hiện tại DotNetBar có rất nhiều công cụ cực mạnh, trong đó có 3 công cụ dưới đây: DotNetBar for Windows Forms Requires with Visual Studio 2003, 2005, 2008, 2010 or 2012.   DotNetBar for WPF Requires with Visual Studio 2010 or 2012 and Windows Presentation Foundation.   DotNetBar for Silverlight Requires with Visual Studio 2010 or 2012 and Silverlight. Dưới đây là một số hình ảnh về các control trong DotnetBar.   Metro User Interface  controls with Metro Tiles, toolba...

Jetpack Compose: Lists

  Hai cách chúng ta có thể triển khai Lists trong Jetpack Compose. Lưu ý: Tôi đang sử dụng Jetpack Compose phiên bản 0.1.0-dev08 tại thời điểm viết bài này. Sử dụng AdapterList Chúng ta có thể sử dụng AdapterList composable - nó tương đương với RecyclerViews + RecyclerViewAdapters - nhưng với ít mã hơn đáng kể 😍 Phương thức khởi tạo AdapterList nhận dữ liệu, là danh sách các mục bạn muốn hiển thị và chuyển các mục riêng lẻ đến lambda. Ở đó bạn có thể xác định mục danh sách. Hiện tại, nó chỉ giới hạn ở việc cuộn dọc. Điều này có thể thay đổi trong các bản phát hành trong tương lai. Multiple Types Chúng ta có thể dễ dàng phân biệt giữa các loại chế độ xem khác nhau - chỉ cần thêm điều kiện if. Dưới đây là một ví dụ nếu chúng tôi muốn hiển thị một tiêu đề ở đầu danh sách: 2.Using Vertical and Horizontal Scrollers Một cách khác để triển khai danh sách là sử dụng các Scrollers đơn giản - những công cụ này sẽ không sử dụng các chế độ xem tái chế. Vì vậy, không thực sự lý tưởng cho lists...

5 concepts every Flutter dev should know

  Phụ lục: State management architecture Testing IDE Shortcuts Platform channel Maintaining a project Tôi đã làm việc với Flagship trong một thời gian dài, và đây là những điều mà tôi phát hiện ra là điều cần phải có đối với bất kỳ nhà phát triển Flagship nào, về tổng thể nó sẽ khiến bạn trở thành một nhà phát triển Flagship giỏi trong thời gian dài. 1. State management architecture Đây là một trong những chủ đề quan trọng nhất trong cộng đồng thiết bị rung, nó khá quan trọng nếu bạn muốn duy trì một dự án rung kích thước trung bình hoặc lớn. Nó sẽ giúp tạo một dự án suôn sẻ và thêm các tính năng mới một cách hoàn hảo.  2. Testing Đây là một chủ đề duy nhất mà tôi không hiểu tại sao nó lại quan trọng trước đó trong sự nghiệp của tôi, nhưng khi tôi tiến lên trong sự nghiệp của mình và có kinh nghiệm với nhiều dự án và vấn đề xảy ra trong môi trường sản xuất. Tôi đã nhận ra một cách khó khăn, tại sao điều này lại quan trọng như vậy. Nếu bạn vẫn muốn có thêm lý do để cân nhắc thử...