繁體中文(台灣)
  • base64
  • encoding

你需要知道的 Base64 百科全書

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

Yijun
Yijun
Developer

不要在使用者認證上浪費數週時間
使用 Logto 更快地發布安全應用程式。幾分鐘內整合使用者認證,專注於您的核心產品。
立即開始
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 碼:
  • L: 76 (01001100)
  • o: 111 (01101111)
  • g: 103 (01100111)
  • t: 116 (01110100)
  • o: 111 (01101111)
  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 個字節的二進位碼,前 3 個字节被編碼為 TG9n,最後 2 個字节被編碼為 dG8。因此,我們需要在結尾加上一個 = 作為填充字符。

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

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

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

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

使用 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。祝你在程式設計旅程中一切順利!