使用方法
- 選擇「編碼」把文字轉換為 Base32,或選擇「解碼」把 Base32 還原為文字。
- 選擇變體。預設的 RFC 4648 是 TOTP 金鑰和大多數程式庫使用的標準。
- 輸入或貼上內容,也可以開啟檔案,結果會隨輸入即時更新。
- 複製結果,或將結果下載為檔案。
什麼是 Base32?
Base32 使用 32 個可列印字元來表示二進位資料。每個字元承載 5 位,因此每 5 個位元組會變成 8 個字元。編碼後體積約增加 60%,比 Base64 更大,但字母表只有一種大小寫,並且去掉了容易混淆的字元。
RFC 4648 定義的標準字母表由 A-Z 和數字 2-7 組成,沒有使用 0、1、8、9,以免與字母 O、I、B 混淆。當輸入長度不是 5 位元組的整數倍時,輸出會用 = 填充到 8 個字元的整數倍。
Base32 的常見用途
- 兩步驗證。身份驗證器應用中的 TOTP、HOTP 金鑰(
otpauth://連結裡的secret=參數)就是 Base32 字串。 - 不區分大小寫的系統。由於只有一種大小寫,Base32 可以安全地用於忽略大小寫的檔案系統、DNS 標籤和郵箱地址。
- 需要人工輸入的編碼。許可證金鑰、洋蔥地址和短識別符號常用 Base32,便於朗讀和手動輸入。
如果更在意體積,Base64 更緊湊;如果需要不易混淆的短 ID,可以比較 Crockford Base32 和 Base58。
Base32 的幾種變體
| 變體 | 字母表 | 典型用途 |
|---|---|---|
| RFC 4648 | A-Z 2-7 | TOTP 金鑰、通用場景 |
| Base32hex | 0-9 A-V | 排序與原始位元組一致,DNSSEC NSEC3 |
| Crockford | 0-9 A-Z,去掉 I、L、O、U | 易讀 ID、ULID |
| z-base-32 | 小寫、重新排列 | 面向人工閱讀的金鑰、OpenPGP WKD、ZRTP |
在程式碼中使用 Base32
# Python
import base64
base64.b32encode(b'hello') # 編碼
base64.b32decode('NBSWY3DP') # 解碼
// Node.js 沒有內建 Base32,可使用 "hi-base32" 等第三方包
// Go (import "encoding/base32")
base32.StdEncoding.EncodeToString(data)
編碼規格
| 字母表 | A-Z 2-7 |
|---|---|
| 輸出體積 | 每 5 位元組輸出 8 個字元(160%) |
| 填充 | 用 = 補足到 8 的倍數 |
| 標準 | RFC 4648 第 6 節 |
| 區分大小寫 | 否 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | JBSWY3DPFQQFO33SNRSCC=== |
Base64.is | IJQXGZJWGQXGS4Y= |
你好 | 4S62BZNFXU====== |
常見問題
Base32 區分大小寫嗎?
RFC 4648 字母表以大寫定義,但本工具解碼時同樣接受小寫輸入。如果需要小寫輸出,可以勾選「小寫」選項。
為什麼 Base32 結果末尾有等號?
等號是填充字元,用於把最後一組補足 8 個字元。包括大多數 TOTP 應用在內的很多系統都接受不帶填充的 Base32,關閉「填充」即可去掉等號。
Base32 編碼後體積會增加多少?
每 5 個位元組變成 8 個字元,因此 Base32 輸出約為原資料的 1.6 倍,而 Base64 約為 1.33 倍。
可以用這個工具解碼 TOTP 金鑰嗎?
可以。把金鑰貼上到「解碼」中,並將輸出設為「十六進位」,即可看到原始金鑰位元組。金鑰中的空格會被自動忽略。