Base64 là một lược đồ mã hóa dữ liệu được sử dụng trong việc truyền dữ liệu an toàn như HTTP và các phần mở rộng của nó. Mã hóa Base64 có thể chuyển đổi một nhóm byte tùy ý thành một chuỗi các ký tự ASCII có thể đọc được. Các ký tự đã chuyển đổi này có thể được đặt an toàn trong tiêu đề HTTP mà không gây ra bất kỳ vấn đề nào trong khi các máy ngang hàng xử lý tiêu đề HTTP.
Mã hóa Base64 được phát minh như một phần của mã hóa truyền nội dung MIME. Nó tương tự như các lược đồ mã hóa khác như Uuencode và BinHex nhưng có hiệu quả cao hơn.
8 bit thành 6 bit
Base64 sẽ chia các byte thành các nhóm 6 bit. Mỗi 6 bit sẽ ánh xạ tới một ký tự. Ký tự này sẽ là một trong 64 ký tự trong bảng ký tự Base64. 64 ký tự này là phổ biến và có thể được đặt an toàn trong tiêu đề HTTP. Các ký tự này bao gồm a-z, A-Z, 0-9, +, / và một ký tự có mục đích đặc biệt = (Ký tự thứ 65).
Vì Base64 sẽ sử dụng một ký tự để biểu diễn 6 bit dữ liệu, nên kích thước của dữ liệu được mã hóa Base64 sẽ lớn hơn 33% so với dữ liệu gốc.
Dưới đây là một ví dụ đơn giản về cách Base64 hoạt động. Giả sử có ba ký tự "Ow!" sẽ được mã hóa Base64.
- Các ký tự "Ow!" sẽ được chuyển đổi thành ba byte 8 bit (0x4F, 0x77, 0x21)
- 3 byte này sẽ được chuyển đổi thành 24 bit (01001111 01110111 00100001)
- 24 bit này sẽ được chia thành các nhóm 6 bit (010011ã€110111ã€011100ã€1000001).
- Mỗi 6 bit sẽ là một giá trị từ 0 đến 63, nó sẽ ánh xạ tới một trong 64 ký tự ở trên. Kết quả cuối cùng sau khi mã hóa là "T3ch".
Phần đệm Base64
Base64 sẽ lấy chuỗi byte và chia chúng thành các nhóm 6 bit. Đôi khi không thể chia chuỗi thành số lượng nhóm 6 bit chính xác. Trong trường hợp này, 0 sẽ được thêm vào chuỗi để nó sẽ là số lượng nhóm 24 bit chính xác (bội số chung nhỏ nhất của 6 và 8). Quá trình này được gọi là phần đệm.
Khi mã hóa dữ liệu được thêm vào, nếu có nhóm 6 bit được thêm đầy đủ (mỗi bit trong nhóm được thêm vào mà không chứa bất kỳ bit nào từ dữ liệu gốc), nó sẽ được ánh xạ thành "=".
Dưới đây là một vài ví dụ về cách phần đệm hoạt động:
-
a:a -- 011000 010011 101001 100001 -- YTph
-
a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==
-
a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=
-
a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh
Lý do tại sao cần thêm vào 24 bit mà không phải 6 bit là vì nó đảm bảo dữ liệu được giải mã giống với dữ liệu gốc nếu hai chuỗi được mã hóa Based64 được nối và sau đó được giải mã.
Ví dụ: nếu chúng ta mã hóa hai chuỗi "a.aa" và "a.aa", nếu chúng ta chỉ thêm vào 6 bit, thì chuỗi được mã hóa cho "a.aa" sẽ là 011000 010011 101001 100001 011000 010000. Bây giờ nếu hai chuỗi được mã hóa này được nối, nó sẽ trở thành 010011 101001 100001 011000 010000 010011 101001 100001 011000 010000. Nếu chuỗi này được giải mã, kết quả sẽ là "01001110 10011000 01011000 01000001 00111010 01100001 01100001 0000 và nó không thể được giải mã chính xác.
Tham khảo : https://segmentfault.com/a/1190000004533485?_ea=647157
Simple and neat! thanks