Công cụ mã hóa và giải mã Base64URL

Chuyển văn bản, byte hex hoặc tệp sang Base64 an toàn cho URL và ngược lại. Bảng ký tự dùng - và _ thay cho + và /, còn phần đệm mặc định được tắt, giống như trong JSON Web Token và OAuth PKCE.

Chạy hoàn toàn trong trình duyệt của bạn. Không có gì được tải lên.

Cách sử dụng

  1. 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.
  2. 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õ.
  3. Chỉ bật Phần đệm nếu hệ thống nhận yêu cầu các dấu = ở cuối.
  4. 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ẩnBase64URL
Giá trị 62+-
Giá trị 63/_
Phần đệm=, bắt buộcthườ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_challenge là 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, x và 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 ra4 ký tự cho mỗi 3 byte (khoảng 133%)
Phần đệmTùy chọn, thường được lược bỏ
Tiêu chuẩnRFC 4648, mục 5
Phân biệt hoa thườngCó

Ví dụ

Đầu vào (UTF-8)Đầu ra
Hello, World!SGVsbG8sIFdvcmxkIQ
Base64.isQmFzZTY0Lmlz
你好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?
Không. Mã hóa phần trăm Base64 tiêu chuẩn sẽ biến +, / 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?
Tùy vào bên sử dụng. JWT, JSON Web Key và PKCE yêu cầu bỏ phần đệm, trong khi 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?
Các bộ giải mã tiêu chuẩn nghiêm ngặt không chấp nhận - 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?
Challenge là 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.