Báo cáo bài tập lớn môn mật mã học cơ sở ptit thầy Đỗ Xuân Chợ về. JWT JSON Web Tokens,JSON Web Token (JWT) là một chuỗi mã hoá hay một tiêu chuẩn mở (RFC 7519) được sử dụng như một phương tiện đại diện nhỏ gọn nhằm xác minh thông tin an toàn giữa các bên ClientServer dưới dạng JSON object. Thông tin này có thể được xác minh và tin cậy vì nó được ký điện tử digitally signed. JWT có thể được ký bằng cách sử dụng một secret (với thuật toán HMAC) hoặc cặp publicprivate key dùng chuẩn RSA hoặc ECDSA. JSON là một dạng dữ liệu được sử dụng theo một quy luật chung nhất định mà hầu hết các ngôn ngữ lập trình hiện nay đều có thể dễ dàng đọc và tìm hiểu. Nó được xem là một tiêu chuẩn mở với mục đích sử dụng là trao đổi dữ liệu trong website. Token: Đây là một chữ ký điện tử được mã hoá thành các con số khác nhau và các con số này tạo thành một dãy ấn tượng. Do được tạo dưới dạng OTP nên loại mã số này chỉ được tạo ngẫu nhiên và sử dụng một lần cho từng lần giao dịch khác nhau.
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ THÔNG TIN I -□□&□□ - BÁO CÁO BÀI TẬP MÔN: MẬT MÃ HỌC CƠ SỞ ĐỀ TÀI: JWT GIẢNG VIÊN: TS ĐỖ XUÂN CHỢ NHÓM THỰC HIỆN: NHÓM 011 Phan Tuấn Anh B18DCAT012 ssss B17DCAT196 ssss B18DCAT012 sss ssss ssss Mục lục Giới thiệu Nội dung I Khi nên dùng JSON Web Tokens? II JWT bảo vệ liệu cách nào? III Cấu trúc IV Các thuật toán mã hoá V JSON Web Tokens hoạt động nào? VI Các bước để tạo JWT VII Bài tập demo Giới thiệu JSON Web Token (JWT) chuỗi mã hoá hay tiêu chuẩn mở (RFC 7519) sử dụng phương tiện đại diện nhỏ gọn nhằm xác minh thơng tin an tồn bên Client-Server dạng JSON object Thơng tin xác minh tin cậy ký điện tử - digitally signed JWT ký cách sử dụng secret (với thuật toán HMAC) cặp public/private key dùng chuẩn RSA ECDSA JSON dạng liệu sử dụng theo quy luật chung nhất định mà hầu hết ngôn ngữ lập trình dễ dàng đọc tìm hiểu Nó xem tiêu chuẩn mở với mục đích sử dụng trao đổi liệu website Token: Đây chữ ký điện tử mã hoá thành số khác số tạo thành dãy ấn tượng Do tạo dạng OTP nên loại mã số tạo ngẫu nhiên sử dụng lần cho lần giao dịch khác Nội dung I Khi nên dùng JSON Web Tokens? Dưới lợi ích việc sử dụng JWT: ● Uỷ quyền - Authorization: Đây trường hợp nên sử dụng JWT Khi người dùng đăng nhập, request gửi từ Client bao gồm JWT, cho phép người dùng access vào routes, services resources phép với token Single Sign ON tính JWT sử dụng rộng rãi nay, chi phí thấp dễ dàng sử dụng domains khác ● Trao đổi thông tin - Information Exchange: JSON Web Tokens cách tốt để truyền thơng tin an tồn vên Client Server Vì JWT signed Ví dụ, sử dụng cặp public/private key, bạn biết người gửi Ngồi ra, signature xác định dựa vào header payload, ta xác nội dung chưa bị giả mạo II JWT bảo vệ liệu cách nào? Một điều quan trọng JWT không ẩn hay làm mờ liệu theo bất kỳ cách Lý JWT sử dụng để chứng minh liệu gửi thực tạo nguồn xác thực Dữ liệu bên JWT mã hóa đánh dấu, khơng mã hóa Mục đích việc mã hóa liệu chuyển đổi cấu trúc liệu Dữ liệu đăng ký cho phép người nhận liệu xác minh tích xác thực nguồn liệu Vì vậy, mã hóa đánh dấu liệu KHÔNG bảo mật liệu Mặc khác, mục đích mã hóa bảo mật liệu ngăn chặn truy cập trái phép III Cấu trúc JSON Web Tokens bao gồm phần (Header, Payload, Signature) phân tách dấu `.` JWT có dạng: xxxxx.yyyyy.zzzzz Chuẩn format: .. A Header Trong Header gồm có phần: Loại mã token thuật tốn sử dụng Ví dụ: Thuật tốn HS256, loại mã token JWT Sau JSON mã hoá Base64Url để tạo thành phần JWT B Payload Phần thứ token payload, chứa Claims Claims thường chứa thuộc tính :typically, thơng tin user liệu bổ sung Có loại claims: registered, public, private claims ● Registered claims: Đây tập hợp claims xác định trước, không bắt buộc khuyến nghị để cung cấp tập hợp claims hữu ích, tương tác ○ iss (issuer): tổ chức phát hành token (không bắt buộc) ○ sub (subject): chủ đề token (không bắt buộc) ○ aud (audience): đối tượng sử dụng token (không bắt buộc) ○ exp (expired time): thời điểm token hết hạn (không bắt buộc) ○ nbf (not before time): token chưa hợp lên trước thời điểm ○ iat (issued at): thời điểm token phát hành, tính theo UNIX time ○ jti: JWT ID Lưu ý claim names thường chứa ký tự ● Public claims: Chúng xác định theo ý muốn người sử dụng JWT Để tránh xung đột, phải xác định IANA JSON Web Token Registry định nghĩa URI chứa namespace chống xung đột ● Private claims: Đây claims tuỳ chỉnh tạo để chia sẻ thông tin bên đồng ý sử dụng chúng registered hay public claims Ví dụ Payload sau: Payload sau mã hố Base64Url để tạo thành phần thứ JSON Web Tokens Lưu ý: Đối với signed tokens, thông tin này, bảo vệ chống giả mạo người đọc Khơng đưa thơng tin bảo mật phần tử payload header JWT trừ mã hoá C Signature Để tạo signature ta cần phải lấy header mã hoá, payload mã hoá, secret, thuật toán định header sign Ví dụ bạn dùng thuật tốn HMAC SHA256, signature tạo sau: Signature sử dụng để xác minh tin nhắn không bị thay đổi đường truyền trường hợp token ký private key, xác người gửi JWT IV Các thuật tốn mã hố Có nhiều thuật tốn mã hố sử dụng để tạo JWT, bao gồm thuật toán mã hoá đối xứng (symmetric) không đối xứng (asymmetric) Các thuật toán phổ biến nhất HMAC, RSA ECDSA D HMAC (Hash-based Message Authentication Code): thuật toán mã hố đối xứng sử dụng khố bí mật để ký xác thực liệu HMAC tính tốn chữ ký cách sử dụng hàm băm (hash function) khố bí mật Hàm băm sử dụng phổ biến nhất SHA-256 SHA-512 E RSA (Rivest-Shamir-Adleman): thuật tốn mã hóa khơng đối xứng, sử dụng để mã hố khố bí mật sử dụng để giải mã RSA sử dụng JWT để tạo chữ ký cách sử dụng khố bí mật Khố cơng khai sử dụng để xác thực chữ ký F ECDSA (Elliptic Curve Digital Signature Algorithm): Là thuật tốn mã hóa khơng đối xứng dựa đường cong Elliptic ECDSA sử dụng cặp khố cơng khai bí mật để tạo xác thực chữ ký ECDSA cung cấp độ bảo mật tương dương với RSA với kích thước khố nhỏ V JSON Web Tokens hoạt động nào? Trong xác thực, người dùng đăng nhập thành công thông tin đăng nhập họ, JSON Web Token trả Vì token thơng tin xác thực, cần phải cẩn thận để ngăn chặn vấn đề bảo mật Nói chung, bạn không nên giữ token lâu yêu cầu Bạn không nên lưu trữ liệu nhạy cảm session nhớ trình duyệt thiếu bảo mật Bất người dùng muốn truy cập route resource bảo vệ, tác nhân người dùng nên gửi JWT, thêm Authorization header với nội dung Bearer + token Nội dung header trông sau: Authorization: Bearer Máy chủ server kiểm tra tính hợp lệ JWT header nhận request, hợp lệ, người dùng phép truy vấn sở liệu cho hoạt động nhất định bị giảm, điều luôn Nếu Token gửi Authorization header, chia sẻ tài nguyên nguồn gốc chéo (Cross-Origin Resource Sharing - CORS) không thành vấn đề khơng sử dụng cookie Sơ đồ sau cho thấy JWT lấy sử dụng để truy cập API resource: Application client requests authorization đến authorization server Điều thực thông qua luồng authorization khác Ví dụ: Một ứng dụng web tuân thủ OpenID Connect điển hình qua / oauth / uỷ quyền điểm cuối cách sử dụng luồng mã authorization Khi authorization cấp, authorization server trả lại access token cho application Application sử dụng access token để truy cập vào resource (như API) Lưu ý: Với signed tokens, tất thông tin token hiển thị cho người dùng bên khác, họ khơng thể thay đổi thơng tin Điều có nghĩa bạn khơng nên đặt thơng tin bảo mật token VI Các bước để tạo JWT JWT chuỗi có định dạng: header.payload.signature G Bước 1: Tạo HEADER Thành phần tiêu đề (header) dùng để khai báo chữ ký thuật toán mã hóa dùng cho token Header đối tượng JSON có định dạng: Trong đoạn mã JSON, giá trị khóa “typ” xác định đối tượng JWT giá trị khóa “alg” định thuật tốn băm sử dụng để tạo chữ ký (signature) cho JWT Trong ví dụ mình, thuật tốn sử dụng HMAC-SHA256, thuật toán băm sử dụng secret key để tính tồn chữ ký (signature) H Bước 2: Tạo PAYLOAD Phần thứ JWT payload, nơi chứa nội dung thông tin Thông tin truyền mơ tả thực thể thơng tin bổ sung thêm cho phần header Nó chia làm loại: Registered, public, private Thành phần Payload JWT liệu lưu trữ bên JWT (dữ liệu gọi “các xác nhận quyền sở hữu” JWT) Trong ví dụ này, máy chủ xác thực tạo JWT với thông tin người dùng lưu trữ bên nó, đặc biệt ID người dùng Trong ví dụ, ta đưa xác nhận quyền sở hữu vào payload Bạn đưa nhiều yêu cầu bạn muốn Có số tiêu chuẩn theo yêu cầu khác cho payload JWT, chẳng hạn “iss”, “sub”, “exp” Các trường sử dụng tạo JWT Lưu ý: Kích thước liệu ảnh hưởng đến kích thước tổng thể JWT, điều thường vấn đề JWT lớn ảnh hưởng tiêu cực đến hiệu suất gây độ trễ I Bước 3: Tạo Signature Chữ ký (signature) tính cách sử dụng thuật tốn sau: Thuật toán thực cách giải mã (header + payload) Thuật tốn sau kết hợp chuỗi mã hóa kết với dấu chấm (.) chúng Trong đoạn mã, chuỗi nối gán cho data Chuỗi liệu băm secret key sử dụng thuật toán băm định tiêu đề JWT Kết liệu băm gán cho hashedData Dữ liệu băm sau mã hóa base64url để tạo chữ ký (signature) JWT Trong ví dụ, header payload mã hóa Base64Url Sau đó, áp dụng thuật tốn signature với secret key trên, header payload mã hóa ghép nối với nhau, nhận liệu băm cung cấp cho signature Trong TH chúng ta, điều có nghĩa áp dụng thuật tốn HS256, với secret key "secret" chuỗi liệu để nhận chuỗi hashedData Sau đó, thơng qua base64url mã hóa chuỗi hashedData, nhận chữ ký JWT sau: J Bước 4: Kết hợp thành phần JWT với Sau tạo thành phần, tạo JWT Cấu trúc JWT: HEADER.PAYLOAD.SIGNATURE, cần kết hợp thành phần, với dấu chấm (.) để phân cách chúng Chúng ta sử dụng phiên mã hóa base64 header, payload signature tạo VD: JWT Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMD hmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ -xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM K Bước 5: Xác thực mã JWT Trong ví dụ thực thể đơn giản, sử dụng JWT đăng ký thuật tốn HS256, nơi có máy chủ xác thực máy chủ ứng dụng biết mã secret Máy chủ ứng dụng nhận key secret từ máy chủ xác thực ứng dụng thiết lập trình xác thực Từ ứng dụng biết secret key, người dùng thực gọi API đính kèm JWT vào ứng dụng, ứng dụng thực thuật toán signature Bước JWT Sau đó, ứng dụng xác minh signature thu từ việc thực băm khớp với signature JWT (nghĩa khớp với signature JWT tạo máy chủ xác thực) Nếu signature khớp với nhau, điều có nghĩa JWT hợp lệ, gọi API đến từ nguồn xác thực Nếu signature không khớp, có nghĩa JWT nhận khơng hợp lệ, dấu hiệu tấn cơng tiềm tàng ứng dụng Vì cách xác minh JWT, ứng dụng thêm lớp tin cậy người dùng 10 VII Bài tập demo Setup redis Setup mariadb Login API 11 Lấy JWT lưu redis Decode JWT 12 Mã permission 13