How does Base64 work

English 简体中文 繁体中文 ภาษาไทย Tiếng Việt
Summary

Base64 is an encoding scheme primarily used for safely transferring arbitrary binary data, such as within HTTP headers, by converting it into a sequence of readable ASCII characters. The process involves breaking 8-bit input into 6-bit chunks, each mapped to one of 64 specific characters from a defined set. This conversion inherently increases the data size by approximately 33%. To handle incomplete blocks, Base64 utilizes padding with the '=' character, specifically ensuring 24-bit (3-byte) alignment, which is critical for maintaining data integrity during decoding, especially when concatenating encoded strings.

Base64 是一種資料編碼方案,用於安全資料傳輸,例如 HTTP 及其擴展。Base64 編碼可以將任意位元組群組轉換為可讀的 ASCII 字元序列。這些轉換後的字元可以安全地放入 HTTP 標頭中,而不會在同級處理 HTTP 標頭時造成任何問題。

Base64 編碼是作為 MIME 內容傳輸編碼的一部分而發明的。它類似於其他編碼方案,例如 UuencodeBinHex,但效率更高。

8 位元到 6 位元

Base64 會將位元組分成 6 位元的群組。每 6 位元將對應一個字元。此字元將是 Base64 字元表中的 64 個字元之一。這 64 個字元是通用的,可以安全地放入 HTTP 標頭中。這些字元包括 a-z、A-Z、0-9、+、/ 和一個特殊用途字元 =(第 65 個字元)

由於 Base64 將使用一個字元來表示 6 位元的資料,因此 Base64 編碼資料的大小將比原始資料大 33%。

以下是一個 Base64 如何運作的簡單範例。假設有三個字元「Ow!」要進行 Base64 編碼。

  1. 字元「Ow!」將轉換為三個 8 位元組 (0x4F、0x77、0x21)
  2. 這 3 個位元組將轉換為 24 位元 (01001111 01110111 00100001)
  3. 這 24 位元將分成 6 位元的群組 (010011、110111、011100、1000001)。
  4. 每個 6 位元將是一個介於 0 和 63 之間的值,它將對應到上述 64 個字元之一。編碼後的最終結果是「T3ch」。

Base64 填充

Base64 將採用位元組序列並將其分成 6 位元的群組。有時不可能將序列分成精確的 6 位元群組數。在這種情況下,將在序列中填充 0,使其成為精確的 24 位元群組數 (6 和 8 的最小公倍數)。此過程稱為填充。

在編碼填充資料時,如果存在完全填充的 6 位元群組 (群組中的每個位元都經過填充,而不包含來自原始資料的任何位元),則會將其對應到「=」。

以下是一些填充如何運作的範例:

  • 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

需要填充到 24 位元而不是 6 位元的原因是,它確保如果將兩個 Based64 編碼的序列串聯然後解碼,則解碼後的資料與原始資料相同。

例如,如果我們編碼兩個字串「a.aa」和「a.aa」,如果我們只填充到 6 位元,則「a.aa」的編碼字串將為 011000 010011 101001 100001 011000 010000。現在,如果將這兩個編碼字串串聯,它將變成 010011 101001 100001 011000 010000 010011 101001 100001 011000 010000。如果解碼此字串,結果將為「01001110 10011000 01011000 01000001 00111010 01100001 01100001 0000」,並且無法正確解碼。

參考資料:https://segmentfault.com/a/1190000004533485?_ea=647157

ALGORITHM BASE64

  RELATED

  COMMENTS

2
Jo
Nov 2, 2017 at 4:32 pm

Simple and neat! thanks

Anonymous
Jan 11, 2018 at 6:37 pm
901234-123457