2.4.2. Phương pháp sinh theo thuật toán
OTP sinh ra bằng thuật tốn dựa trên mật khẩu cũ khơng có giá trị thay đổi theo thời gian, mà chúng được sinh ra theo thuật tốn mỗi khi có u cầu sử dụng. Thuật toán của bên xác thực và người dùng phải đồng bộ với nhau. Mỗi lần một người dùng được xác thực thành công, bên xác thực sẽ chỉ chấp nhận một OTP kế tiếp được sinh ra bởi thuật tốn. Khơng giống OTP dựa trên thời gian, OTP dựa trên
tốn học chỉ có giá trị cho một lần sử dụng và không bị tấn công như đã mô tả ở trên khi mà mật khẩu được sử dụng nhiều lần trong một khoảng thời gian. Và việc đồng bộ hóa đồng hồ và sai số đồng hồ khơng phải là vấn đề.
Một vấn đề khi cài đặt các giải thuật này là việc giữ cho thuật toán của bên xác thực và người dùng đồng bộ với nhau. Đa số các cài đặt cho phép bên xác thực chấp nhận một cửa sổ các mật khẩu và điều chỉnh cửa sổ này dựa trên mật khẩu hợp lệ cuối cùng được nhập vào. S/Key và Hash-based OTP (HOTP) là hai dạng phổ biến của bộ sinh mật khẩu dựa trên các thuật toán.
Phương pháp này sinh OTP trên cơ sở các OTP đã sử dụng trước đó của người dùng. Một ví dụ cho thuật toán này là thuật toán của Leslie Lamport - thuật toán sử dụng các hàm một chiều f. Hệ thống OTP làm việc dựa trên một giá trị khởi tạo ban đầu s để sinh mật khẩu lần đầu tiên. Mật khẩu OTP được sử dụng cho phiên làm việc đầu tiên sẽ được tính như sau:
OTP1 = fn(s). Trong đó:
fn(s) = f(fn-1(s)) - với n là số lần áp dụng hàm f lên giá trị ban đầu s.
Khi đó ta sẽ có lần lượt các mật khẩu OTP cho các phiên như ở bảng dưới đây.
Phiên 1 Phiên 2 Phiên 3 Phiên 4
OTP1 = fn(s) OTP2 = fn-1(s) OTP3 = fn-2(s) OTP4= fn-3(s) Nếu một người tấn cơng nào đó có thể bắt được giá trị OTP của một phiên làm việc nào đó thì người đó có thể dùng để đăng nhập vào hệ thống khi mà giá trị OTP này cịn hợp lệ, tuy nhiên khi OTP khơng cịn hợp lệ nữa thì khơng thể thực hiện việc đăng nhập nữa và để lấy được giá trị OTP cho lần đăng nhập kế tiếp thì người tấn cơng sẽ phải đối mặt với việc tính hàm f ngược. Do hàm f đã được chọn là hàm một chiều nên việc này là cực kì khó để thực hiện. Nếu hàm f là một hàm băm mật mã thì việc tính tốn là cực kì khó khăn thậm chí là khơng thể.
SMS cũng có thể được dùng làm phương tiện sinh OTP như khóa hai. Có hai dạng khóa SMS:
+ Phương thức SMS tức thời:
Trong phương pháp này, trước tiên người dùng thực hiện đăng nhập với password như bình thường, nếu thành cơng máy chủ xác thực sẽ sinh OTP và gửi ngay SMS cho người dùng để hoàn tất khóa xác thực thứ hai. Giao thức SMS khơng
bảo đảm gửi tin thành công hay gửi kịp thời. Điều này có thể làm giảm tính khả dụng của việc xác thực hai khóa dựa trên SMS.
+ Phương thức khóa SMS lơ:
Trong phương thức này, người dùng nhận một danh sách mã số trước khi đăng nhập. Mỗi mã số gắn với một ký tự hay số dòng. Người dùng cần nhập vào mã số tương ứng với dịng u cầu để làm khóa xác thực thứ hai. SMS lơ có thể giảm đáng kể chi phí SMS và khắc phục được vấn đề chất lượng dịch vụ của giao thức SMS vì danh sách được gửi đến người dùng trước khi họ thực sự cần đến. Tuy nhiên khuyết điểm của SMS lô là khả năng bị tấn công lớn hơn.
2.4.3. Phương pháp sinh theo giải pháp S/KEY
S/Key còn được gọi là Lamport scheme, là một giải pháp phổ biến được phát triển để xác thực các ứng dụng đầu cuối trên các hệ điều hành thuộc họ Unix. Việc sinh mật khẩu dựa trên hàm băm. Mật khẩu thực sự của người dùng được kết hợp với một thiết bị offline chứa một tập ngắn các kí tự và một bộ đếm giảm dần để tạo ra một mật khẩu. Vì mỗi mật khẩu chỉ được sử dụng một lần nên chúng vô dụng với những người tấn công mật khẩu.
Vì tập các kí tự khơng thay đổi cho đến khi bộ đếm giảm về 0, nên có thể chuẩn bị một danh sách mật khẩu dùng một lần mà người dùng có thể mang theo. Nói một cách khác, người dùng có thể đưa ra mật khẩu, các kí tự, và giá trị bộ đếm mong muốn cho một máy tính cục bộ để tạo ra mật khẩu dùng một lần phù hợp, sau đó có thể truyền mật khẩu này trên mạng.
S/Key được hỗ trợ trong các hệ điều hành Linux, OpenBSD, NetBSD, và FreeBSD. Một ứng dụng mã nguồn mở chung, như ứng dụng OPIE có thể được dùng để hỗ trợ việc sử dụng S/Key trên các hệ thống khác. S/Key là thương hiệu của công ty Telcordia Technologies .
Sau đây là phần mô tả cụ thể cho phương pháp này: Bước 1: Sinh mật khẩu.
+ Bước này bắt đầu với một khóa bí mật W. Khóa này có thể được đưa ra bởi người dùng hoặc máy tính của server sinh ra và không được gửi cho client. Nếu khóa này bị lộ thì tính bảo mật của S/Key sẽ bị giảm.
+ Một hàm băm mã hóa H được áp dụng n lần cho khóa bí mật W, cách này tạo ra một chuỗi băm của n mật khẩu dùng một lần. Mật khẩu là kết quả của việc áp dụng hàm băm mã hóa: H(W), H(H(W)),…, Hn(W).
+ Người dùng (client) được cung cấp n mật khẩu dùng một lần, được in ra theo thứ tự ngược lại: Hn(W), Hn-1(W) ,..., H(H(W)), H(W).
+ Những mật khẩu H(W), H(H(W)),…, Hn-1(W) không được lưu lại ở server mà server chỉ lưu mật khẩu Hn(W).
Bước 2: Xác thực
Sau q trình sinh mật khẩu người dùng có một danh sách các mật khẩu. Mật khẩu đầu tiên cũng là mật khẩu server đang lưu. Mật khẩu này sẽ không được dùng để xác thực, và mật khẩu thứ hai sẽ được dùng:
+ Người dùng cung cấp cho server mật khẩu pwd thứ hai trong danh sách của mình và gạch bỏ nó đi.
+ Server tính H(pwd) trong đó pwd là mật khẩu được cung cấp. Nếu H(pwd) là mật khẩu đầu tiên (server đang lưu) thì q trình xác thực thành cơng. Server sẽ tính H (mật khẩu i) và so sánh kết quả với mật khẩu i-1, được lưu trên server.
Tính bảo mật
Tính bảo mật của S/Key phụ thuộc vào độ phức tạp của hàm băm mã hóa. Giả sử rằng một người tấn công giữ một mật khẩu đã được dùng cho một lần xác thực thành công. Gọi mật khẩu này là i, mật khẩu này đã khơng cịn giá trị trong quá trình xác thực nữa vì mỗi mật khẩu chỉ được dùng một lần. Nhưng người tấn công sẽ quan tâm đến việc tìm ra mật khẩu i-1, vì mật khẩu này sẽ được sử dụng cho lần xác thực kế tiếp. Điều này cần phải chuyển ngược hàm băm để tạo ra mật khẩu i-1 từ mật khẩu i (H(mật khẩu i-1)=mật khẩu i) một việc rất khó khăn với các hàm băm mã hóa hiện thời. Tuy nhiên S/Key có thể bị tấn cơng kiểu người đứng giữa (man-in- the middle).
S/Key sử dụng các số 64 bit, và để cho người dùng sử dụng, mỗi số được ánh xạ thành 6 từ ngắn, mỗi từ có từ 1 đến 4 kí tự lấy từ từ điển 2048 từ. Ví dụ một số 64 bit có thể được biểu diễn thành Roy Hurt Ski Fail Grim.
2.4.4. Phương pháp sinh sử dụng HOTP
HOTP được sử dụng dựa trên các mã xác thực thông điệp bằng hàm băm
(Hash-based Message Authentication Code - HMAC) và hàm băm SHA-1 (Secure Hash Algorithm 1) thường được sử dụng. HOTP được đưa ra bởi tổ chức Initiative for Open Authentication (OATH). Về mặt khái niệm, HOTP tính giá trị băm SHA-1 dựa trên HMAC được mã khóa bởi một khóa bí mật được chia sẻ trên một bộ đếm. Những bước tính tốn để sinh ra một mật khẩu HOTP như sau:
- Khởi tạo bộ đếm c = 0.
- Định nghĩa H là HMAC được tính tốn bằng SHA-1. - Đặt Truncate là hàm lựa chọn 4 byte theo một cách nào đó.
- Người dùng cần xác thực gửi giá trị Truncate(H(S,c)) & 0x7FFFFFFF cho server. - Bên server cũng tính tốn giá trị hàm Truncate() theo cách tương tự. Nếu giá trịxác thực do server tính tốn khớp với giá trị người dùng cung cấp thì người dùng được xác thực.
- Cả hai bên tăng giá trị của c.
Với hệ thống S/Key, kết quả thường quá dài để người sử dụng nhập vào thiết bị. Thay vì chuyển kết quả thành chuỗi kí tự như S/Key, HOTP đơn giản chỉ tính ra giá trị như sau: Value = HOTP(K,C) mod 10d
Trong đó:
- K là một khóa bí mật; C là bộ đếm; - d là số chữ số mong muốn của kết quả.
Có nhiều hệ thống ứng dụng phương pháp HOTP đã được phát triển và triển khai. Một hệ thống có thể thay thế HMAC bằng giải thuật mã hóa Data Encryption Standard (DES), Advanced Encryption Algorithm (AES), hoặc bất kì một giải thuật mã hóa khác. Time-based One Time Password (TOTP) là phương pháp thay thế bộ đếm c bằng thời gian hiện tại, do đó nó chuyển HOTP dựa trên tốn học thành OTP dựa trên thời gian.
2.4.5. Phương pháp sinh sử dụng Security token
Security token hay thường gọi là OTP Token, là loại khóa hai chiều được dùng phổ biến nhất hiện nay vì giá thành rẻ và dễ dùng. Sau khi người dùng gõ vào và đăng nhập thành cơng thì mật khẩu này hết hiệu lực (lần đăng nhập sau sẽ dùng mật khẩu khác).