Mã hóa Base64 cho văn bản và tệp

Chuyển văn bản, byte thô hoặc bất kỳ tệp nào sang Base64. Chọn bảng mã mà bên nhận mong đợi, giữ hoặc bỏ phần đệm =, và ngắt dòng ở 76 hoặc 64 ký tự cho MIME và PEM.

Chạy hoàn toàn trong trình duyệt của bạn. Không có gì được tải lên.

Cách sử dụng

  1. Nhập hoặc dán văn bản cần mã hóa, chuyển Đầu vào dạng sang Hex để mã hóa byte thô, hoặc nhấp Mở tệp để mã hóa một tệp.
  2. Giữ Bảng mã ở UTF-8, trừ khi hệ thống nhận yêu cầu một bảng mã khác.
  3. Thiết lập các tùy chọn: giữ Biến thể Tiêu chuẩn cho hầu hết trường hợp, tắt Phần đệm nếu bên nhận không cần, và đặt Ngắt dòng ở 76 (MIME) hoặc 64 (PEM) ký tự khi cần.
  4. Nhấn Sao chép để lấy kết quả Base64 hoặc Tải xuống để lưu thành tệp.

Cách hoạt động của mã hóa Base64

Bộ mã hóa đọc dữ liệu đầu vào theo từng nhóm ba byte. 24 bit đó được chia thành bốn nhóm 6 bit, và mỗi giá trị 6 bit (0 đến 63) ứng với một ký tự: A-Z cho 0 đến 25, a-z cho 26 đến 51, 0-9 cho 52 đến 61, tiếp theo là + và /. Ba byte vào, bốn ký tự ra, đó là lý do Base64 lớn hơn dữ liệu gốc khoảng 33%.

Văn bản  M        a        n
Byte     77       97       110
Bit      01001101 01100001 01101110
6 bit    010011 010110 000101 101110
Chỉ số   19     22     5      46
Base64   T      W      F      u

Phần đệm và độ dài đầu ra

Khi độ dài đầu vào không phải bội số của ba, nhóm cuối cùng sẽ không đủ. Một byte còn dư trở thành hai ký tự kèm ==; hai byte còn dư trở thành ba ký tự và một =. Vì vậy, với n byte đầu vào, đầu ra có phần đệm luôn dài đúng 4 × ceil(n / 3) ký tự.

Phần đệm không chứa dữ liệu. JSON Web Token, tham số URL và nhiều API lược bỏ nó, vì vậy hãy tắt Phần đệm khi bên nhận cần đầu ra không có phần đệm. Với liên kết và tên tệp, hãy chọn biến thể An toàn cho URL hoặc dùng trang Base64URL; cả hai đều thay + và / bằng - và _.

Ngắt dòng cho MIME và PEM

Mặc định, đầu ra là một dòng dài duy nhất, đúng như JSON, data URI và header HTTP yêu cầu. Có hai định dạng cần ngắt dòng:

  • MIME, 76 ký tự. Tệp đính kèm email gửi với Content-Transfer-Encoding: base64 không được có dòng nào dài quá 76 ký tự (RFC 2045). Tùy chọn này kết thúc mỗi dòng bằng CRLF như MIME yêu cầu.
  • PEM, 64 ký tự. Chứng chỉ và khóa nằm giữa các dòng -----BEGIN và -----END dùng các dòng dài 64 ký tự (RFC 7468). Tùy chọn này dùng ký tự xuống dòng LF.

Bảng mã và tệp

Base64 mã hóa byte chứ không phải chữ cái, nên văn bản trước tiên được chuyển thành byte theo một bảng mã. Chữ é chiếm hai byte trong UTF-8 nhưng chỉ một byte trong ISO-8859-1 hoặc Windows-1252, nên cùng một văn bản sẽ cho ra Base64 khác nhau. UTF-8 là lựa chọn đúng cho web, JSON và gần như mọi API hiện đại; chỉ chọn GBK, Shift_JIS, Windows-1251 hoặc bảng mã khác khi cần khớp với một hệ thống cũ.

Tệp được mã hóa đúng như khi lưu trữ, không qua chuyển đổi bảng mã. Với hình ảnh kèm sẵn đoạn mã HTML và CSS, hãy xem Ảnh sang Base64; để có data URI với kiểu MIME được tự động nhận dạng, hãy dùng Tệp sang Base64.

Đặc tả

Bảng ký tựA-Z a-z 0-9 + /
Kích thước đầu ra4 ký tự cho mỗi 3 byte (khoảng 133%)
Phần đệmThêm = cho đủ bội số của 4 ký tự
Tiêu chuẩnRFC 4648, mục 4
Phân biệt hoa thườngCó

Ví dụ

Đầu vào (UTF-8)Đầu ra
Hello, World!SGVsbG8sIFdvcmxkIQ==
Base64.isQmFzZTY0Lmlz
你好5L2g5aW9

Câu hỏi thường gặp

Vì sao kết quả Base64 của tôi khác với công cụ mã hóa khác?
Hầu như luôn là do byte đầu vào khác nhau. Các nguyên nhân thường gặp là ký tự xuống dòng ở cuối (lệnh shell echo tự thêm một ký tự như vậy; hãy dùng printf '%s' hoặc echo -n), bảng mã khác, ký tự xuống dòng kiểu Windows trong văn bản, hoặc khác biệt về phần đệm, bảng ký tự hay thiết lập ngắt dòng. Cùng một dãy byte với cùng tùy chọn luôn cho ra cùng một kết quả.
Làm sao để mã hóa Base64 văn bản Unicode trong JavaScript?
btoa() chỉ chấp nhận ký tự đến U+00FF và báo lỗi với mọi ký tự khác. Trước tiên hãy chuyển chuỗi thành các byte UTF-8, ví dụ btoa(String.fromCharCode(...new TextEncoder().encode(str))). Trong Node.js, hãy dùng Buffer.from(str, 'utf8').toString('base64').
Làm sao để mã hóa Base64 trên dòng lệnh?
Chạy printf '%s' 'your text' | base64 trên Linux hoặc macOS. Lệnh base64 của GNU mặc định ngắt dòng đầu ra ở 76 ký tự (thêm -w 0 để có một dòng duy nhất), còn openssl base64 ngắt ở 64 ký tự (thêm -A).
Mã hóa Base64 có phải là một hình thức mã hóa bảo mật không?
Không. Base64 không có khóa và ai cũng có thể đảo ngược nó bằng công cụ giải mã Base64. Base64 tồn tại để chuyển dữ liệu nhị phân qua các kênh chỉ chấp nhận văn bản, chứ không phải để che giấu thông tin.
Base64 làm dữ liệu của tôi lớn thêm bao nhiêu?

Mỗi 3 byte trở thành 4 ký tự, làm tròn lên thành một nhóm đầy đủ, nên đầu ra lớn hơn khoảng 33%. Ngắt dòng kiểu MIME còn thêm hai byte (CRLF) sau mỗi 76 ký tự.