Tạo JWT ký bằng HMAC-SHA256: cấu trúc token, các claim chuẩn và những chỗ dễ sai
Công cụ cho bạn soạn phần tiêu đề và phần tải trọng dưới dạng JSON, nhập một chuỗi bí mật, rồi tạo ra một token ba phần ký thật bằng thuật toán HMAC-SHA256 chạy trên trình duyệt. Bốn nút tắt giúp chèn nhanh các claim thời gian, và phần tải trọng được giải mã lại ngay bên dưới để bạn đối chiếu.
Tính năng nổi bật
- Ô soạn phần tiêu đề và phần tải trọng dưới dạng JSON, sửa tự do
- Bốn nút tắt chèn claim thời điểm phát hành, thời điểm hết hạn, thời điểm bắt đầu có hiệu lực và mã định danh token
- Nút chèn mã định danh sinh chuỗi ngẫu nhiên theo chuẩn định danh duy nhất
- Ô nhập chuỗi bí mật dùng làm khóa ký
- Ký thật bằng HMAC-SHA256 qua thư viện mã hóa có sẵn của trình duyệt, không phải giả lập
- Mã hóa ba phần theo kiểu base64 dành cho địa chỉ web, ghép lại bằng hai dấu chấm
- Giải mã ngược phần tải trọng của token vừa tạo để bạn kiểm tra lại nội dung
- Báo lỗi ngay khi phần tiêu đề hoặc phần tải trọng không phải JSON hợp lệ
Khi nào bạn cần tự tay tạo một token
Ba tình huống hay gặp trong công việc. Thứ nhất là thử một điểm cuối có bảo vệ khi phần đăng nhập chưa xong: bạn cần một token hợp lệ để gắn vào tiêu đề ủy quyền rồi gọi thử bằng công cụ kiểm thử giao diện lập trình. Thứ hai là dựng dữ liệu cho các kịch bản kiểm thử tự động, nơi bạn cần token đã hết hạn, token chưa tới hiệu lực, token thiếu claim, để xem hệ thống phản ứng ra sao. Thứ ba là học và giảng giải: mở một token ra, đổi một ký tự trong phần tải trọng rồi thấy chữ ký không còn khớp nữa là cách hiểu nhanh nhất về vai trò của chữ ký. Công cụ này gói gọn cả ba việc đó vào một trang, ký bằng đúng thuật toán thật chứ không phải mô phỏng, nên token tạo ra dùng được với mọi thư viện xác minh hỗ trợ HMAC-SHA256.
Lợi ích khi sử dụng
- Có ngay token hợp lệ để thử điểm cuối mà chưa cần dựng luồng đăng nhập
- Dựng được token hết hạn hoặc chưa hiệu lực để kiểm thử trường hợp lỗi
- Nút tắt chèn claim thời gian tránh việc tự đổi ngày giờ sang số giây
- Chữ ký tính bằng thư viện mã hóa của trình duyệt nên token dùng được thật
- Chuỗi bí mật và nội dung token không được gửi lên máy chủ nào
Cách tạo một token
- 1Xem lại phần tiêu đề, mặc định đã khai báo thuật toán HMAC-SHA256 và loại token, thường không cần sửa gì.
- 2Soạn phần tải trọng với các claim bạn cần, hoặc bấm các nút tắt để chèn nhanh claim thời gian.
- 3Nhập chuỗi bí mật vào ô khóa, đây phải là đúng chuỗi mà phía xác minh đang dùng thì token mới được chấp nhận.
- 4Bấm nút tạo token và chép chuỗi kết quả ba phần ngăn cách bằng dấu chấm.
- 5Đối chiếu phần tải trọng đã giải mã hiện bên dưới để chắc rằng các claim thời gian đúng như bạn muốn.
Ba phần của một token và kiểu mã hóa dành cho địa chỉ web
Một token gồm ba đoạn ngăn cách bằng dấu chấm. Đoạn đầu là phần tiêu đề, mô tả thuật toán ký và loại token. Đoạn giữa là phần tải trọng, chứa các thông tin bạn muốn mang theo. Đoạn cuối là chữ ký, tính từ hai đoạn đầu cộng với chuỗi bí mật. Cả ba đoạn đều được mã hóa theo kiểu base64 biến thể dành cho địa chỉ web, khác base64 thường ở ba điểm: ký tự cộng đổi thành dấu trừ, ký tự gạch chéo đổi thành gạch dưới, và các dấu bằng đệm ở cuối bị cắt bỏ. Ba thay đổi đó giúp chuỗi token đặt được trong địa chỉ và trong tiêu đề yêu cầu mà không cần mã hóa thêm lần nữa. Một chi tiết nhỏ nhưng dễ gây thắc mắc: công cụ mã hóa đúng phần văn bản bạn thấy trong ô soạn thảo, kể cả xuống dòng và thụt lề, nên token tạo ra dài hơn so với khi nén JSON về một dòng. Token vẫn hoàn toàn hợp lệ, mọi thư viện đều đọc được, chỉ là tốn thêm vài chục ký tự.
Các claim chuẩn và cách đọc con số thời gian
Chuẩn đặt ra một nhóm claim có tên ngắn và ý nghĩa cố định. Chủ thể là định danh của người hoặc thực thể mà token nói về. Bên phát hành cho biết ai tạo ra token. Đối tượng nhận cho biết token dành cho dịch vụ nào, và phía xác minh nên kiểm tra trường này để một token cấp cho dịch vụ A không dùng được ở dịch vụ B. Thời điểm phát hành ghi lúc token được tạo. Thời điểm hết hạn là mốc sau đó token phải bị từ chối. Thời điểm bắt đầu có hiệu lực là mốc trước đó token chưa được chấp nhận. Mã định danh token là chuỗi duy nhất, dùng khi bạn cần ghi sổ để thu hồi. Điểm quan trọng nhất về kỹ thuật: cả ba claim thời gian đều tính bằng số giây kể từ đầu năm 1970, không phải mili giây. Đây là chỗ sai kinh điển vì hàm lấy thời gian hiện tại trong JavaScript trả về mili giây, và một token vô tình đặt hạn theo mili giây sẽ có hiệu lực tới tận năm năm mươi nghìn. Nút chèn thời điểm hết hạn trong công cụ đặt sẵn thêm 3600 giây, tức đúng một giờ.
Chữ ký bảo đảm điều gì và không bảo đảm điều gì
Chữ ký được tính bằng cách đưa chuỗi gồm hai đoạn đầu và chuỗi bí mật qua hàm băm có khóa. Ai không biết chuỗi bí mật thì không tạo được chữ ký khớp, nên nếu kẻ tấn công sửa một chữ trong phần tải trọng, chữ ký cũ không còn đúng và phía xác minh phát hiện ngay. Đó là toàn bộ những gì chữ ký làm: bảo đảm nội dung không bị sửa và đến từ người nắm khóa. Thứ nó tuyệt đối không làm là giữ bí mật nội dung. Phần tải trọng chỉ được mã hóa dạng base64, ai cầm token cũng giải ra đọc được trong hai giây, không cần khóa gì cả. Vì vậy đừng bao giờ đặt mật khẩu, số căn cước, số thẻ hay bất cứ thông tin nhạy cảm nào vào phần tải trọng. Về độ dài khóa, thuật toán HMAC-SHA256 làm việc với khóa dài tùy ý nhưng khuyến nghị chung là khóa nên có độ dài không nhỏ hơn kích thước đầu ra của hàm băm, tức 256 bit hay 32 byte; chuỗi mặc định trong ô khóa chỉ là ví dụ, tuyệt đối không dùng cho việc thật.
Ba rủi ro cần biết trước khi dán khóa thật vào đây
Thứ nhất, dù mọi phép tính chạy trên máy bạn và không có lời gọi mạng nào, việc gõ khóa bí mật của môi trường thật vào một trang web bất kỳ vẫn là thói quen không nên có. Khóa có thể lọt vào lịch sử tự điền của trình duyệt, vào ảnh chụp màn hình khi bạn hỏi đồng nghiệp, hoặc vào phần mở rộng đang cài trên trình duyệt. Hãy dùng khóa của môi trường thử. Thứ hai, token bạn tạo ra ở đây là token thật và có hiệu lực cho tới lúc hết hạn; nếu lỡ chia sẻ nó trong một phiếu công việc hay một tin nhắn nhóm thì bất kỳ ai đọc được cũng dùng được, nên hãy đặt thời hạn ngắn cho token dùng để thử. Thứ ba, đừng học theo cách xác minh thủ công: phía máy chủ phải dùng thư viện chuẩn, phải cố định danh sách thuật toán được chấp nhận thay vì tin vào trường thuật toán trong phần tiêu đề, và phải kiểm tra đủ thời điểm hết hạn cùng đối tượng nhận. Lỗ hổng kinh điển của công nghệ này chính là máy chủ ngoan ngoãn tin vào thuật toán mà token tự khai.
Giới hạn kỹ thuật của công cụ và cách đi vòng
Giới hạn thứ nhất là bảng ký tự. Bước mã hóa dùng hàm base64 sẵn có của trình duyệt, mà hàm này chỉ nhận ký tự có mã dưới 256. Vì vậy nếu bạn đặt tên tiếng Việt có dấu vào phần tải trọng, việc tạo token sẽ báo lỗi. Cách đi vòng đơn giản và vẫn đúng chuẩn là viết các ký tự đó dưới dạng chuỗi thoát bốn chữ số hệ mười sáu ngay trong ô soạn thảo; văn bản lúc đó chỉ còn ký tự thường, mã hóa trót lọt, và mọi thư viện giải mã sẽ khôi phục lại đúng chữ có dấu. Giới hạn thứ hai là thuật toán: dù bạn sửa trường thuật toán trong phần tiêu đề thành gì, chữ ký vẫn luôn được tính bằng HMAC-SHA256. Nghĩa là bạn không tạo được token ký bằng cặp khóa bất đối xứng ở đây, và nếu đổi tên thuật toán trong tiêu đề thì token sẽ bị phía xác minh từ chối vì tiêu đề nói một đằng chữ ký một nẻo. Giới hạn thứ ba là công cụ không xác minh token có sẵn, nó chỉ tạo; muốn mở một token ra xem thì dùng công cụ giải mã token riêng.
Câu hỏi thường gặp (FAQ)
Token tạo ra ở đây có dùng thật được không?
Được. Chữ ký được tính bằng thư viện mã hóa có sẵn của trình duyệt với đúng thuật toán HMAC-SHA256, không phải mô phỏng. Miễn là chuỗi bí mật bạn nhập trùng với chuỗi mà phía xác minh đang dùng, token sẽ được chấp nhận như bất kỳ token nào do máy chủ cấp.
Vì sao báo lỗi khi phần tải trọng có tiếng Việt có dấu?
Vì bước mã hóa dùng hàm base64 sẵn có của trình duyệt, hàm này chỉ nhận ký tự có mã dưới 256 nên gặp chữ có dấu là báo lỗi. Cách đi vòng là viết ký tự đó dưới dạng chuỗi thoát bốn chữ số hệ mười sáu ngay trong ô soạn thảo, kết quả giải mã ra vẫn đúng chữ có dấu.
Đổi thuật toán trong phần tiêu đề thì công cụ có ký theo không?
Không. Chữ ký luôn được tính bằng HMAC-SHA256 bất kể bạn ghi gì trong trường thuật toán. Nếu sửa tên thuật toán mà chữ ký vẫn tính theo cách cũ, phía xác minh sẽ từ chối token vì tiêu đề và chữ ký không khớp nhau.
Đặt thông tin cá nhân vào phần tải trọng có an toàn không?
Không. Phần tải trọng chỉ được mã hóa dạng base64 chứ không hề được mã hóa bảo mật, ai cầm token cũng giải ra đọc được mà không cần khóa. Đừng bao giờ đặt mật khẩu, số căn cước, số thẻ hay dữ liệu nhạy cảm vào đó; hãy chỉ để định danh và các thông tin phân quyền tối thiểu.
Con số ở claim hết hạn tính theo đơn vị gì?
Số giây kể từ đầu năm 1970, không phải mili giây. Đây là chỗ sai kinh điển vì hàm lấy thời gian hiện tại trong JavaScript trả về mili giây. Nút tắt trong công cụ đã chia đúng và cộng thêm 3600 giây, tức token có hiệu lực một giờ kể từ lúc bấm.
Chuỗi bí mật nên dài bao nhiêu?
Với HMAC-SHA256, khuyến nghị chung là khóa không nên ngắn hơn kích thước đầu ra của hàm băm, tức 256 bit hay 32 byte. Nên dùng chuỗi ngẫu nhiên do máy sinh chứ đừng dùng câu chữ dễ đoán, vì khóa yếu có thể bị dò bằng cách thử lại nhiều lần trên một token bắt được.
Tôi có nên dán khóa của môi trường thật vào đây không?
Không nên, dù mọi phép tính chạy trên máy bạn và không có lời gọi mạng nào. Khóa có thể lọt vào lịch sử tự điền của trình duyệt, vào ảnh chụp màn hình, hoặc vào một tiện ích mở rộng đang cài. Hãy dùng khóa của môi trường thử và giữ khóa thật trong kho quản lý bí mật.
Bốn nút tắt trong phần tải trọng làm gì?
Chúng chèn nhanh các claim thời gian và mã định danh: một nút đặt thời điểm phát hành là lúc này, một nút đặt thời điểm hết hạn là một giờ sau, một nút đặt thời điểm bắt đầu có hiệu lực là lúc này, và một nút sinh chuỗi định danh duy nhất ngẫu nhiên cho token.
Vì sao token của tôi dài hơn token do máy chủ cấp?
Vì công cụ mã hóa đúng phần văn bản trong ô soạn thảo, kể cả xuống dòng và thụt lề của JSON được in đẹp. Token vẫn hoàn toàn hợp lệ và mọi thư viện đều đọc được. Muốn ngắn hơn, hãy nén phần tiêu đề và phần tải trọng về một dòng trước khi tạo.
Công cụ có kiểm tra được token có sẵn không?
Không, đây chỉ là công cụ tạo. Nó có giải mã lại phần tải trọng của token vừa tạo để bạn đối chiếu, nhưng không nhận token từ bên ngoài và không xác minh chữ ký. Muốn mở một token có sẵn ra xem, hãy dùng công cụ giải mã token riêng.
Tạo được token ký bằng cặp khóa công khai không?
Không. Công cụ chỉ hỗ trợ ký đối xứng bằng HMAC-SHA256, tức cả bên tạo và bên xác minh dùng chung một chuỗi bí mật. Các thuật toán dùng cặp khóa riêng và khóa công khai nằm ngoài phạm vi, và với chúng bạn cần một thư viện chạy phía máy chủ.
Vì sao phía máy chủ nên cố định danh sách thuật toán chấp nhận?
Vì trường thuật toán nằm trong phần tiêu đề do chính token khai báo, mà token thì do bên ngoài gửi tới. Nếu máy chủ tin vào trường đó, kẻ tấn công có thể khai một thuật toán khác để qua mặt bước kiểm tra chữ ký. Thư viện chuẩn đều cho phép khai báo trước danh sách thuật toán được phép.
Từ khóa liên quan
- tạo jwt online
- jwt generator
- json web token là gì
- ký jwt bằng hs256
- cấu trúc jwt ba phần
- base64url là gì
- claim exp iat nbf trong jwt
- thời gian unix theo giây
- chuỗi bí mật cho jwt
- jwt có mã hóa dữ liệu không
- tạo token để test api
- token hết hạn để kiểm thử
- lỗ hổng thuật toán none trong jwt
- xác minh chữ ký jwt
- giải mã jwt
- jwt và session khác nhau
- gắn token vào header authorization
- thu hồi jwt bằng jti
- hmac sha256 là gì
- công cụ tạo jwt miễn phí
