跳到主要內容

← 返回部落格

Base64 與 URL 編碼差在哪?

Base64 與 URL 編碼都是「讓資料能安全地以文字傳遞」的工具,所以很容易搞混。但它們解決的是不同問題。以下說明差別。

Base64:二進位 → 文字

Base64 把任何二進位資料(圖片、檔案、原始位元組)變成純 ASCII 的字母、數字、+/=。它會讓資料變大約 33%,而且不是加密——誰都能解回來。當只能走純文字的通道卻要帶二進位時使用:

  • 把圖片以 data: URI 嵌進 HTML/CSS
  • 電子郵件附件(MIME)
  • 把小型二進位塞進 JSON 或權杖

延伸見 Base64 是加密嗎?(劇透:不是)。

URL 編碼:讓文字能安全放進網址

URL 編碼(又稱百分比編碼)把在網址裡有特殊意義或不允許的字元換成 %XX——空格變 %20&%26,以此類推。當要把文字放進以下位置時使用:

  • 查詢字串(?q=hello%20world)
  • 路徑片段
  • 表單送出

細節見 URL 編碼指南

一眼看懂差異

  • 目的:Base64 = 用文字帶二進位 · URL 編碼 = 讓文字能安全放進網址
  • 輸出:Base64 = A–Z a–z 0–9 + / = · URL 編碼 = 原文字加上 %XX 轉義。
  • 大小:Base64 ≈ +33% · URL 編碼只讓被轉義的字元變長。

兩者常搭配使用

Base64 字串可能含 +/=,這些在網址裡不安全——所以若要把 Base64 放網址,要嘛再做 URL 編碼,要嘛用 Base64URL(用 -_ 的網址安全變體)。

兩個都試試(本機)

原則:Base64 用來以文字承載二進位;URL 編碼用來把文字安全放進連結。

實際範例

拿文字 a b&c 來看,兩種編碼的處理方式完全不同:

輸入:        a b&c
URL 編碼:    a%20b%26c
Base64 編碼: YSBiJmM=

URL 編碼不動英文字母,只把空格與 & 轉義,所以結果還看得懂。Base64 則把每一個位元組改寫進它自己的字母表(每 3 個位元組換成 4 個字元),輸出跟原文完全不像——但它現在能通過只容許少數安全字元的通道。任務不同,輸出自然不同。

常見誤用

  • 用 Base64 來「藏」資料:它一步就能還原,什麼都保護不了——請把它當信封,不是鎖。見 Base64 是加密嗎?
  • 對整條網址做 URL 編碼:只該編碼各部分(查詢值、路徑片段),不是整個網址,否則 https:// 會變成 https%3A%2F%2F,連結就壞了。
  • 重複編碼:對已編碼的值再編一次會得到 %2520(連 % 本身都被轉義了)。若空格是以 %2520 而非 %20 抵達,就表示被編了兩次。
  • 忘了 Base64 的 +/:純 Base64 在網址裡並不安全;放進網址時請用 Base64URL,或把整串再做一次 URL 編碼。

各自出現在哪裡

  • Base64 出現在任何要用文字承載二進位的地方:data: URI、電子郵件的 MIME 區段、JWT 的各段,以及硬塞進 JSON 的二進位欄位。
  • URL 編碼 出現在任何要把文字放進網址的地方:查詢字串、表單送出(application/x-www-form-urlencoded),以及含空格或非 ASCII 字元的路徑片段。

常見問題

可以用 Base64 取代 URL 編碼嗎?

不行——兩者不能互換。Base64 讓二進位變成文字安全;URL 編碼讓文字變成網址安全。把純 Base64 直接放進網址,仍可能因為 +/= 而出錯。

為什麼我的 Base64 結尾是 =?

那是填補字元,用來把輸出長度補到 4 的倍數。這很正常,某些網址安全變體會省略它。

這兩種能讓資料變安全嗎?

不能。編碼講的是格式,不是保密——任何人都能還原。要保密得用加密;要防竄改得用雜湊或簽章。