Base64 — 普遍的なデフォルト
Base64 はアルファベット 64 文字(A〜Z、a〜z、0〜9、+、/)にパディング用「=」を加えます。入力 1 バイトが約 4/3 文字に膨らみ、約 33% のオーバーヘッドです。データ URL、JWT、メール添付、PEM 形式の鍵など、バイナリをテキスト化するほとんどの用途で標準です。URL セーフ版(RFC 4648)は「+」「/」を「-」「_」に置き換え、URL 内で安全に使えます。
Base58 — Bitcoin の選択
Base58 はアルファベット 58 文字(英数字から見間違いやすい 0、O、I、l を除外)を使います。出力は Base64 より少し長く(オーバーヘッド約 37%)なりますが、紛らわしい文字や特殊記号が一切含まれません。人間が目視や口頭で扱う鍵・アドレスに最適です。Bitcoin、IPFS、多くの暗号通貨システムが Base58 を採用しています。
Base32 — 大文字小文字を区別せず手入力可能
Base32 はアルファベット 32 文字(RFC 4648: A〜Z、2〜7)を使います。Base64 よりも密度が低く(オーバーヘッド約 60%)出力は長くなりますが、大文字小文字を区別せず、特殊記号がなく、手入力や口頭での伝達が容易です。TOTP シークレット、DNS レコード(大文字小文字を区別できない TXT)、Tor の Onion アドレスなどに使われています。Crockford 版(ULID で使用)は I/L/O/U を除外して視認性をさらに高めています。
サイズオーバーヘッドの比較
- Base64: 約 33% のオーバーヘッド(3 バイト → 4 文字)。
- Base58: 約 37% のオーバーヘッド、58 が 2 のべき乗でないため可変。
- Base32: 約 60% のオーバーヘッド(5 バイト → 8 文字)。
- 入力 32 バイトの場合: Base64 約 44 文字、Base58 約 44 文字、Base32 約 56 文字。
用途マトリクス
- JSON・HTTP ヘッダ・メールへのインライン埋め込み: Base64。
- URL パラメータ: Base64 URL セーフ(または Base58)。
- 人間が扱う識別子(Bitcoin ウォレット、公開鍵): Base58。
- 口頭・手入力で伝えるコード: Base32 Crockford。
- TOTP / MFA の共有シークレット: Base32(RFC 4648)。
- DNS TXT レコードに格納するバイナリ: Base32。
エンコード速度とライブラリ対応
Base64 は全標準ライブラリに組み込まれており、SIMD で最適化されているため一桁速いです。Base32 もほとんどの言語で標準対応。Base58 は標準ライブラリにあることは稀で、サードパーティパッケージに頼るのが普通です。任意精度算術が必要なため Base58 は最も遅くなります。
パディング
Base64 は 4 の倍数に「=」でパディングします。Base32 は 8 の倍数に「=」でパディングします。Base58 は出力長が可変のためパディング自体ありません。URL セーフ Base64 や近年のフォーマットではパディング省略が一般化しています。デコーダ側で両形式を受け入れられるか確認してください。