Tải bản đầy đủ - 0 (trang)
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT

Tải bản đầy đủ - 0trang

2.1.1.2.



Cách tạo một giá trị HOTP



Cách tạo một giá trị HOTP có thể được mơ tả qua 3 bước riêng biệt:

Bước 1: Tạo giá trị bằng thuật tốn mã hóa HMAC-SHA-1.

HS = HMAC-SHA-1 (K, C) // HS là một chuỗi giá trị 20 bytes

Bước 2: Tạo 1 chuỗi 4 bytes (Cắt ngắn động).

Đặt Sbits = DT (HS) // DT, được định nghĩa bên dưới,

// trả về chuỗi 31 bit

Bước 3: Tính tốn giá trị HOTP.

Đặt Snum = StToNum (Sbits) // Chuyển đổi S thành một số trong

// khoảng 0 ... 231 -1

Trả về D = Snum mod 10 ^ Digit // D là một số trong khoảng

// 0 ... 10Digit -1

Hàm Truncate sẽ bao gồm bước 2 và bước 3 ở trên, tức là cắt ngắn động sau đó lấy

kết quả đó và chia lấy dư cho 10 Digit. Mục đích của phương pháp cắt ngắn động là trích xuất

4 byte mã nhị phân động từ 20 byte kết quả của phép tính mã hóa SHA-1.

DT(String) // String = String[0]...String[19]

Đặt OffsetBits là 4 bits thứ tự thấp của String[19].

Offset = StToNum (OffsetBits) // 0 <= Offset <= 15

Đặt P = String[Offset] ... String[Offset + 3]

// Trả lại 31 bit cuối cùng của P

Lý do sử dụng phương pháp bit masking cho những bit quan trọng của P là để tránh

sự nhầm lẫn khi sử dụng phép toán chia lấy dư cho các biến kiểu signed và unsigned. Các

bộ xử lý khác nhau sẽ cho các kết quả khác nhau khi thực hiện phép tốn này, do đó việc sử

dụng phương pháp bit masking sẽ loại bỏ được sự không rõ ràng kể trên.

Để đảm bảo tính bảo mật của thuật toán, kết quả cuối cùng cần phải xuất ra kết quả

có độ dài ít nhất là 6 kí tự hoặc có thể là 7 hoặc 8 kí tự.



17



2.1.2. Giới thiệu chung

Thuật tốn mã hóa TOTP là thuật tốn mở rộng của thuật toán mật khẩu một lần

(One Time Password), cụ thể là thuật tốn HOTP được trình bày ở trên, dùng để hỗ trợ cho

bài tốn mã hóa với các tham số đầu vào phụ thuộc theo thời gian.

Theo định nghĩa ở phần trên, thuật toán HOTP là thuật toán dựa trên thuật tốn mã

hóa HMAC-SHA-1 với một biến số đếm tăng dần sau mỗi lần tính tốn, và được rút gọn

thành một chuỗi các ký tự (bao gồm chữ hoặc số hoặc cả chữ và số):

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C))

Trong đó, K là mật mã được chia sẻ và C là biến số đếm tăng dần.

Như đã nói ở trên, TOTP là thuật tốn mã hóa mở rộng của HOTP với tham số đầu

vào phụ thuộc theo thời gian, do đó biến số C ở trên sẽ được thay thế bằng biến số T phụ

thuộc theo thời gian. Bên cạnh đó, thuật tốn TOTP còn có thể sử dụng các hàm băm mật

mã SHA-256 hoặc SHA-512 để thay thế cho SHA-1 được sử dụng trong thuật tốn HOTP

trình bày ở trên.

2.1.3. u cầu thuật tốn

-



-



R1: Các Prover (mã thơng báo, mã thông báo mềm…) và Verifier (máy chủ xác thực

hoặc tương tự) phải biết hoặc có thể lấy được thời gian Unix hiện tại (số giây trôi qua

kể từ ngày 1 tháng 1 năm 1970) để tạo OTP. Độ chính xác của thời gian có được sẽ

ảnh hưởng đến tần suất đồng bộ của đồng hồ.

R2: Các Prover và Verifier phải chia sẻ cùng 1 bí mật hoặc kiến thức về một sự thay

đổi bí mật để tạo ra 1 bí mật được chia sẻ.

R3: Phải sử dụng thuật tốn HOTP làm khối chính để xây dựng thuật tốn.

R4: Các Prover và Verifier phải sử dụng cùng một giá trị bước thời gian X.

R5: Mỗi Prover phải có một khóa bí mật đặc biệt của riêng mình.

R6: Các khóa nên được tạo ngẫu nhiên hoặc được mã hóa bằng thuật tốn đạo hàm.

R7: Khóa có thể được lưu trữ trong các thiết bị chống giả mạo và nên được bảo vệ để

chống lại việc truy cập và sử dụng trái phép.



2.1.4. Thuật toán TOTP

Biến thể của thuật toán HOTP này xác định việc tính tốn giá trị của một OTP dựa

trên tham số thời gian thay vì sử dụng biến đếm tăng dần.

Ký hiệu:

-



X là giá trị của mỗi bước thời gian (tính bằng giây), được sử dụng như một tham

số hệ thống.

T0 là thời điểm bắt đầu đếm các bước thời gian (tính theo thời gian Unix) và cũng

được sử dụng như một tham số hệ thống.



Về cơ bản, thuật toán TOTP được định nghĩa như sau:

TOTP = HOTP(K, T)

18



Cụ thể hơn, T = (Thời gian Unix hiện tại – T0) / X, là một hàm cơ bản mặc định được

sử dụng trong việc tính tốn.

Ví dụ: với T0 = 0 và Bước thời gian X = 30, T = 1 nếu hiện tại Thời gian Unix là 59

giây và T = 2 nếu thời gian Unix hiện tại là 60 giây.

Việc thực hiện thuật toán này yêu cầu bộ nhớ dành cho giá trị thời gian phải lớn hơn

số nguyên 32-bit khi vượt quá năm 2038. Giá trị của các tham số hệ thống X và T0 phải

được thiết lập trước trong quá trình cung cấp và giao tiếp giữa Prover và Verifier.

2.1.5. Chú ý về bảo mật

Một OTP được tạo ra trong cùng 1 bước thời gian sẽ luôn giống nhau. Khi một hệ

thống xác thực nhận được 1 OTP, hệ thống sẽ không biết thời điểm chính xác mà OTP đó

được tạo ra trên thiết bị khách. Do đó, hệ thống thường có thể sử dụng dấu thời gian mỗi khi

nhận được một OTP cho việc so sách các OTP.

Do độ trễ mạng, khoảng cách giữa thời gian mà OTP đã được tạo cho đến lúc hệ

thống xác thực nhận được OTP đó có thể lớn, dẫn đến thời gian khi OTP được tạo ra và thời

gian hệ thống nhận được OTP đó có thể khơng cùng một bước thời gian. Vì vậy, một hệ

thống xác thực nên đặt ra những quy tắc dành cho những trường hợp truyền OTP với độ trễ

chấp nhận được (thường sẽ là nhiều nhất 1 bước thời gian).

Độ dài của bước thời gian cũng sẽ tác động đến cả tính bảo mật và trải nghiệm sử

dụng. Bước thời gian dài hơn nghĩa là sẽ có khoảng thời gian dài hơn cho mỗi lần tạo ra mã

mới và giao tiếp với hệ thống xác thực, từ đó sẽ tạo ra nhiều cơ hội hơn để cho các cuộc tấn

công từ bên thứ 3 sử dụng OTP được tạo ra trong khoảng thời gian này để truy cập vào hệ

thống xác thực. Còn nếu trường hợp bước thời gian quá ngắn sẽ gây khó khăn cho người sử

dụng khi mà OTP được tạo ra chưa được gửi đến hệ thống xác thực đã bị thay đổi do thời

gian nhảy sang một bước mới. Do đó, độ dài của bước thời gian được khuyến nghị là 30s,

đây là khoảng thời gian có thể cân bằng giữa bảo mật và trải nghiệm người dùng.



2.2.



Giao tiếp ngoại vi



2.2.1. Giao tiếp với sever sử dụng giao thức UDP (User Datagram Protocol) [3]

Giới thiệu chung về giao thức

Giao thức gói dữ liệu người dùng (UDP) là một trong những giao thức cốt lõi của

TCP/IP (Giao thức điều khiển truyền và Giao thức liên mạng). Giao thức này cho phép các

tổ hợp máy tính được kết nối với nhau trong cùng một mơi trường mạng có thể giao tiếp với

nhau bằng cách chuyển tiếp dữ liệu dưới dạng gói (diagram packet).

Giao thức này cung cấp một quy trình cho các chương trình ứng dụng gửi tin nhắn

đến các chương trình khác với một cơ chế tối thiểu hóa dữ liệu và thời gian truyền cho mỗi

19



lần giao tiếp. Trong giao thức này hướng truyền, tính phân phối và bảo vệ việc lặp dữ liệu

của các gói dữ liệu khi gửi không được đảm bảo cho nên sẽ khơng được sử dụng cho các

giao tiếp có u cầu cao về sự tin cậy của luồng dữ liệu.

Tuy nhiên, với yêu cầu của bài toán đặt ra là truy vấn dữ liệu thời gian trên sever,

giao thức UDP là một giao thức phù hợp bởi đặc tính cho phép truyền nhận các gói dữ liệu

nhỏ trong thời gian ngắn và không quan tâm đến thứ tự truyền nhận của dữ liệu. Từ đó, u

cầu về tính chính xác của thông số thời gian sẽ được thỏa mãn bằng một số lượng lớn các

truy vấn nhỏ trong thời gian ngắn.

Cấu trúc gói dữ liệu và cách thức truyền nhận

Trong bộ giao thức TCP/IP, UDP cung cấp một giao diện rất đơn giản giữa tầng

mạng bên dưới (thí dụ, IPv4) và tầng phiên làm việc hoặc tầng ứng dụng phía trên. UDP

khơng đảm bảo cho các tầng phía trên thơng điệp đã được gửi đi và người gửi cũng khơng

có trạng thái thơng điệp UDP một khi đã được gửi (Vì lý do này đơi khi UDP còn được gọi

là Unreliable Datagram Protocol). UDP chỉ thêm các thông tin multiplexing và giao dịch.

Các loại thông tin tin cậy cho việc truyền dữ liệu nếu cần phải được xây dựng ở các tầng cao

hơn.

Dưới đây bảng thể hiện cấu trúc gói dữ liệu của một tập tin UDP:



Cấu trúc gói dữ liệu UDP

Phần header của UDP chỉ chứa 4 trường dữ liệu, trong đó có 2 trường là tùy chọn (ơ

nền đỏ trong bảng).

-



-



Source port: Trường này xác định cổng của người gửi thơng tin và có ý nghĩa nếu

muốn nhận thơng tin phản hồi từ người nhận. Nếu không dùng đến thì đặt nó bằng 0.

Destination port: Trường xác định cổng nhận thông tin, và trường này là cần thiết.

Length: Trường có độ dài 16 bit xác định chiều dài của toàn bộ datagram: phần

header và dữ liệu. Chiều dài tối thiểu là 8 byte khi gói tin khơng có dữ liệu, chỉ có

header.

Checksum: Trường checksum 16 bit dùng cho việc kiểm tra lỗi của phần header và

dữ liệu, thường được thêm bit 0 vào cuối (nếu cần) để tạo ra bội của 2 octets. Phương

pháp tính tốn checksum cũng giống như phương pháp dùng trong giao thức TCP.



20



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT

Tải bản đầy đủ ngay(0 tr)

×