Base64 là lược đồ mã hóa nhị phân thành văn bản. Nó biểu thị dữ liệu nhị phân ở định dạng chuỗi ASCII có thể in được bằng cách dịch nó thành biểu diễn cơ số 64
Mã hóa Base64 thường được sử dụng khi có nhu cầu truyền dữ liệu nhị phân qua phương tiện không xử lý chính xác dữ liệu nhị phân và được thiết kế để xử lý dữ liệu văn bản chỉ thuộc bộ ký tự US-ASCII 7 bit
Một ví dụ về hệ thống như vậy là Email [SMTP], được thiết kế theo truyền thống để hoạt động với dữ liệu văn bản thuần túy trong bộ ký tự US-ASCII 7 bit. Mặc dù, sau đó nó đã được mở rộng để hỗ trợ các tin nhắn văn bản không phải US-ASCII cũng như các tin nhắn không phải văn bản như âm thanh và hình ảnh, vẫn nên mã hóa dữ liệu thành bộ ký tự ASCII để tương thích ngược
Mã hóa Base64 mã hóa mọi dữ liệu nhị phân hoặc dữ liệu văn bản không phải ASCII thành định dạng ASCII có thể in được để có thể truyền an toàn qua bất kỳ kênh liên lạc nào. Ví dụ: khi bạn gửi email có chứa hình ảnh cho bạn bè, phần mềm email Base64 của bạn sẽ mã hóa hình ảnh và chèn văn bản tương đương vào thư như vậy -
Content-Disposition: inline;
filename=favicon-16x16.png
Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAARdQTFRFAAAAAAAAAAAAAAAAAQEBDAwMHBwcHx8fCwsLAwMDGRkZHh4eBAQEICAgtra2vb29pKSksLCwODg4FBQUh4eHtLS0m5ubISEh3NzciIiIERERwsLCnp6eAgICjIyMwMDAJycnDg4OBQUFEBAQ0NDQe3t7ycnJeXl5KCgo3d3daWlpCQkJDw8PzMzMmpqarKysyMjIOjo6kZGR9/f3sbGxnZ2dPDw8z8/Pfn5+FxcXjo6OsrKybm5u5ubmExMTBgYG1NTUiYmJCgoKTk5O39/fbGxs7OzsVFRUGhoa2tra9PT00dHRMTExzs7OhoaGhYWFLCwsIyMjuLi4xcXFUlJSRUVFvr6+2dnZoaGhFhYWBwcHFRUV////p5PkYgAAAAN0Uk5Tnvn4e+Nx/gAAAAFiS0dEXOrYAJcAAAAJcEhZcwAAAEgAAABIAEbJaz4AAACnSURBVBjTY2BgZEYCjAwMTMwogImBGQ0ABVhY2dg5gExOLm4esAAvH7+AoBCzsIiomDhYgEtCUkpaRlZOXkFRCSygrKIqrqauoamlqA0xQ0dXT9/A0MjYxNQMIqBsbmFpZW1ja2hnDxGwc3B0cnZxdXNnZmEBC3h4esmJefv4uvj5B4AFAoP0zINDmEPDwiMiwQJR0UrROkDFHNFREDPQnI7hOXTvAwCtbBUc7QjTawAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0wMS0yMFQwNjo1NTozNiswMDowMA0Ih5IAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDEtMjBUMDY6NTU6MzYrMDA6MDB8VT8uAAAARnRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA2LjcuOC05IDIwMTQtMDUtMTIgUTE2IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3IbtAAAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpoZWlnaHQAMTkyDwByhQAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAxOTLTrCEIAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE1NDc5NjczMzaP/6esAAAAD3RFWHRUaHVtYjo6U2l6ZQAwQkKUoj7sAAAAVnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vbW50bG9nL2Zhdmljb25zLzIwMTktMDEtMjAvMTVjOGNmYTk5NjBmYmJjOWUyY2NjNGI4MTY2YTI3NTQuaWNvLnBuZ0jyrXwAAAAASUVORK5CYII=
Phần mềm email của người bạn sẽ giải mã Base64 dữ liệu văn bản được mã hóa ở trên để khôi phục hình ảnh nhị phân ban đầu
Mã hóa Base64 hoạt động như thế nào?
Mã hóa Base64 được mô tả trong RFC 4648
Mã hóa Base64 hoạt động với tập hợp con 65 ký tự của bộ ký tự US-ASCII. 64 ký tự đầu tiên trong tập hợp con 65 ký tự được ánh xạ tới một chuỗi nhị phân 6 bit tương đương [_______10_______]. Ký tự thứ 65 thừa [=
] được sử dụng để đệm
Mỗi chuỗi nhị phân 6 bit từ 0 đến 63 được gán một bảng chữ cái Base64. Ánh xạ này giữa chuỗi nhị phân 6 bit và bảng chữ cái Base64 tương ứng được sử dụng trong quá trình mã hóa. Sau đây là bảng ánh xạ còn được gọi là bảng chỉ mục Base64 hoặc bảng chữ cái -
# The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w [pad] =
15 P 32 g 49 x
16 Q 33 h 50 y
Thuật toán mã hóa Base64 nhận luồng đầu vào gồm các byte 8 bit. Nó xử lý đầu vào từ trái sang phải và sắp xếp đầu vào thành các nhóm 24 bit bằng cách ghép ba byte 8 bit. Các nhóm 24 bit này sau đó được coi là 4 nhóm 6 bit được nối. Cuối cùng, mỗi nhóm 6 bit được chuyển đổi thành một ký tự trong bảng chữ cái Base64 bằng cách tham khảo bảng chữ cái Base64 ở trên
Khi đầu vào có ít hơn 24 bit ở cuối, các bit 0 được thêm vào [ở bên phải] để tạo thành một số nguyên của các nhóm 6 bit. Sau đó, một hoặc hai ký tự đệm [_______11_______] được xuất tùy thuộc vào các trường hợp sau -
Đoạn cuối cùng của đầu vào chứa chính xác 8 bit. Bốn bit 0 được thêm vào để tạo thành hai nhóm 6 bit. Mỗi nhóm 6 bit được chuyển đổi thành ký tự được mã hóa Base64 kết quả bằng cách sử dụng bảng chỉ mục Base64. Sau đó, hai ký tự đệm [
=
] được thêm vào đầu raĐoạn cuối cùng của đầu vào chứa chính xác 16 bit. Hai bit 0 được thêm vào để tạo thành ba nhóm 6 bit. Mỗi nhóm trong số ba nhóm 6 bit được chuyển đổi thành bảng chữ cái Base64 tương ứng. Cuối cùng, một ký tự đệm đơn [
=
] được thêm vào đầu ra
Hãy xem một ví dụ để hiểu quy trình mã hóa Base64
Đầu vào. ab@yz
Biểu diễn nhị phân [chuỗi 8 bit]
01100001 01100010 01000000 01111001 01111010
Bước 1. Sắp xếp đầu vào thành các nhóm 24 bit [có bốn nhóm 6 bit mỗi nhóm]. Bộ đệm có bit 0 ở cuối để tạo thành một nhóm 6 bit không thể tách rời
011000 010110 001001 000000 011110 010111 101000 # [padded with two zeros at the end]
Bước 2. Chuyển đổi các chuỗi 6 bit thành bảng chữ cái Base64 bằng cách lập chỉ mục vào bảng chỉ mục Base64. Thêm ký tự đệm nếu các bit 0 được thêm vào cuối đầu vào
Các nhóm 6 bit trên tương đương với các chỉ mục sau
24 22 9 0 30 23 40
Lập chỉ mục vào bảng chữ cái Base64 cho đầu ra sau
YWJAeXo= # [padded with `=` to account for extra bits added]
Mã hóa Base64 với bảng chữ cái an toàn cho URL và Tên tệp
RFC 4648 mô tả biến thể mã hóa Base64 là URL và Tên tệp An toàn. Điều đó có nghĩa là, đầu ra do biến thể mã hóa Base64 này tạo ra có thể được truyền an toàn trong URL và được sử dụng trong tên tệp
Biến thể này có một thay đổi đơn giản đối với bảng chữ cái Base64. Vì các ký tự
# The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w [pad] =
15 P 32 g 49 x
16 Q 33 h 50 y
2 và # The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w [pad] =
15 P 32 g 49 x
16 Q 33 h 50 y
3 có ý nghĩa đặc biệt trong URL và tên tệp nên chúng được thay thế bằng dấu gạch ngang [# The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w [pad] =
15 P 32 g 49 x
16 Q 33 h 50 y
4] và dấu gạch dưới [# The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w [pad] =
15 P 32 g 49 x
16 Q 33 h 50 y
5]