Base64 dùng để làm gì
Base64 ra đời để chuyển dữ liệu nhị phân qua những kênh vốn được xây dựng cho văn bản. Email, JSON, XML, thuộc tính HTML, biến môi trường và header HTTP đều chờ đợi ký tự in được, và nhiều kênh trong số đó hỏng khi gặp byte thô như null, ký tự xuống dòng hay giá trị trên 127. Base64 viết lại bất kỳ chuỗi byte nào chỉ bằng 64 ký hiệu an toàn: A–Z, a–z, 0–9, + và /, với = làm ký tự đệm.
Những nơi bạn thường gặp nó:
- Xác thực HTTP Basic, nơi
user:passwordđược gửi đi dưới dạngdXNlcjpwYXNzd29yZA==. - JSON Web Token, với ba phần ngăn cách bằng dấu chấm đều là Base64 dạng URL-safe.
- Tệp đính kèm email, được truyền dưới dạng Base64 bên trong thư MIME.
- Data URI nhúng một biểu tượng nhỏ hoặc phông chữ thẳng vào HTML hay CSS.
- Payload API và tệp cấu hình cần mang chứng chỉ, khóa hoặc một khối nhị phân nhỏ dưới dạng chuỗi.
Base64 là cách mã hóa biểu diễn, không phải mã hóa bảo mật. Ai cũng giải mã được trong một giây, nên chuỗi Base64 trong tệp cấu hình không bảo vệ được gì. Nếu bạn cần kiểm tra dữ liệu có bị thay đổi hay không, hãy dùng hash.
Cách mã hóa hoạt động
Bộ mã hóa lấy đầu vào theo từng ba byte, tức 24 bit, và chia thành bốn nhóm 6 bit. Mỗi giá trị 6 bit từ 0 đến 63 chọn một ký tự trong bảng chữ cái. Ba byte vào, bốn ký tự ra, đó là lý do đầu ra Base64 luôn lớn hơn đầu vào khoảng 33%: một ảnh 30 KB trở thành khoảng 40 KB văn bản.
Khi độ dài đầu vào không chia hết cho ba, nhóm cuối cùng bị thiếu. Bộ mã hóa lấp đầy nó và đánh dấu phần thiếu bằng một hoặc hai dấu =. Vì vậy Man được mã hóa thành TWFu, Ma thành TWE= và M thành TQ==.
Văn bản phải trở thành byte trước khi được mã hóa, và công cụ này luôn dùng UTF-8 cho bước đó. Từ café dài năm byte trong UTF-8 (chữ é chiếm hai byte), còn một emoji chiếm bốn. Khi giải mã, các byte lại được hiểu là UTF-8, nên văn bản ở bất kỳ hệ chữ nào, kể cả tiếng Việt có dấu, đi một vòng vẫn giữ nguyên.
Biến thể URL-safe
Hai ký tự trong bảng chữ cái chuẩn gây rắc rối khi ra khỏi văn bản thuần. Trong URL, + có thể bị hiểu là dấu cách và / là dấu phân cách đường dẫn; trong tên tệp, / hoàn toàn không được phép. Bảng chữ cái URL-safe định nghĩa trong RFC 4648 thay chúng bằng - và _.
Khi đánh dấu ô URL-safe, công cụ thực hiện việc thay thế đó và đồng thời bỏ ký tự đệm = ở cuối, đúng như JWT và phần lớn API web mong đợi. Bộ giải mã chấp nhận cả hai dạng: nó tự đổi - và _ trở lại và khôi phục phần đệm bị thiếu, nên bạn có thể dán trực tiếp một đoạn JWT và đọc JSON bên trong. Nếu JSON đó hiện thành một dòng dài, định dạng JSON sẽ giúp nó dễ đọc.
Mã hóa tệp thành data URI
Mã hóa tệp… đọc tệp trong trình duyệt và tạo ra một data URI hoàn chỉnh như data:image/png;base64,iVBORw0KGgo…. Kiểu MIME lấy theo thông tin trình duyệt báo cho tệp; khi trình duyệt không xác định được, kiểu chung application/octet-stream được dùng. Bạn có thể dán kết quả vào <img src>, vào CSS background-image: url(...) hoặc một quy tắc @font-face.
Data URI hợp lý với tài nguyên nhỏ: một biểu tượng SVG, một ảnh giữ chỗ 1–2 KB, một logo trong chữ ký email HTML. Với thứ lớn hơn, chúng gây bất lợi. Văn bản lớn hơn tệp gốc một phần ba, không thể được lưu đệm tách biệt khỏi trang chứa nó, và làm phình HTML hoặc CSS vốn phải tải xong trước khi bất cứ thứ gì hiển thị. Mức trần thực tế là vài kilobyte cho mỗi tài nguyên.
Toàn bộ tệp được đọc vào bộ nhớ và chuyển đổi một lần, nên tệp rất lớn có thể làm tab chậm hoặc hết bộ nhớ. Tệp không được tải lên đâu cả.
Khi giải mã thất bại
Bộ giải mã hiển thị "Base64 không hợp lệ" khi đầu vào chứa ký tự nằm ngoài bảng chữ cái hoặc có độ dài không thể có. Nguyên nhân thường gặp:
- Tiền tố data URI. Hãy xóa mọi thứ cho đến hết dấu phẩy trong
data:image/png;base64,trước khi giải mã. - Xuống dòng bên trong chuỗi. Bộ mã hóa MIME ngắt Base64 ở 76 ký tự. Nếu giải mã thất bại với văn bản bị ngắt dòng, hãy nối thành một dòng trước.
- Lỗi sao chép. Thiếu ký tự cuối hoặc thừa một dấu nháy từ chuỗi JSON là đủ để làm hỏng.
Bộ giải mã luôn biến kết quả thành văn bản. Nếu dữ liệu gốc là tệp nhị phân như ảnh hoặc tệp nén ZIP, đầu ra sẽ trông như các ký hiệu ngẫu nhiên và dấu chấm hỏi; điều đó là bình thường, vì những byte đó vốn không phải văn bản.