Base64 là gì?
Base64 viết lại các byte bằng sáu mươi bốn ký tự dễ đọc để dữ liệu sống sót qua một kênh được xây cho văn bản: nội dung email, chuỗi JSON, thuộc tính XML, URL. Mỗi ba byte thành bốn ký tự, đó là nguồn gốc của tên gọi — bảng chữ cái có sáu mươi bốn ký hiệu và mỗi ký hiệu mang đúng sáu bit.
Đây là một mã hóa truyền tải, không phải biện pháp bảo mật và không phải bước nén. Đầu ra lớn hơn đầu vào khoảng một phần ba, và bất kỳ ai có chuỗi đều có thể đổi ngược ngay. Nếu bạn muốn biết dữ liệu có bị thay đổi không, đó là việc của hàm băm (Công cụ tạo hash); nếu bạn muốn nó được giữ bí mật, đó là mã hóa. Base64 không làm cả hai.
Một con số cần nhớ: ba byte đầu vào thành bốn ký tự đầu ra. Mọi thứ khác trên trang này suy ra từ đó. Bốn ký tự mang hai mươi bốn bit, và hai mươi bốn bit đúng bằng ba byte, nên dữ liệu không bao giờ bị mất hoặc bị bịa thêm — trừ ở cuối cùng, khi đầu vào có thể không đủ lấp đầy nhóm ba cuối.
Năm bảng chữ cái mà trang này có thể dùng
Hai dòng đầu là tiêu chuẩn và ba dòng cuối là quy ước hình thành xung quanh Unix. Cả năm đều mang sáu bit mỗi ký tự và chỉ khác nhau ở sáu mươi bốn ký tự nào thực hiện việc mang dữ liệu, nên cùng các byte thành năm chuỗi khác nhau. Không có gì bên trong chuỗi cho biết bảng chữ cái nào đã tạo ra nó, đó là lý do bộ chọn bảng chữ cái mặc định là chuẩn và ô đánh dấu an toàn URL là một đường tắt cho dòng thứ hai.
Cách trang chọn ứng viên: bộ chọn là mặc định cho cả hai chiều. Khi giải mã, khung bên phải cũng đọc chính chuỗi — - và _ chỉ có thể đến từ bảng an toàn URL, + hoặc / chỉ có thể đến từ bảng chuẩn, và một / hoặc . gần đầu chỉ về hai bảng Unix. Mọi bảng chữ cái có thể đọc đầu vào hiện tại đều được liệt kê ở đó, kèm lý do vì sao nó là hoặc không là ứng viên.
Ngắt dòng: 76 và 64 ký tự
MIME yêu cầu Base64 vừa với email mà không có dòng nào dài quá mức, và chọn 76 ký tự mỗi dòng, phân cách bằng CRLF. Các tệp PEM, bọc chứng chỉ và khóa, dùng 64. Các dấu xuống dòng không phải là một phần của dữ liệu: bộ giải mã loại bỏ chúng và nối các dòng lại trước khi làm bất cứ việc gì khác, nên một chuỗi đã ngắt dòng và một chuỗi không ngắt dòng giải mã ra đúng cùng các byte. Mọi dòng trừ dòng cuối đều chứa một số nguyên nhóm bốn ký tự, đó là điều làm việc nối lại an toàn.
Trang này để đầu ra trên một dòng trừ khi bạn chọn độ rộng, và bộ giải mã nhận đầu vào có hoặc không có dấu xuống dòng. Các dấu xuống dòng do trang này ghi là ký tự xuống dòng đơn thuần, đó là thứ một hộp văn bản chứa được; thư MIME thường dùng ký tự xuống đầu dòng trước mỗi ký tự xuống dòng, và mọi bộ giải mã đang dùng đều chấp nhận cả hai.
Phần đệm, và vì sao có thể bỏ nó
Khi đầu vào không phải bội số của ba byte, nhóm bốn ký tự cuối sẽ chưa đủ, và một hoặc hai ký tự = lấp đầy nó. Chúng không mang dữ liệu nào: chúng chỉ cho biết có bao nhiêu trong bốn ký tự là thật. Bộ giải mã có thể suy ra điều đó từ độ dài, đó là lý do Base64 an toàn URL thường bỏ phần đệm — = rắc rối trong URL hay tên tệp, và một số hệ thống phải mã hóa phần trăm nó.
Ô đánh dấu trong hàng tùy chọn giữ phần đệm khi bảng chữ cái an toàn URL được chọn. Không có gì khác thay đổi; các ký tự mang dữ liệu là giống nhau trong cả hai trường hợp.
Những hiểu lầm thường gặp
- "Base64 giấu dữ liệu." Không. Đó là một phép thay thế không có khóa, và điểm mấu chốt là bất kỳ người đọc nào cũng hoàn tác được. Bọc mật khẩu hay token bằng Base64 không thay đổi gì về việc ai đọc được nó.
- "Base64 nén dữ liệu." Ngược lại: mỗi ba byte đầu vào thành bốn ký tự đầu ra, nên văn bản lớn hơn một phần ba so với dữ liệu nó mang.
- "Các dấu xuống dòng là một phần của giá trị." Chúng chỉ là cách trình bày. Thêm hay bỏ chúng không bao giờ thay đổi các byte trả về.
- "An toàn URL là một mã hóa khác." Đó là cùng một mã hóa với hai ký tự được hoán đổi:
+ thành - và / thành _, nên chuỗi có thể nằm trong đường dẫn URL hay giá trị truy vấn mà không cần thoát. - "Chuỗi giải mã được thì phải là Base64 hợp lệ." Bất kỳ chuỗi ký tự nào của bảng chữ cái cũng là Base64 hợp lệ, vì mọi tổ hợp giá trị sáu bit đều là một dãy byte hợp lệ. Chuỗi chỉ lộ ra là sai ở bước tiếp theo, khi các byte đó được kiểm tra theo định dạng mà chúng phải tuân theo.
- "Phần đệm cho biết đã dùng bảng chữ cái nào." Không, và trong hầu hết trường hợp các ký tự cũng không cho biết: bảng chuẩn và bảng an toàn URL trùng nhau ở sáu mươi hai trên sáu mươi bốn ký hiệu, nên một chuỗi ngắn thường đọc giống nhau ở cả hai.
Các câu hỏi thường gặp
Vì sao một chuỗi Base64 đôi khi kết thúc bằng một = và đôi khi bằng hai? Một cái nghĩa là nhóm cuối mang ba ký tự thật, tức là hai byte đầu vào; hai cái nghĩa là nó mang hai ký tự, tức là một byte đầu vào. Không có = nghĩa là độ dài đầu vào là bội số của ba.
Base64 có thể biểu diễn các tệp nhị phân tùy ý không? Có, và đó là công dụng chính của nó. Trang này coi đầu vào là văn bản UTF-8; công cụ Tệp sang Base64 chuyên dụng đọc các byte thô khi bạn muốn mã hóa thứ không phải văn bản.
Nên dùng bảng chữ cái nào trong API? Cái mà đầu nhận ghi trong tài liệu. Nếu nó ghi an toàn URL, hãy dùng vậy; nếu không ghi gì và giá trị đi trong URL, thì an toàn URL với phần đệm bị bỏ là lựa chọn an toàn.
Đầu ra có phân biệt hoa thường không? Hoàn toàn có. a và A là hai giá trị khác nhau, đó là lý do Base64 chịu được một ký tự gõ sai kém duyên dáng hơn nhiều so với Base32 hay Crockford Base32.