
眾所周知:Base64 是一種編碼方式,而不是加密演算法;所謂的 編碼(Encoding) 是一種 將原始數據轉換為特定格式的過程,使其可以安全地傳輸、存儲或處理,通常用於提高可讀性、壓縮數據或確保資料能被正確傳輸。
而在替資料選擇適合的編碼方式時,通常需要根據其用途,考慮不同編碼方式所使用的 字元集、是否存在混淆字元(如 0、O、I、l 等),以及是否存在填充(padding)字元,那麼究竟 在編碼方式如 Base64、Base32 中,所謂的填充(padding)是什麼意思?
何謂填充(Padding)?
簡單來說,在 Base64 等編碼方式中,所謂的 填充(Padding)指的是為了讓輸入符合特定長度要求,在編碼後面補上額外的字符,以 Base64 來說會使用 =
字元作為填充字元,以確保編碼後的字串長度為 \( 4 \) 的倍數長度。
這也是為什麼許多人在看到一個字串時,可以很快地猜測字串是使用 Base32、Base64 進行編碼的。這兩種編碼方式都使用
=
作為填充字元,主要差異在於 Base64 比起 Base32 來說還可以使用 +
、/
、0
和 1
等字元,而 Base32 僅能使用 A-Z
和 2-7
。
那麼為什麼在編碼時需要進行填充(Padding)或者存在填充字元呢?這是因為編碼通常會把二進制數據轉換成可讀的格式,並且這些演算法通常 要求輸入長度是固定的倍數(例如 3 個字元一組或 4 個字元一組),如果原始數據的長度不是這個倍數,則需要填充來讓它符合規則。
舉例:使用 Base64 對 Hsins
字串進行編碼
在 Base64 編碼的核心邏輯中,是將 二進制資料轉換為可讀的字元,其規則是:
- 將每 3 個位元組(bytes)即 \(24 \, \text{bit} \) 拆解成 4 個 \(6 \, \text{bit} \) 的區塊。
- 再將每個區塊,對應到 Base64 的字元表。

舉例來說,當要使用 Base64 對 Hsins
進行編碼時,先將字元對應到其 ASCII Code 並轉換成二進制表示:
CHAR H s i n s
ASCII Code 72 115 105 110 115
01001000 01110011 01101001 01101110 01110011
將二進制表示的結果,以每 \(6 \, \text{bit} \) 為一組,對應到 Base64 字元表:
010010 | 000111 | 001101 | 101001 | 011011 | 100111 | 0011
S H N p b n
因為最後一組不足 \(6 \, \text{bit} \),因此填充 =
來補足,以確保字串長度符合 4 的倍數,編碼後得到 SHNpbnM=
。
換句話說,對於 Base64 編碼而言,由於
=
僅作為填充字元以確保字串長度滿足 4 的倍數,因此如果將 SHNpbnM
及 SHNpbnM=
抑或是 SHNpbnM==
解碼得到的結果都會是 Hsins
。
張貼留言