Cách sử dụng
- Chọn Mã hóa hoặc Giải mã. Biến thể An toàn cho URL đã được chọn sẵn và Phần đệm được tắt.
- Nhập hoặc dán văn bản, nhập byte hex hoặc mở một tệp. Kết quả được cập nhật ngay khi bạn gõ.
- Chỉ bật Phần đệm nếu hệ thống nhận yêu cầu các dấu = ở cuối.
- Nhấn Sao chép hoặc Tải xuống để lấy kết quả.
Base64URL là gì?
Base64URL được định nghĩa trong mục 5 của RFC 4648 với tên gọi "Base 64 Encoding with URL and Filename Safe Alphabet" (mã hóa Base64 với bảng ký tự an toàn cho URL và tên tệp). Nó hoạt động giống hệt Base64 tiêu chuẩn, 6 bit cho mỗi ký tự, nhưng thay hai ký tự hay gây rắc rối trong URL và đường dẫn tệp:
| Base64 tiêu chuẩn | Base64URL | |
|---|---|---|
| Giá trị 62 | + | - |
| Giá trị 63 | / | _ |
| Phần đệm | =, bắt buộc | thường được lược bỏ |
Trong URL, + có thể bị hiểu là dấu cách, / phân tách các đoạn đường dẫn và = phân tách khóa với giá trị trong chuỗi truy vấn, nên Base64 tiêu chuẩn phải được mã hóa phần trăm trước khi đưa vào liên kết. Base64URL không cần thoát ký tự. RFC 4648 cho phép bỏ phần đệm khi độ dài đã được biết từ ngữ cảnh, và hầu hết các đặc tả xây dựng trên Base64URL đều làm đúng như vậy.
Base64URL được dùng ở đâu
- JSON Web Token. Phần header, payload và chữ ký của JWT đều là Base64URL không có phần đệm (RFC 7515). Bạn có thể đọc một token bằng công cụ giải mã JWT.
- OAuth 2.0 PKCE.
code_challengelà dạng Base64URL không phần đệm của giá trị băm SHA-256 tính từ code verifier (RFC 7636), nên nó luôn dài 43 ký tự. - JSON Web Key và WebAuthn. Các tham số khóa như
n,e,xvày, cũng như challenge và ID thông tin xác thực của WebAuthn, đều được trao đổi ở dạng Base64URL. - Token, ID và tên tệp. Liên kết đặt lại mật khẩu, URL có chữ ký và khóa bộ nhớ đệm mang Base64URL mà không cần thoát ký tự; một ID ngẫu nhiên 16 byte trở thành 22 ký tự. Trên hệ thống tệp không phân biệt chữ hoa chữ thường, hãy ưu tiên Base32, vì Base64URL phân biệt chữ hoa và chữ thường.
Chuyển đổi giữa Base64 và Base64URL
Cả hai biến thể đều mã hóa cùng các byte, nên việc chuyển đổi chỉ là hoán đổi ký tự: thay + bằng - và / bằng _, rồi xóa các dấu = ở cuối. Để chuyển ngược lại, hãy hoán đổi ký tự lần nữa và thêm = cho đến khi độ dài là bội số của 4. Bộ giải mã trên trang này chấp nhận cả hai bảng ký tự, có hoặc không có phần đệm.
// Node.js 16+
Buffer.from(data).toString('base64url')
Buffer.from(str, 'base64url')
# Python (urlsafe_b64encode giữ lại phần đệm)
base64.urlsafe_b64encode(data).rstrip(b'=')
// Go
base64.RawURLEncoding.EncodeToString(data)
// Java
Base64.getUrlEncoder().withoutPadding().encodeToString(bytes)
Đặc tả
| Bảng ký tự | A-Z a-z 0-9 - _ |
|---|---|
| Kích thước đầu ra | 4 ký tự cho mỗi 3 byte (khoảng 133%) |
| Phần đệm | Tùy chọn, thường được lược bỏ |
| Tiêu chuẩn | RFC 4648, mục 5 |
| Phân biệt hoa thường | Có |
Ví dụ
| Đầu vào (UTF-8) | Đầu ra |
|---|---|
Hello, World! | SGVsbG8sIFdvcmxkIQ |
Base64.is | QmFzZTY0Lmlz |
你好 | 5L2g5aW9 |
Câu hỏi thường gặp
Base64URL có giống với việc mã hóa URL cho một chuỗi Base64 không?
+, / và = thành %2B, %2F và %3D, khiến chuỗi dài hơn. Base64URL dùng một bảng ký tự khác nên hoàn toàn không cần thoát ký tự. Hai dạng này không thể dùng thay thế cho nhau nếu không chuyển đổi.Base64URL có nên có phần đệm không?
urlsafe_b64encode của Python và bộ mã hóa URL mặc định của Java lại thêm nó vào. Nếu không chắc, hãy bỏ phần đệm; bộ giải mã này chấp nhận cả hai dạng.Vì sao bộ giải mã Base64 tiêu chuẩn từ chối chuỗi Base64URL của tôi?
- và _, và một số còn yêu cầu phần đệm. Hãy hoán đổi ký tự và thêm dấu = để độ dài là bội số của 4, hoặc giải mã chuỗi ngay tại đây.Làm sao để kiểm tra code challenge của PKCE?
BASE64URL(SHA256(code_verifier)) không có phần đệm. Hãy giải mã nó tại đây với đầu ra dạng Hex: giá trị đúng sẽ cho ra đúng 32 byte, và bạn có thể so sánh chúng với giá trị băm SHA-256 của verifier.