繁體中文(香港)
  • base64
  • encoding

關於 Base64 的一切

深入了解 Base64 編碼的世界。學習其歷史、運作原理、使用時機及其限制。這是每位處理數據編碼和傳輸的開發者必備的知識。

Yijun
Yijun
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

在軟件開發的世界中,Base64 是一個經常被提及但不總是被完全理解的概念。無論你是這個領域的新手還是經驗豐富的開發者,深入理解 Base64 可以幫助你輕鬆處理數據編碼和傳輸。讓我們來探索 Base64 的各個方面,從其定義和起源到實際應用和使用考量。

Base64 是什麼?

Base64 是一種使用 64 個可打印字符來表示二進制數據的編碼方法。這 64 個字符包括:

  • A-Za-z0-9(62 個字母和數字)
  • +/(2 個特殊字符)
  • =(用於填充)

在我們的日常開發工作中,Base64 無處不在。你可能在以下場景中遇到過它:

  • 在 HTML 中嵌入小圖片或圖標
  • 在 API 響應中傳輸二進制數據
  • 編碼電子郵件附件

例如,你可能見過像這樣的 HTML 代碼:

這裡的長字符串是一個以 Base64 編碼的小圖片。

為什麼使用 Base64?

要理解 Base64 的存在原因,我們需要回到計算機發展的早期歷史。

在計算機網絡的早期,大多數系統只能處理可打印的 ASCII 字符。ASCII 編碼僅使用 7 位的二進制數據,表示 128 個字符。這對處理英語文本來說是沒問題的,但在傳輸二進制數據(如圖片或音頻文件)時會出現問題。

不同的系統可能會對某些控制字符的解釋不同,可能在傳輸過程中損壞數據。例如,一些系統可能會將換行符從 LF(換行)更改為 CR(回車)+ LF,這對二進制數據來說是災難性的。

為了解決這個問題,人們開始尋找一種方法將任意二進制數據轉換為可以安全傳輸的字符。這就是 Base64 編碼的由來。

事實上,Base64 之前還有 Base16(使用 16 個字符)和 Base32(使用 32 個字符)的編碼方法。然而 Base64 在編碼效率和實用性之間取得了最好的平衡,使其成為最廣泛使用的編碼方法。

Base64 編碼如何運作

Base64 的核心思想是將 3 字節(24 位)的二進制數據編碼為 4 個可打印字符。

讓我們通過一個具體的例子來理解這個過程。

假設我們想編碼字符串 "Logto":

  1. 首先,我們將 "Logto" 轉換為 ASCII 代碼:
  • L7601001100
  • o11101101111
  • g10301100111
  • t11601110100
  • o11101101111
  1. 我們將這些二進制數字連接起來(總共 5 個字節,40 位): 0100110001101111011001110111010001101111

  2. 我們將這些位分成 6 位的組(注意最後一組只有 4 位): 010011 | 000110 | 111101 | 100111 | 011101 | 000110 | 1111

  3. 由於最後一組只有 4 位,我們需要在最後加上兩個 0 使其成為 6 位: 010011 | 000110 | 111101 | 100111 | 011101 | 000110 | 111100

  4. 我們將每個 6 位的組轉換為十進制: 19 | 6 | 61 | 39 | 29 | 6 | 60

  5. 根據 Base64 編碼表,我們將這些數字轉換為其對應的字符: T | G | 9 | n | d | G | 8

  6. 最後,因為 Base64 編碼總是將 3 字節(24 位)的二進制數據編碼為 4 個可打印字符,而 "Logto" 轉換成二進制為 5 個字節,所以前三個字節被編碼為 TG9n,最後兩個字節被編碼為 dG8。因此,我們需要在末尾添加一個 = 作為填充字符。

因此,"Logto" 的 Base64 編碼結果是 TG9ndG8=

在 Node.js 中,我們可以這樣生成 Base64 編碼:

這個例子展示了 Base64 編碼的幾個重要特徵:

  • 每 3 字節的輸入會產生 4 個字符的輸出。
  • 當輸入字節數不是 3 的倍數時,需要使用填充字符 "="。在這個例子中,我們有 5 個輸入字節,產生 7 個 Base64 字符和 1 個填充字符。
  • 填充字符的數量可以告訴我們原始數據的精確字節數:
    • 沒有填充:原始數據是 3 的倍數
    • 1 個 =:在編碼之前向原始數據添加了 2 個 0 位
    • 2 個 =:在編碼之前向原始數據添加了 4 個 0 位

什麼時候及為何使用 Base64

Base64 在以下場景中特別有用:

  1. 在 HTML 中嵌入小的二進制數據(如小圖片或圖標)
  2. 在只能傳輸文本的協議中傳輸二進制數據
  3. 在對特殊字符有限制的系統中傳輸數據
  4. 簡單的數據混淆(注意:這不是加密!)

使用 Base64 的主要優點是:

  • 良好的跨平台兼容性:Base64 編碼的數據可以在任何支持 ASCII 的系統中正確解析
  • 在某些情況下可以提高傳輸效率:例如,當傳輸的數據包含大量重複的二進制模式時

除了標準 Base64,還有一些值得了解的變體:

  • URL 安全的 Base64:用 - 替代 +,用 _ 替代 /,並移除 =。此編碼可以在 URL 中直接使用而不需要額外的編碼。

Base64 的限制及考量

儘管 Base64 有用,但它也有一些限制:

  1. 數據膨脹:Base64 編碼增加了大約 33% 的數據量。對於大量數據,這可能導致顯著的存儲和帶寬成本增加。

  2. 性能影響:編碼和解碼過程需要 CPU 時間。對於大量數據或高頻操作,這可能成為性能瓶頸。

  3. 安全誤解:許多人誤以為 Base64 是一種加密方式。事實上,Base64 只是編碼,且可以輕易被解碼。不要用它來保護敏感信息!

  4. 可讀性:Base64 編碼的數據不可人讀。這可能使得調試變得困難。

在大型應用中使用 Base64 時,考慮以下優化策略:

  • 只對必要的數據進行 Base64 編碼
  • 考慮使用專用的 Base64 編碼/解碼庫,通常比通用庫更高效
  • 在客戶端進行 Base64 編碼/解碼以減少伺服器負載

結論

Base64 是一個簡單而強大的工具,當在合適的場景中使用時,可以解決許多問題。了解其工作原理、應用場景及限制可以幫助你在軟件開發中做出更聰明的決定。我希望這篇文章能夠幫助你全面理解 Base64,使你能夠輕鬆處理相關問題。

記住,像所有技術工具一樣,關鍵是在合適的時間和地點使用 Base64。祝你在編程旅程中一切順利!