« encoder » và « decoder » trong Base64 nghĩa là gì?
Mã hóa sang Base64 (« encode base64 ») biến các byte — thường là byte của văn bản mã hóa UTF-8 — thành chuỗi gồm 64 ký tự được phép: 26 chữ hoa, 26 chữ thường, 10 chữ số, rồi + và /. Giải mã Base64 (« decode base64 ») thực hiện chính xác thao tác ngược lại: chuỗi được đọc theo nhóm 4 ký tự, mỗi ký tự đại diện 6 bit, và 24 bit cho ra 3 byte. Đó chính là cặp qua lại mà hầu hết mọi người tìm kiếm khi gõ « encode and decode base64 ».
Base64 không phải là nén cũng không phải là mã hóa: văn bản dài thêm khoảng một phần ba, và ai cũng đọc được trong một giây. Giá trị của nó là vận chuyển byte qua các kênh chỉ nhận ký tự ASCII an toàn — URL, header HTTP, tệp cấu hình, JSON, SVG nội tuyến, email, cơ sở dữ liệu dạng văn bản.
Cách mã hóa văn bản sang Base64
Bước 1: văn bản trước được mã hóa thành byte theo bảng mã đã chọn — UTF-8 mặc định, nhưng Latin-1, Windows-1252, ASCII hoặc UTF-16 vẫn hữu ích cho dữ liệu cũ. Bước 2: các byte được đọc ba một, tức 24 bit. Bước 3: 24 bit này được cắt thành bốn khối 6 bit, mỗi khối được thay bằng ký tự tương ứng theo vị trí trong bảng chữ cái. Bước 4: nếu nhóm cuối chưa đủ, nó được bổ sung bit bằng 0 và chuỗi được đóng lại bằng một hoặc hai = (padding).
Ví dụ từng bước: « AB » có giá trị 65 rồi 66 trong thập phân, tức là 01000001 01000010. Với ba byte có đệm: 01000001 01000010 00000000. Bốn nhóm 6 bit là 010000 010100 001000 000000 → vị trí 16, 20, 8, 0 → QUI=. Chỉ cần gõ « AB » vào trình mã hóa: kết quả hiện ra trước khi bạn kịp nhả phím.
Cách giải mã Base64 về văn bản
Việc giải mã đọc chuỗi theo nhóm 4 ký tự sau khi bỏ các xuống dòng và khoảng trắng thừa. Mỗi ký tự được thay bằng giá trị 6 bit của nó, bốn giá trị được nối thành 24 bit, rồi 24 bit được cắt thành 3 byte. Các = ở cuối cho biết nhóm cuối chứa bao nhiêu byte thực sự dùng được: một = nghĩa là 2 byte, hai = nghĩa là 1 byte.
Nếu chuỗi chứa - hoặc _, đó là biến thể URL-safe: công cụ tự động chuyển chúng thành + và / trước khi giải mã. Nếu thiếu padding, nút « Sửa padding » sẽ khôi phục nó. Khi gặp ký tự ngoài bảng chữ cái, thẻ sai vị trí hoặc độ dài không chia hết cho 4, lỗi sẽ hiển thị đúng lý do thay vì chỉ « không hợp lệ ».
Biến thể URL-safe (RFC 4648 §5)
Base64 chuẩn dùng + và /, hai ký tự gây rắc rối trong URL: + được hầu hết máy chủ hiểu là khoảng trắng, còn / có thể bị nhầm với ký tự phân cách đường dẫn. Biến thể URL-safe thay thế chúng bằng - và _, không cần escape. Biến thể này là bắt buộc trong JWT (ba phân đoạn của token được mã hóa không padding), trong cookie, các mã định danh và tham số URL.
Padding « = »: dùng để làm gì
Base64 làm việc theo nhóm 4 ký tự, nhưng kích thước tệp hầu như không bao giờ chia hết cho 3 byte. Padding khôi phục độ dài mong đợi: còn 1 byte thì thành ==, 2 byte còn lại cho =. Một số hệ thống xóa padding (một số API, Base64URL); số khác lại yêu cầu (PHP, các trình giải mã cũ). Tùy chọn « Không padding » của trình mã hóa và nút « Sửa padding » của trình giải mã bao phủ cả hai trường hợp.
Bảng mã ký tự: UTF-8, Latin-1, UTF-16
Base64 không biết ký tự, chỉ biết byte. Vậy câu hỏi then chốt là: văn bản được mã hóa bằng gì trước trước khi làm Base64? Với UTF-8, « é » dài 2 byte và « 日 » dài 3; với Latin-1, « é » vừa 1 byte nhưng « 日 » trở nên bất khả thi. Việc giải mã UTF-8 một chuỗi mã hóa bằng Latin-1 sẽ cho ra các ký tự lộn xộn (« mojibake »). Nếu bạn dùng một công cụ trực tuyến mà kết quả không đọc được, gần như luôn là bảng mã đầu vào khác nhau — vì thế có sáu tùy chọn ở đây.
Tệp, data URI và hình ảnh trong Base64
Một data URI có dạng data:<kiểu MIME>;base64,<dữ liệu>. Nhờ đó bạn có thể nhúng thẳng hình ảnh vào CSS, HTML hoặc JSON: background-image:url(data:image/png;base64,iVBOR…). Để giải mã, dán toàn bộ chuỗi vào thẻ « Tệp ⇄ Base64 »: kiểu MIME được trích xuất, tên được đề xuất, rồi tệp được tái tạo và có thể tải xuống. Chú ý dung lượng: Base64 tăng khoảng 33 % và data URI không bao giờ được cache riêng lẻ.
Base64, URL-encoding và tại sao không được nhầm lẫn
Còn percent-encoding (%20, %C3%A9) thay thế từng byte không được phép bằng một mã phần trăm: nó dài gấp hai đến ba lần Base64 nhưng vẫn giữ nguyên văn bản gốc về mặt thị giác. Base64 tạo chuỗi gọn gàng, đều đặn, lý tưởng cho blob nhưng không đọc được. Thẻ « URL & data URI » đưa cả hai cách chuyển đổi cạnh nhau để tránh lỗi kinh điển là mã hóa URL sang Base64 trong khi lẽ ra phải escape — hoặc ngược lại.
Base64 trong các định dạng hàng ngày
Base64 có ở khắp nơi: ba phân đoạn của JWT, thuộc tính src của ảnh SVG nội tuyến, trường cert trong PDF, các tệp đính kèm MIME của email (RFC 2045), các Authorization: Basic của API (nguoidung:matkhau), các tệp .pem và khóa SSH, nội dung của .docx và .xlsx (ZIP), avatar trong bộ nhớ client, và các data- attributes của các bài kiểm thử tự động. Biết cách mã hóa và giải mã nhanh giúp bạn khỏi mở terminal chỉ vì một chuỗi.
Base64 không phải là gì
Base64 không mã hóa gì cả: một chuỗi mã hóa có thể đọc lại bằng một dòng code. Đừng bao giờ dùng nó để bảo vệ mật khẩu, khóa API hay dữ liệu cá nhân. Nó cũng không phải là nén: luôn dự tính thêm 33 % dung lượng. Cuối cùng, Base64 không phù hợp với dữ liệu nhị phân đã nén chặt (PNG, ZIP) trên vài megabyte, khi chi phí bộ nhớ trở nên nặng nề.
Hiệu năng và thực hành tốt
Trong trình duyệt, TextEncoder và TextDecoder xử lý nhiều megabyte mỗi giây; chính thuật toán Base64 là tuyến tính, không đệ quy cũng không cấp phát theo từng ký tự. Các tệp trên 5 MB có thể làm giao diện chậm lại: với lô lớn hơn, bạn nên xử lý bằng Web Worker hoặc phía máy chủ. Luôn ghi lại bảng mã gốc bên cạnh chuỗi, và kiểm tra vòng lặp mã hóa–giải mã trước khi lưu kết quả vào cơ sở dữ liệu.
Khuyên dùng cho
Nhà phát triển back-end và front-end (token, data URI, header HTTP), integrator và biên tập kỹ thuật (SVG nội tuyến, ảnh nền), quản trị viên hệ thống và DevOps (chứng chỉ, khóa, dump), tester và pentester (Authorization Basic, fuzzing tham số), sinh viên (hiểu về byte, ASCII và UTF-8), cũng như bất kỳ ai cần một trình mã hóa giải mã Base64 trực tuyến nhanh, đầy đủ và bảo mật.