Phần quan trọng nhất của module xác thực người dùng là phần tạo cookie xác thực như các yêu cầu đã nói ở phần 2.1.1. Phần cookie xác thực người dùng trong hệ thống sẽ được xây dựng bằng cách:
Bước 1: lấy thời gian hiện tại của hệ thống sau đó chia lấy phần nguyên với một khoảng thời gian xác định gọi là thời gian hợp lệ của cookie.
Bước 2: lấy các giá trị đặc trưng của người dùng ở đây là địa chỉ ip và useragent của request.
Bước 3: Cộng một chuỗi secret mà chỉ server mới có với hai thông tin lấy được ở bước 1 và bước 2 sau đó dùng mã hoá băm với dữ liệu này. Cookie authen cuối cùng sẽ là một chuỗi có độ dài bằng độ dài của thuật toán băm tương ứng. Thuật toán này được triển ra ra code như sau.
local current_time = os.time()
local authen_data = ngx.var.remote_addr .. useragent
local secret = authen_data .. current_time - (current_time % cookie_windows) local sha256 = resty_sha256:new()
sha256:update(key) sha256:update(secret)
local digest = str.to_hex(sha256:final())
Phần này dùng thư viện lua-resty-string của openresty. Trong đó key là chuỗi bí mật chỉ có server có. Cookie xác thực này có những đặc điểm phù hợp với yêu cầu đã được trình bày như:
- Gần như không thể giả được cookie xác thực trừ khi biết được chuỗi bít mật của server.
- Do dùng mã hoá băm nên người tấn công cũng khó có thể đoán được các yếu tố nào dùng để xác thực.
- Cookie chỉ được xác thực trong một khoảng thời gian xác định nên tránh được việc người tấn công dùng mã giả trình duyệt để lấy cookie sau đó dùng cookie này cho các request tấn công từ chối dịch vụ sau.
- Mã hoá băm sha256 có mức độ an toàn tương đối tốt và thời gian chạy cũng như tài nguyên yêu cầu tương đối thấp nên rất hợp cho một hệ thống chống tấn công từ chối dịch vụ như này.
Xác thực tính chính xác của cookie xác thực của người dùng có:
Phần này rất đơn giản là chỉ lấy cookie xác thực của người dùng nếu có sau đó so sánh với cookie xác thực mà server tạo ra cho người dùng. Phần này được viết dùng thư viện lua-resty-cookie của openresty với mã như sau:
--- lấy cookie xác thực, nếu không có thì cookie sẽ có giá trị là nil ( None hoặc rỗng)
local ck = require "resty.cookie" local cookie, err = ck:new() if not cookie then
ngx.log(ngx.ERR, err) return ngx.exit(500) end
local ecofair_cookie, err = cookie:get(ecofair_cookie_name) --- xác thực xem cookie có chính xác không
if (not ecofair_cookie or not(ecofair_cookie == digest)) then … tạo cookie xác thực cho người dùng với module thích hợp