Trong thời đại công nghệ số ngày nay, thuật ngữ JWT được sử dụng rất phổ biến với nhiều vai trò khác nhau. JWT (JSON Web Token) là một công nghệ phổ biến hiện nay nhưng cũng gây nhiều tranh cãi. Đó là lý do tại sao nhóm 13 người quyết định thực hiện một báo cáo về chủ đề này để tìm hiểu về JWT cũng như thực hiện demo xác thực phi tập trung bằng JWT.
Sau khi hoàn thành học phần An ninh mạng, với sự giúp đỡ tận tình của thầy Đỗ Xuân Cho và sự nỗ lực nghiên cứu, học hỏi, nhóm 13 người chúng em đã hoàn thành báo cáo học phần An ninh mạng. . Trong quá trình báo cáo, mặc dù đã cố gắng hết sức nhưng nhóm 13 em vẫn còn hạn chế về thời gian nghiên cứu, kiến thức cũng như kinh nghiệm và còn nhiều sai sót. Loại mã xác thực thông báo liên quan đến hàm băm và khóa mật mã bí mật RSA Rivest–Shamir–Adleman Thuật toán mã hóa khóa công khai SHA-256 Thuật toán băm an toàn.
Cơ quan Phân bổ số Internet URI Tổ chức Mã định danh tài nguyên thống nhất Định dạng tài nguyên thống nhất H.P.S Header.Payload.Signature Cấu trúc của JWT. Giao thức Bảo mật phần mở rộng của HTTP SSL Secure Sockets Layer Tiêu chuẩn của công nghệ bảo mật LDAP Lightweight Directory.
Hoàn cảnh ra đời của JWT
Tổng quan
Đối với mô hình xác thực session cookie như trên, khi người dùng đăng nhập vào website, máy chủ sẽ tạo một phiên cho người dùng đó và lưu trữ trên máy chủ, đồng thời trả về session ID. được tải xuống và lưu trữ trong cookie trình duyệt của người dùng. Sau một ngày, người dùng phải đăng nhập lại để tạo phiên làm việc mới.). Và khi người dùng vẫn đăng nhập và Session vẫn hợp lệ thì Cookie luôn được thêm vào mỗi yêu cầu tiếp theo từ người dùng đó, mỗi lần nó được gửi đến Server.
Sau đó, máy chủ sẽ so sánh session ID nhận được từ cookie với thông tin phiên được lưu trữ trên máy chủ (có thể là RAM hoặc cơ sở dữ liệu) để xác thực người dùng và trả về phản hồi tương ứng.
Tại sao JWT lại xuất hiện và dần được ưa chuộng hơn Session?
JWT nên được sử dụng trong trường hợp nào?
- Xác thực API
- Trao đổi thông tin
- Xác thực SPA
- ủy quyền hoạt động trên các server
Xác thực phân quyền JSON Web Token
- Khái quát về Token-based authentication
- Định nghĩa JWT
- Các thuật ngữ liên quan
- Cấu trúc của một JWT
- Header
- Payload
- Signature
- Luồng xử lý của 1 hệ thống sử dụng bảo mật JWT
- Sơ lược về luồng xử lý
- Hệ thống Verify chuỗi JWT như thế nào
- Các thuật toán được sử dụng
- Luồng xử lý trong Security Spring Boot with JWT
- JWT và Session
- Scalability – Tính mở rộng
- Security – Tính bảo mật
- Performance
JWT nhúng: JWT nơi sử dụng chữ ký và/hoặc mã hóa nhúng. Trong các JWT lồng nhau, JWT được sử dụng tương ứng làm tải trọng hoặc giá trị văn bản thuần túy của cấu trúc JWS hoặc JWE xung quanh. Người dùng thực hiện đăng nhập bằng cách gửi ID/mật khẩu hoặc sử dụng tài khoản mạng xã hội đến máy chủ xác thực.
Mã xác thực tin nhắn dựa trên hàm băm (HMAC) cho phép người dùng sử dụng bí mật cộng với tính năng bảo mật để tạo MAC có thể được sử dụng để chứng minh rằng bất kỳ ai tạo MAC đều có khóa MAC. Giá trị tham số Tiêu đề được sử dụng để chỉ ra rằng chữ ký JWS là giá trị HMAC được tính toán bằng thuật toán tương ứng. JWS Signing nhận đầu vào dưới dạng giá trị văn bản và sử dụng khóa chung.
Chữ ký số RSASSA-PKCS1-v1_5 SHA256 được tạo như sau: Tạo chữ ký số của mục JWS Signing bằng RSASSA-PKCS1-v1_5 SIGN và hàm băm SHA256 với khóa riêng mong muốn. Các giá trị sau của tham số tiêu đề "alg" (thuật toán) được sử dụng để chỉ ra rằng chữ ký JWS là giá trị chữ ký số được tính toán bằng thuật toán thích hợp. Gửi mục nhập JWS Sigining, chữ ký JWS và khóa chung tương ứng với khóa riêng được thuật toán RSASSA-PKCS1-v1_5-VERIFY sử dụng bằng SHA256 làm hàm băm.
Các giá trị R và S được biểu diễn dưới dạng chuỗi octet bằng cách sử dụng chuyển đổi Integer-to-OctetString. Không có bộ nhớ phiên: Nếu bạn không sử dụng phiên thì không cần bộ nhớ để lưu phiên. Ví dụ: nếu chúng ta chạy một ứng dụng trên nhiều máy chủ thì việc sử dụng các phiên sẽ là một gánh nặng.
Không có điều nào ở trên là cần thiết nếu chúng tôi không sử dụng phiên để xác thực. Các dịch vụ RESTful thực sự: Chỉ khi chúng ta không sử dụng phiên, chúng ta mới có thể tạo một dịch vụ RESTful thuần túy vì dịch vụ RESTful thuần túy được định nghĩa là dịch vụ không trạng thái. Một cách để giải quyết thách thức này là sử dụng phiên cố định (với phiên cố định, tất cả các yêu cầu sẽ được gửi đến cùng một máy chủ vật lý).
Sử dụng JWT sẽ loại bỏ nhu cầu lưu trữ thông tin người dùng trong phiên vì xác thực dựa trên mã thông báo là không trạng thái. Ứng dụng của chúng tôi có thể mở rộng dễ dàng vì mã thông báo có thể được sử dụng để truy cập tài nguyên từ các máy chủ khác nhau mà không phải lo lắng về việc liệu người dùng có thực sự đăng nhập vào một máy chủ cụ thể hay không.
Ứng dụng xác thực phân quyền JWT trong doanh nghiệp Fintech
Gói lưu trữ trạng thái đăng nhập với JWT Header Authorization là Bearer Token được đẩy về server lọc tại máy chủ để kiểm tra trạng thái Token.
DEMO Ứng dụng authentication và authorization với ReactJS và
AuthenticationProvider sẽ gọi phương thức LoadUserByUsername để tìm thông tin Userdetail và so sánh với tên người dùng và mật khẩu trong Authentication vừa gửi trong request. Nếu Xác thực không rỗng, nghĩa là Xác thực tồn tại, hãy đặt nó vào SecurityContext và tạo JWT. Sau khi đăng nhập thành công, hệ thống trả về JWT, client lưu vào LocalStorage và thiết lập Authentication và header.
Mỗi lần hệ thống gọi chức năng tiếp theo, tiêu đề Xác thực sẽ được gắn vào mã thông báo và được gọi đến máy chủ.
DEMO tấn công JWT Token
Một số cách tấn công mã thông báo JWT
Tạo chữ ký hợp lệ bằng khóa chung và in mã thông báo jwt. Khi bạn có mã thông báo hợp lệ, hãy mở mảng Burp và thay thế mã thông báo json trước đó bằng mã thông báo mới được tạo và gửi yêu cầu. Khi làm việc với mã thông báo JWT, nếu mã thông báo JWT được ký bằng khóa bí mật yếu, chúng ta có thể sử dụng Hashcat để ép buộc khóa bí mật.
Khi người dùng đăng nhập, hãy sử dụng công cụ BurpSuite để thực hiện việc chụp. Sao chép mã thông báo và lưu nó vào một tệp văn bản. Sau khi chữ ký bí mật của mã thông báo được bẻ khóa thành công.
Sao chép mã thông báo và dán vào bộ lặp trong Burp và chuyển tiếp yêu cầu. Kết luận: JWT về cơ bản là an toàn, nhưng một số triển khai không phải ứng dụng có thể lưu trữ dữ liệu nhạy cảm trong jwt, cho phép thay đổi thuật toán ký hoặc sử dụng khóa không đủ mạnh trong chữ ký có thể khiến ứng dụng web dễ bị tấn công.
Demo tấn công
Triển khai chức năng xóa bằng JWT mới trong gói được chụp trong Burp Suite. Phản hồi phản hồi Tên người dùng và mật khẩu không hợp lệ => Máy chủ đã lọc JWT bằng Chữ ký và trả về JWT không hợp lệ. Mã thông báo Web JSON (JWT) rất nhẹ và có thể dễ dàng sử dụng trên các nền tảng và ngôn ngữ.
Đây là một cách thông minh và thuận tiện để xác thực mà không cần phiên. Có một số thư viện JWT có sẵn để ký và xác minh mã thông báo. Cũng có nhiều lý do để sử dụng mã thông báo và Auth0 có thể giúp dễ dàng triển khai xác thực mã thông báo.
Nó phụ thuộc vào kiến trúc của ứng dụng và trường hợp sử dụng cụ thể. Kết thúc Chủ đề An ninh mạng, nhóm 13 người chúng tôi đã hoàn thành báo cáo. Chạy bản demo các ứng dụng xác thực và ủy quyền với ReactJS và Spring Boot bằng JWT.
Tuy nhiên, phải nói rằng dù đã rất cố gắng nhưng nhóm 13 người chúng tôi vẫn không tránh khỏi những sai sót trong báo cáo nên rất mong nhận được sự hướng dẫn và góp ý của các bạn, xin hãy giúp đỡ tôi để báo cáo của các bạn hoàn thiện hơn.