Base64

Sơ đồ mã hóa chuyển đổi dữ liệu nhị phân sang chuỗi ASCII sử dụng 64 ký tự: A-Z, a-z, 0-9, + và /.

Base64 là sơ đồ mã hóa chuyển đổi dữ liệu nhị phân thành chuỗi ASCII. Nó sử dụng 64 ký tự: A-Z (26), a-z (26), 0-9 (10), + và /, biểu diễn 3 byte dữ liệu dưới dạng 4 ký tự. Khi độ dài dữ liệu đầu vào không phải bội số của 3, các ký tự đệm (=) được thêm vào.

Base64 cần thiết vì các giao thức dựa trên văn bản như email và HTTP không thể truyền dữ liệu nhị phân thô. Nó được sử dụng rộng rãi trong tệp đính kèm email (MIME), sơ đồ data URI (data:image/png;base64,...), JWT (JSON Web Tokens) và nội dung yêu cầu/phản hồi API. Ví dụ, nhúng hình ảnh biểu tượng nhỏ trực tiếp trong HTML dưới dạng data URI sử dụng mã hóa Base64 giảm số lượng yêu cầu HTTP. Sách cơ bản bảo mật web bao gồm các trường hợp sử dụng Base64.

Trong JavaScript, btoa() mã hóa và atob() giải mã Base64. Tuy nhiên, các hàm này chỉ xử lý ký tự Latin-1, vì vậy các ký tự đa byte như tiếng Nhật cần kết hợp với TextEncoder. Trong Node.js, sử dụng Buffer.from(data).toString('base64'). Python cung cấp module base64, và Java cung cấp lớp java.util.Base64 như tiêu chuẩn.

Một hiểu lầm phổ biến là nhầm lẫn Base64 với mã hóa bảo mật. Base64 thuần túy là mã hóa (phép biến đổi có thể đảo ngược) và không cung cấp bất kỳ bảo vệ bảo mật nào. Bất kỳ ai cũng có thể dễ dàng giải mã nó, vì vậy không thể sử dụng để bảo vệ mật khẩu hoặc thông tin nhạy cảm. Cũng lưu ý rằng kích thước dữ liệu tăng khoảng 33%, vì 3 byte trở thành 4 ký tự, dẫn đến 4/3 lần kích thước ban đầu. Sách giới thiệu giao thức mạng giải thích nền tảng kỹ thuật của Base64.

Khi bao gồm chuỗi Base64 trong URL hoặc tên tệp, các ký tự + và / tiêu chuẩn gây ra vấn đề vì chúng có ý nghĩa đặc biệt. Base64url (RFC 4648) giải quyết điều này bằng cách thay thế + bằng - và / bằng _. Từ góc độ đếm ký tự, độ dài chuỗi được mã hóa Base64 có thể được tính chính xác từ số byte ban đầu: ceil(n / 3) * 4 ký tự (bao gồm đệm).