Mã hoá Base64 & URL
Base64, Base64URL, URL encode và escape HTML — hỗ trợ đầy đủ tiếng Việt có dấu.
Nhập nội dung để xem kết quả.
Cách tính
Base64 không phải là mã hoá bảo mật. Nó là cách biểu diễn dữ liệu nhị phân bằng 64 ký tự an toàn khi truyền qua những kênh chỉ chấp nhận văn bản — email, JSON, URL. Bất kỳ ai cũng giải mã ngược được trong một giây, nên đừng dùng nó để giấu thứ gì.
Cách hoạt động: gom từng 3 byte đầu vào thành 24 bit, cắt thành 4 nhóm 6 bit, rồi tra bảng 64 ký tự để lấy 4 ký tự đầu ra. Vì thế đầu ra luôn dài hơn đầu vào khoảng một phần ba. Khi số byte không chia hết cho 3, phần thiếu được bù bằng dấu "=" ở cuối — đó là lý do bạn hay thấy một hoặc hai dấu bằng ở đuôi chuỗi.
Chi tiết quan trọng nhất với tiếng Việt: hàm btoa có sẵn của trình duyệt chỉ nhận Latin-1 và ném lỗi ngay khi gặp ký tự có mã trên U+00FF — nghĩa là ném lỗi ở chữ có dấu đầu tiên. Trang này mã hoá văn bản sang byte UTF-8 bằng TextEncoder trước, nên "Xin chào" đi và về nguyên vẹn.
Base64URL là biến thể dùng trong URL và trong JWT: hai ký tự "+" và "/" đổi thành "-" và "_", và phần đệm "=" bị bỏ đi. Đưa một chuỗi Base64URL vào bộ giải mã Base64 thường sẽ lỗi ngay ở ký tự "-" đầu tiên, nên đây là hai chế độ riêng chứ không phải một.
Công thức
độ dài Base64 = ⌈số byte ÷ 3⌉ × 4
Luôn là bội số của 4 và dài hơn đầu vào khoảng 33%. Một chuỗi Base64 hợp lệ không bao giờ có độ dài chia 4 dư khác 0 — đó là phép kiểm tra rẻ nhất để loại chuỗi hỏng.
Ví dụ
Mã hoá chữ "Chào" (tiếng Việt có dấu):
- Văn bản
- Chào
- Byte UTF-8
- 43 68 C3 A0 6F — 5 byte, không phải 4
- Base64
- Q2jDoG8=
- Dùng btoa trực tiếp
- InvalidCharacterError
Chữ "à" chiếm 2 byte trong UTF-8, và đó chính là byte làm btoa ném lỗi. Chuyển sang byte trước khi mã hoá là bước bắt buộc, không phải tuỳ chọn.
Câu hỏi thường gặp
Base64 có phải là mã hoá bảo mật không?
Không. Nó chỉ là cách biểu diễn, ai cũng giải ngược được mà không cần khoá. Đừng bao giờ dùng Base64 để bảo vệ mật khẩu, khoá API hay dữ liệu cá nhân.
Vì sao chuỗi Base64 có dấu = ở cuối?
Đó là phần đệm. Base64 xử lý theo nhóm 3 byte; khi nhóm cuối chỉ có 1 hoặc 2 byte, phần thiếu được đánh dấu bằng hai hoặc một dấu bằng để bộ giải mã biết cần bỏ bao nhiêu bit.
Base64 và Base64URL khác nhau ở đâu?
Base64URL đổi "+" thành "-", "/" thành "_" và bỏ dấu "=", để chuỗi đặt thẳng vào URL mà không phải mã hoá phần trăm. Đây là dạng dùng trong JWT và phần lớn token trên đường dẫn.
URL encode khác Base64 thế nào?
URL encode chỉ thay những ký tự không an toàn trong URL bằng dạng %XX và giữ nguyên phần còn lại, nên kết quả vẫn đọc được. Base64 biến đổi toàn bộ dữ liệu và cho ra chuỗi không đọc được. Dùng URL encode cho tham số truy vấn, Base64 cho dữ liệu nhị phân.
Vì sao giải mã báo "không phải văn bản UTF-8"?
Vì chuỗi giải ra byte hợp lệ nhưng dãy byte đó không phải văn bản UTF-8 — thường là bạn đang giải một tệp ảnh, một khoá nhị phân, hoặc một chuỗi bị cắt mất một phần. Trang này báo lỗi thay vì trả về một chuỗi đầy ký tự thay thế trông như giải mã thành công.
Nội dung tôi dán vào có được gửi đi đâu không?
Không. Mọi phép mã hoá và giải mã chạy trên trình duyệt của bạn. Trang này là tệp HTML tĩnh, không có máy chủ nào nhận dữ liệu.