Base64

January 5, 2019

Base64 là gì?

Trong lập trình, Base64 là nhóm lược đồ mã hóa nhị phân thành văn bản đại diện cho dữ liệu nhị phân (cụ thể hơn là chuỗi byte 8 bit) ở định dạng chuỗi ASCII bằng việc dịch dữ liệu sang biểu diễn cơ số 64. Thuật ngữ Base64 bắt nguồn từ một mã hóa truyền nội dung MIME. Mỗi chữ số Base64 không phải là đại diện cuối cùng cho chính xác 6 bit dữ liệu. Do đó, ba byte 8 bit (24 bit) có thể được biểu diễn bằng bốn chữ số Base64 6 bit.

Thông thường tất cả các lược đồ mã hóa nhị phân thành văn bản, Base64 được thiết kế để mang dữ liệu được lưu trữ ở định dạng nhị phân qua các kênh chỉ hỗ trợ nội dung văn bản một cách đáng tin cậy. Base64 đặc biệt phổ biến trên World Wide Web[1] trong đó các công dụng của nó bao gồm khả năng đính các tệp hình ảnh hoặc các nội dung nhị phân khác vào bên trong các nội dung văn bản như tệp HTML và CSS.[2]

Base64 cũng được sử dụng rộng rãi để gửi các tệp đính kèm email. Điều này bắt buộc vì SMTP chỉ được thiết kế để vận chuyển các ký tự ASCII 7-bit. Chi phí phải trả cho mã hóa này là 33–36% (33% bởi chính mã hóa; thêm tối đa 3% do ngắt dòng được chèn).

Thiết kế

Bộ 64 ký tự cụ thể được chọn để đại diện cho các giá trị 64 chữ số cho cơ sở khác nhau giữa các lần triển khai. Chiến lược chung là chọn 64 ký tự phổ biến cho hầu hết các bảng mã và cũng có thể in được. Sự kết hợp này khiến dữ liệu khó có thể bị sửa đổi khi truyền qua các hệ thống thông tin, chẳng hạn như email, theo truyền thống không phải là 8-bit clean.[3] Ví dụ, triển khai Base64 của MIME, ta sử dụng A-Z, a-z, và 0-9 cho 62 giá trị đầu tiên. Các biến thể khác chia sẻ thuộc tính này nhưng khác nhau về các ký hiệu được chọn cho hai giá trị cuối cùng; một ví dụ là UTF-7.

Các trường hợp sớm nhất của kiểu mã hóa này được tạo ra để liên lạc quay số giữa các hệ thống chạy cùng một hệ điều hành. Ví dụ: uuencode cho UNIX và BinHex cho TRS-80 (sau này được điều chỉnh cho Macintosh), và do đó có thể đưa ra nhiều giả định hơn về những ký tự nào an toàn để sử dụng. Ví dụ: uuencode sử dụng chữ hoa, chữ số và nhiều ký tự dấu câu, nhưng không sử dụng chữ thường.

Bảng Base64

Bảng mục lục các ký tự của Base64:

STT Nhị phân Đầu ra STT Nhị phân Đầu ra STT Nhị phân Đầu ra STT Nhị phân Đầu ra
0 000000 A 16 010000 Q 32 100000 g 48 110000 w
1 000001 B 17 010001 R 33 100001 h 49 110001 x
2 000010 C 18 010010 S 34 100010 i 50 110010 y
3 000011 D 19 010011 T 35 100011 j 51 110011 z
4 000100 E 20 010100 U 36 100100 k 52 110100 0
5 000101 F 21 010101 V 37 100101 l 53 110101 1
6 000110 G 22 010110 W 38 100110 m 54 110110 2
7 000111 H 23 010111 X 39 100111 n 55 110111 3
8 001000 I 24 011000 Y 40 101000 o 56 111000 4
9 001001 J 25 011001 Z 41 101001 p 57 111001 5
10 001010 K 26 011010 a 42 101010 q 58 111010 6
11 001011 L 27 011011 b 43 101011 r 59 111011 7
12 001100 M 28 011100 c 44 101100 s 60 111100 8
13 001101 N 29 011101 d 45 101101 t 61 111101 9
14 001110 O 30 011110 e 46 101110 u 62 111110 +
15 001111 P 31 011111 f 47 101111 v 63 111111 /
Đệm   =                  

Đệm đầu ra

Bởi vì Base64 là mã hóa sáu bit và vì các giá trị được giải mã được chia thành các bộ tám 8 bit trên máy tính hiện đại, nên cứ bốn ký tự của văn bản được mã hóa Base64 (4 sextet = 4 × 6 = 24 bit) đại diện cho ba bộ tám chưa được mã hóa văn bản hoặc dữ liệu (3 octet = 3 × 8 = 24 bit). Điều này có nghĩa là khi độ dài của đầu vào không được mã hóa không phải là bội số của ba, thì đầu ra được mã hóa phải được thêm phần đệm để chiều dài của nó là bội số của bốn. Ký tự đệm là =, cho biết rằng không cần thêm bit nào để mã hóa đầy đủ đầu vào. (Điều này khác với A, có nghĩa là các bit còn lại đều là số không.) Ví dụ dưới đây minh họa cách cắt bớt đầu vào của câu trích dẫn trên thay đổi phần đệm đầu ra:

Ký tự đệm không cần thiết để giải mã, vì số byte bị thiếu có thể được suy ra từ độ dài của văn bản được mã hóa. Trong một số triển khai, ký tự đệm là bắt buộc, trong khi đối với những cách khác, ký tự này không được sử dụng. Một ngoại lệ trong đó các ký tự đệm là bắt buộc khi nhiều tệp được mã hóa Base64 đã được nối với nhau.

Giải mã Base64 với ký tự đệm

Khi giải mã văn bản Base64, bốn ký tự thường được chuyển đổi trở lại thành ba byte. Các ngoại lệ duy nhất là khi các ký tự đệm tồn tại. Một = chỉ ra rằng bốn ký tự sẽ chỉ giải mã thành hai byte, trong khi == chỉ ra rằng bốn ký tự sẽ chỉ giải mã thành một byte duy nhất. Ví dụ:

Văn bản Độ dài Base64 Độ dài Đệm  
light work. 11 bGlnaHQgd29yay4= 16 1
light work 10 bGlnaHQgd29yaw== 16 2
light wor 9 bGlnaHQgd29y 12 0
light wo 8 bGlnaHQgd28= 12 1
light w 7 bGlnaHQgdw== 12 2

Giải mã Base64 không có ký tự đệm

Nếu không có phần đệm, sau khi giải mã bình thường từ bốn ký tự đến ba byte lặp đi lặp lại, có thể còn lại ít hơn bốn ký tự được mã hóa. Trong tình huống này, chỉ có thể còn lại hai hoặc ba ký tự. Một ký tự được mã hóa còn lại là không thể thực hiện được vì một ký tự Base64 chỉ chứa 6 bit và 8 bit được yêu cầu để tạo một byte, vì vậy cần có tối thiểu hai ký tự Base64: Ký tự đầu tiên đóng góp 6 bit và ký tự thứ hai đóng góp 2 bit đầu tiên của nó. Ví dụ:

Được mã hóa Đệm Độ dài Được giải mã
bGlnaHQgdw== == 1 light w
bGlnaHQgd28= = 2 light wo
bGlnaHQgd29y None 3 light wor

Ứng dụng phổ biến

  • Truyền nhận các nội dung binary qua định dạng text như json
  • Hiển thị ảnh nhúng nội dung data:url
  • Thể hiện chữ ký điện tử

Base64 có thể được sử dụng trong nhiều ngữ cảnh khác nhau:

  • Base64 có thể được sử dụng để truyền và lưu trữ văn bản có thể gây ra xung đột dấu phân cách.
  • Những kẻ gửi thư rác sử dụng Base64 để trốn tránh các công cụ chống gửi thư rác cơ bản, những công cụ này thường không giải mã được Base64 và do đó không thể phát hiện ra các từ khóa trong các thư được mã hóa.
  • Base64 được sử dụng để mã hóa chuỗi ký tự trong tệp LDIF.
  • Base64 thường được sử dụng để “nhúng” dữ liệu nhị phân vào tệp XML, sử dụng cú pháp tương tự như ví dụ. biểu tượng yêu thích trong Firefox xuất ra bookmarks.html.
  • Base64 được sử dụng để mã hóa các tệp nhị phân chẳng hạn như hình ảnh trong các tập lệnh, để tránh phụ thuộc vào các tệp bên ngoài.
  • Lược đồ URI dữ liệu có thể sử dụng Base64 để biểu diễn nội dung tệp. Ví dụ: hình nền và phông chữ có thể được chỉ định trong tệp biểu định kiểu CSS dưới dạng URIs data:, thay vì được cung cấp trong các tệp riêng biệt.
  • Việc triển khai FreeSWAN IPSec đứng trước chuỗi Base64 bằng 0s, vì vậy chúng có thể được phân biệt với chuỗi văn bản hoặc chuỗi thập lục phân.[cần dẫn nguồn]
  • Mặc dù không phải là một phần của thông số kỹ thuật chính thức cho SVG, một số người xem có thể hiểu Base64 khi được sử dụng cho các phần tử “nhúng”, chẳng hạn như hình ảnh bên trong SVG.[13]

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

  • Tại sao lại có 1 hoặc 2 ký tự = ở cuối chuỗi Base64
    • Khi giải mã văn bản Base64, bốn ký tự thường được chuyển đổi trở lại thành ba byte. Các ngoại lệ duy nhất là khi các ký tự đệm tồn tại. Một = chỉ ra rằng bốn ký tự sẽ chỉ giải mã thành hai byte, trong khi == chỉ ra rằng bốn ký tự sẽ chỉ giải mã thành một byte duy nhất.
  • Dung lượng để mã hóa mảng byte sang chuỗi Base64 là bao nhiêu
    • = 4/3 độ dài mảng byte