你的資料 100% 私密 —— Base64 的編碼與解碼全部在你的裝置上完成。
Base64 是一種用 64 個 ASCII 字元(A–Z、a–z、0–9,再加上 + 和 /)把二進位資料表示成純文字的方法。它讓圖片、金鑰、電郵附件這類二進位資料,能安全地通過為文字而設計的系統。它是編碼,不是加密。
Base64 使用一組固定的 64 個字元的字母表。0 到 63 之間的每個值都恰好對應其中一個字元,任何 3 個位元組的二進位資料也因此變成 4 個可讀的字元:
| 數值 | 字元 | |
|---|---|---|
| 0–25 | A–Z | 26 個大寫字母 |
| 26–51 | a–z | 26 個小寫字母 |
| 52–61 | 0–9 | 10 個數字 |
| 62–63 | + / | 2 個符號 |
只有 "=" 符號是例外。它是填充,並非那 64 個數值之一,只用來補齊最後一個區塊。
你幾乎一定已經見過它了。只要二進位資料需要藏在文字裡傳遞,Base64 就會出現:
那個 data URI 技巧長這樣,這串長字串就是整張圖片:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />早期的網路協定是為文字、而非原始位元組設計的。ASCII 使用 7 個位元、128 個字元,用於英文綽綽有餘,但對二進位卻不行。有些系統會破壞控制字元,或改寫換行(把 LF 改成 CR + LF),在傳輸途中悄悄損壞圖片與音訊。
Base64 只輸出每個系統早已共同認可的字元,藉此避開了上述所有問題。Base16 與 Base32 用更小的字母表做同樣的事,但 Base64 在保持安全的同時,每個字元能塞進更多資料。這正是它勝出的原因。
整套方法就是一個想法的重複:取 3 個位元組(24 個位元),把它們重新切成 4 組各 6 個位元,再用字母表查 出每一組對應的字元。我們用 "Logto" 這個字手動編碼一次。
步驟 1. 把每個字元變成 8 位元的二進位:
| 字元 | ASCII 碼 | 二進位 |
|---|---|---|
| L | 76 | 01001100 |
| o | 111 | 01101111 |
| g | 103 | 01100111 |
| t | 116 | 01110100 |
| o | 111 | 01101111 |
步驟 2. 取前 3 個位元組 "Log",把這同樣的 24 個位元重新切成 4 組各 6 個位元:
步驟 3. 把每組 6 個位元當成數字來讀,再用這個數字查字母表:
| 6 位元群組 | 數值 | Base64 字元 |
|---|---|---|
| 010011 | 19 | T |
| 000110 | 6 | G |
| 111101 | 61 | 9 |
| 100111 | 39 | n |
"Logto" 有 5 個位元組,不是 3 的倍數。最後兩個位元組 "to" 會切成 6 + 6 + 4。把最後 4 個位元用 0 補成一組 6 個位元,再加上一個 "=",補齊這個 4 字元的區塊:
把各區塊拼起來:
"Logto" → TG9ndG8=每種語言都內建了它。在 Node.js 中:
const text = 'Logto';
const base64 = Buffer.from(text).toString('base64');
console.log(base64); // TG9ndG8=從這個過程會得出三條值得記住的規則:
當二進位資料必須通過只能處理文字的通道時,就用 Base64:
你得到的回報:
標準的 Base64 依賴三個會跟 URL、查詢字串、檔名運作方式相衝突的字元:+、/,以及 = 填充。把一般的 Base64 字串直接放進連結,它可能會以不易察覺的方式出錯:
你可以對它們做百分比編碼(+ 變成 %2B、/ 變成 %2F、= 變成 %3D),但這會讓字串變長,也很容易不小心重複編碼。
Base64URL(RFC 4648 §5)從根源解決了這個問題:把 + 換成 -、把 / 換成 _,並去掉 = 填充。這樣的結果可以直接放進 URL、查詢參數或檔名,完全不用轉義。你會在 URL、檔名,以及許多 Web API 中看到它。
const base64 = 'TG9ndG8=';
const urlSafe = base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
console.log(urlSafe); // TG9ndG8Base64 只是一種表示方式,不是天上掉下來的好處。請記住三件事:
不是。它是使用公開字母表的可逆編碼,任何人都能立即解碼,完全不增加任何機密性。請改為加密敏感資料。
Base64 把每 3 個位元組變成 4 個字元,所以編碼後的形式總是比原始位元組大約大三分之一。
它們是讓輸出維持在 4 個字元倍數的填充。一個 "=" 代表輸入剩 2 個位元組,兩個 "=" 代表剩 1 個,沒有 "=" 代表長度本來就是 3 個位元組的倍數。
Base64URL 是使用 URL 與檔名安全字母表的同一種編碼:- 和 _ 取代 + 和 /,而 = 填充通常會被去掉。它常見於 URL、檔名,以及許多 Web API。
任何二進位都可以:圖片、PDF、金鑰、執行檔。Base64 處理的是原始位元組,所以原本的內容類型並不重要。
不會。編碼與解碼完全在你的瀏覽器中執行。你貼上的任何內容都不會被上傳或記錄。