Giải mã & Xác minh JWT

Dán một JSON Web Token để giải mã header, payload và đọc các claim, rồi tùy chọn xác minh chữ ký. Mọi thứ chạy cục bộ — token và khóa của bạn không rời khỏi thiết bị.

File không bao giờ rời khỏi thiết bị của bạn

Dán một token ở trên để giải mã header và các claim. Sau khi giải mã, một khung xác minh chữ ký (nhập secret hoặc khóa công khai) sẽ hiện ra bên dưới.

Công cụ này làm gì

Công cụ này giải mã một JSON Web Token (JWT) để bạn đọc được header và payload mà không cần bất kỳ khóa nào, và tùy chọn xác minh chữ ký nếu bạn cung cấp đúng secret hoặc public key. Dán một token vào, bạn sẽ thấy ngay header đã giải mã, các claim bên trong payload, cùng các badge cho biết token đã hết hạn hay chưa có hiệu lực — tất cả được tính dựa trên đồng hồ của chính thiết bị bạn.

Mọi thứ chạy ngay trên thiết bị thông qua WebAssembly. Không có server nào tham gia vào việc giải mã hay xác minh, điều này quan trọng vì một JWT thường mang theo dữ liệu phiên đăng nhập hoặc định danh mà bạn không muốn để lộ qua backend của bên thứ ba chỉ để xem thử.

Cấu trúc của một token

Một JWT gồm ba đoạn được mã hóa base64url nối với nhau bằng dấu chấm: header, payload và signature — viết dưới dạng header.payload.signature. Header nêu tên thuật toán ký và loại token; payload chứa các claim (như subject, thời điểm hết hạn, hoặc dữ liệu tùy ứng dụng); signature là phần mà bên xác minh kiểm tra để xác nhận hai đoạn đầu chưa bị chỉnh sửa.

// Payload đã giải mã, ví dụ
{
  "sub": "1234567890",
  "name": "Ada Lovelace",
  "exp": 1735689600
}
Mẹo: Việc giải mã không cần khóa vì header và payload chỉ được mã hóa (encode) chứ không phải mã hóa bảo mật (encrypt) — ai có văn bản token cũng đọc được. Đây chính là lý do một token đã giải mã nhưng chưa xác minh không nên được tin dùng cho bất cứ việc gì liên quan đến bảo mật: đọc claim và xác nhận chúng là thật là hai việc hoàn toàn khác nhau.

Giải mã và xác minh khác nhau thế nào

Đây là hai bước riêng biệt, và sự khác biệt này rất quan trọng. Giải mã chuyển header và payload dạng base64url trở lại thành JSON đọc được — không cần khóa, và hoạt động với bất kỳ token đúng định dạng nào, dù thật hay giả mạo. Xác minh tính lại chữ ký bằng một secret (HS256) hoặc đối chiếu với một public key (RS256, ES256) và xác nhận nó khớp với phần đính kèm trong token. Chỉ khi xác minh thành công bạn mới biết chắc token thực sự do bên nắm giữ khóa đó phát hành và chưa bị can thiệp kể từ đó.

Nên chọn thuật toán nào?

Thuật toánLoại khóaCách xác minh hoạt động
HS256Secret dùng chung (HMAC)Cùng một secret đã ký token được dùng để tính lại chữ ký — cả bên phát hành lẫn bên xác minh đều phải nắm giữ nó
RS256Cặp khóa RSABên phát hành ký bằng private key; bạn xác minh bằng public key tương ứng, vốn an toàn để chia sẻ
ES256Cặp khóa đường cong elliptic (P-256)Cùng cơ chế public/private như RS256, dùng ECDSA trên đường cong P-256 cho chữ ký nhỏ gọn hơn

Hãy dùng đúng thuật toán mà token thực sự được phát hành — việc xác minh chỉ thành công với đúng khóa dành cho thuật toán cụ thể đó, không phải bất kỳ khóa nào bạn đang có.

Vì sao alg: none bị từ chối

Một số ít thư viện xử lý JWT trước đây từng coi thuật toán none là "hợp lệ, không cần chữ ký", nghĩa là bất kỳ ai cũng có thể tạo ra một token với claim tùy ý và khiến nó được chấp nhận như thật — đây là một dạng lỗ hổng JWT đã được ghi nhận rộng rãi trong thực tế. Công cụ này luôn coi alg: none là xác minh thất bại thay vì hợp lệ, nên việc dán một token chưa ký vào đây sẽ không bao giờ cho ra kết quả "hợp lệ" gây hiểu lầm.

Token của bạn không bao giờ rời khỏi thiết bị

Văn bản token, cùng bất kỳ secret hay public key nào bạn nhập để xác minh, được xử lý hoàn toàn bên trong một module WebAssembly chạy trong tab trình duyệt của bạn. Không có gì được tải lên, ghi log hay gửi tới server — đóng tab là mọi thứ biến mất, vì ngay từ đầu đã không có request mạng nào mang token của bạn đi cả.

Nếu bạn cần thiết lập xác thực hai yếu tố, xem Tạo mã TOTP & Thiết lập 2FA. Nếu bạn cần một cặp khóa mới để ký token bằng RS256 hoặc ES256 ở nơi khác, xem Tạo cặp khóa — cả hai đều xử lý ngay trên thiết bị giống như công cụ này.

Câu hỏi thường gặp

Token của tôi có bị gửi đi đâu không?
Không. Việc giải mã và xác minh đều diễn ra ngay trên trình duyệt bằng WebAssembly — token bạn dán vào, cùng bất kỳ secret hay public key nào bạn nhập để xác minh, không bao giờ rời khỏi thiết bị hay chạm tới bất kỳ request mạng nào.
Công cụ hỗ trợ những thuật toán xác minh nào?
HS256 (dùng một secret dùng chung, theo cơ chế HMAC), và RS256 cùng ES256 (dùng chữ ký khóa công khai, theo cơ chế RSA và ECDSA tương ứng). Chọn đúng thuật toán mà token của bạn được phát hành, rồi cung cấp secret hoặc public key tương ứng.
Tại sao việc xác minh lại cần đến khóa hoặc secret?
Chữ ký là một bằng chứng toán học rằng chỉ ai nắm giữ đúng secret hoặc private key mới tạo ra được. Xác minh nghĩa là tính lại bằng chứng đó: với HS256 công cụ cần đúng secret dùng chung mà bên phát hành đã dùng, còn với RS256 hoặc ES256 công cụ cần public key của bên phát hành. Không có đúng khóa thì không có cách nào phân biệt một token thật với một token bị giả mạo.
Tôi có thể chỉnh sửa hoặc ký lại một token bằng công cụ này không?
Không — công cụ này chỉ giải mã và xác minh các token đã có sẵn; nó không tạo mới hay ký lại token. Đây là chủ đích: một công cụ cho phép sửa claim rồi ký lại bằng khóa tùy ý là một thứ rất khác (và rủi ro hơn nhiều) so với một công cụ chỉ để đọc và kiểm tra token bạn đã có.
Tại sao công cụ lại từ chối token của tôi với alg none?
Thuật toán `none` nghĩa là "hoàn toàn không có chữ ký" — trước đây một số thư viện từng chấp nhận giá trị này và coi token là hợp lệ mà không kiểm tra gì cả, điều này cho phép kẻ tấn công giả mạo bất kỳ claim nào họ muốn. Công cụ này luôn coi `alg: none` là xác minh thất bại chứ không phải hợp lệ, nên bạn sẽ không bao giờ nhận nhầm kết quả "hợp lệ" từ một token chưa ký.
Sự khác biệt giữa giải mã và xác minh là gì?
Giải mã chỉ đơn giản là đọc header và payload — chúng được mã hóa base64url chứ không phải mã hóa bảo mật hay ẩn giấu, nên ai cũng có thể giải mã một token mà không cần bất kỳ khóa nào. Xác minh là một bước riêng, kiểm tra chữ ký dựa trên secret hoặc public key để xác nhận token chưa bị can thiệp và thực sự do bên nắm giữ khóa đó phát hành. Các claim đã giải mã mà chưa được xác minh thì không chứng minh được điều gì cả.
Công cụ hiển thị badge đã hết hạn — điều đó có nghĩa chữ ký không hợp lệ không?
Không, đây là hai phép kiểm tra độc lập. Badge đã hết hạn dựa trên việc đọc claim `exp` rồi so sánh với đồng hồ của thiết bị bạn, việc này hoạt động được ngay cả khi không có khóa nào. Tính hợp lệ của chữ ký là một phép kiểm tra khác, cần đến secret hoặc public key. Một token có thể được ký đúng nhưng đã hết hạn, hoặc chưa ký/bị sửa đổi nhưng claim `exp` vẫn chưa tới hạn — hãy kiểm tra cả hai trước khi tin dùng một token.