Base64 là gì? Khi nào nên dùng (và khi nào đừng)【2026】

(Cập nhật: 19 tháng 7, 2026 ) Base64 encoding encode API Basic Auth binary khái niệm
Kết luận

Base64 = cách viết lại binary thành text ASCII an toàn cho kênh chỉ nhận chữ — không phải khóa bảo mật. Dùng khi JSON/header/email không nuốt được byte thô. Tránh khi cần giấu secret, khi file lớn (phình ~33%), hoặc khi đã có URL/multipart. Hiểu đúng khái niệm trước khi encode hàng loạt — thử nhanh trên công cụ Base64 Kawa (chạy trong trình duyệt, không cần đăng ký).

Bạn thấy chuỗi SGVsbG8= trong tài liệu API, hoặc đồng nghiệp bảo “cứ Base64 cái ảnh rồi nhét vào JSON”. Nhiều intern / fresher ở team outsourcing Việt Nam nhầm Base64 = mã hóa — gửi Authorization: Basic với mật khẩu “đã Base64” rồi tưởng an toàn. Bài này tập trung khái niệm và quyết định dùng / không dùng, không đi sâu Data URI payload (đã có bài riêng) cũng không đi sâu lỗi dấu tiếng Việt khi decode.

Ai nên đọc

  • Sinh viên / fresher mới gặp từ “Base64” trong RFC hoặc Postman
  • Backend / fullstack viết API nhận binary trong JSON
  • Ai đang cân nhắc “giấu” token bằng Base64 trong config
  • Reviewer muốn checklist ngắn trước khi approve PR nhúng Base64

Base64 là gì?

Base64 là thuật toán encoding (biến đổi biểu diễn), không phải encryption. Nó lấy dãy byte bất kỳ và viết lại bằng 64 ký tự in được:

A–Z  (26)
a–z  (26)
0–9  (10)
+ /  (2)
=    (padding, không thuộc "64" nhưng luôn gặp)

Cơ chế gọn: lấy 3 byte = 24 bit, chia thành 4 nhóm 6 bit, mỗi nhóm map sang 1 ký tự trong bảng 64. Vì vậy tên “Base64” — 2^6 = 64.

Ví dụ tối thiểu:

"Hi"  →  bytes 48 69  →  SGk=
"Hello" → SGVsbG8=

Bạn có thể encode/decode ngay trên Base64 Encode/Decode để đối chiếu kết quả với tài liệu API.

Encoding ≠ encryption ≠ hashing

Ba khái niệm hay bị trộn
Kỹ thuật Đảo ngược? Mục đích
Base64 encode Có — ai cũng decode Binary → text an toàn trên kênh ASCII
Encryption (AES…) Có — chỉ ai có key Bảo mật nội dung
Hash (SHA-256…) Không (một chiều) Checksum / chữ ký / fingerprint

Nếu PR ghi “encrypt password bằng Base64” — đó là lỗi kiến trúc, không phải chi tiết syntax.


Tại sao cần Base64?

Nhiều hệ thống không an toàn với byte tùy ý:

  • JSON là text — không nhét raw PNG vào giữa dấu ngoặc kép
  • HTTP header (Basic Auth) kỳ vọng ASCII
  • Email MIME truyền đính kèm dưới dạng text-safe
  • Log / clipboard / chat dễ làm hỏng null byte hoặc ký tự điều khiển

Base64 đổi binary thành chuỗi chỉ gồm chữ cái, số, +, /, = — gần như luôn sống sót qua copy-paste và JSON.parse.

Giá phải trả: kích thước tăng khoảng 33%, và chuỗi không đọc được bằng mắt (dù decode cực dễ).


Khi nào nên dùng

Use case hợp lý
Tình huống Ví dụ Ghi chú
Basic Auth Authorization: Basic + Base64(user:pass) Vẫn gửi qua TLS — Base64 không thay HTTPS
Payload JSON nhỏ Chữ ký, thumbnail vài KB, certificate PEM đã encode Giữ payload nhỏ; ưu tiên multipart nếu lớn
Email / MIME Đính kèm trong message Chuẩn ngành; client tự decode
Debug / học Đọc chuỗi lạ trong log Decode local, che PII trước khi paste tool lạ
Config text-only Một số hệ thống chỉ lưu string Vẫn không phải nơi cất secret production

Ví dụ Basic Auth (đúng kỳ vọng)

Authorization: Basic dXNlcjpwYXNz

Ở đây dXNlcjpwYXNz chỉ là user:pass đã encode. Ai bắt được header (không có TLS) đều đọc được ngay. Base64 ở đây là định dạng bắt buộc của RFC, không phải lớp bảo mật.

Ví dụ JSON chứa binary nhỏ

{
  "filename": "stamp.png",
  "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB..."
}

Hợp lý với stamp/icon rất nhỏ. Với ảnh 2MB — hãy upload file hoặc pre-signed URL, đừng Base64 cả object.


Khi nào không nên dùng

  1. Che mật khẩu / API key / token production — decode 1 click là lộ.
  2. File lớn trong HTML/CSS/JSON — phình ~33%, chậm mobile 3G/4G, khó cache (chi tiết Data URI xem bài riêng).
  3. Thay thế hash — Base64 không chứng minh toàn vẹn như SHA-256.
  4. Thay thế HTTPS — encode rồi gửi HTTP plain vẫn bị nghe lén dễ dàng.
  5. Lưu trữ dài hạn thay blob storage — database text phình, index kém, migration đau.
Nhầm lẫn phổ biến ở team mới

“Đã Base64 rồi nên commit vào Git được” — sai. Secret trong repo vẫn là secret. Dùng biến môi trường, secret manager, hoặc vault — không dựa vào encoding.


Padding = và độ dài chuỗi

Byte gốc (mod 3)PaddingĐộ dài output (mod 4)
0không có =chia hết 4
1==chia hết 4
2=chia hết 4

Cắt mất = khi copy từ PDF/Slack, hoặc thêm khoảng trắng/xuống dòng vào giữa chuỗi, là nguồn lỗi Invalid character / Failed to execute 'atob' rất thường gặp.

URL-safe / Base64URL: +-, /_, thường bỏ padding. JWT dùng biến thể này — đừng decode segment JWT bằng alphabet chuẩn rồi trách “token hỏng”.


Checklist quyết định (in ra dán cạnh màn hình)

Trước khi thêm Base64 vào PR, trả lời:

  • Kênh truyền bắt buộc text? (Nếu có binary upload → khỏi Base64)
  • Kích thước sau ×4/3 còn chấp nhận được trên mobile / quota API?
  • Có ai hiểu nhầm đây là encryption không? (ghi chú trong code review)
  • Đã chọn đúng chuẩn vs URL-safe theo spec?
  • Secret có bị encode rồi commit / log không?

Nếu 1–2 câu trả lời “không chắc” — encode thử 1 mẫu trên công cụ Base64 (có tùy chọn URL Safe, xử lý local) rồi đối chiếu với fixture của đối tác.


Case study ngắn

1) Fresher “mã hóa” API key bằng Base64 trong .env.example

Team review thấy API_KEY=c2stcHJvZC0uLi4= và tưởng đã an toàn để public. Decode ra plaintext. Sửa: xóa key, rotate, đưa vào secret store; .env.example chỉ để placeholder.

2) Mobile app nhét ảnh hóa đơn 1.5MB vào JSON Base64

Request timeout trên mạng Viettel/Vina chậm buổi tối; body ~2MB. Sửa: upload multipart hoặc pre-signed URL, JSON chỉ giữ fileId.


Liên quan (đọc tiếp theo nhu cầu)