Base64 是一種資料編碼方案,用於安全資料傳輸,例如 HTTP 及其擴展。Base64 編碼可以將任意位元組群組轉換為可讀的 ASCII 字元序列。這些轉換後的字元可以安全地放入 HTTP 標頭中,而不會在同級處理 HTTP 標頭時造成任何問題。
Base64 編碼是作為 MIME 內容傳輸編碼的一部分而發明的。它類似於其他編碼方案,例如 Uuencode 和 BinHex,但效率更高。
8 位元到 6 位元
Base64 會將位元組分成 6 位元的群組。每 6 位元將對應一個字元。此字元將是 Base64 字元表中的 64 個字元之一。這 64 個字元是通用的,可以安全地放入 HTTP 標頭中。這些字元包括 a-z、A-Z、0-9、+、/ 和一個特殊用途字元 =(第 65 個字元)。
由於 Base64 將使用一個字元來表示 6 位元的資料,因此 Base64 編碼資料的大小將比原始資料大 33%。
以下是一個 Base64 如何運作的簡單範例。假設有三個字元「Ow!」要進行 Base64 編碼。
- 字元「Ow!」將轉換為三個 8 位元組 (0x4F、0x77、0x21)
- 這 3 個位元組將轉換為 24 位元 (01001111 01110111 00100001)
- 這 24 位元將分成 6 位元的群組 (010011、110111、011100、1000001)。
- 每個 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」,並且無法正確解碼。
Simple and neat! thanks