Base64は、任意のバイナリデータを、文字・数字・+・/・=のみで構成されたテキストとして表現する方法です。データを圧縮したり暗号化したりするものではなく、結果は元のデータより約3分の1大きくなり、アルゴリズムを知っている人なら誰でも元の内容を読み取れます。
エンコードの仕組み
入力バイトは3つずつ(24ビット)にグループ化され、6ビットずつ4つのブロックに分割されます。各ブロックはBase64のアルファベット(A–Z、a–z、0–9、+、/)の1文字に対応します。入力データの長さが3バイトの倍数でない場合、末尾にパディング文字=が追加されます。
なぜ必要なのか
メール(MIME)、URL、JSON、XMLなど多くのプロトコルや形式はテキスト用に設計されており、「生の」バイト——ヌルバイト、制御文字、形式自体の構文と衝突する並び——を確実に扱えません。Base64はどんなバイナリデータでも安全なテキストに変換することで、この制約を回避します。
よくある用途
- MIME経由のメール添付ファイル。
- JSON APIで画像や小さなファイルを送信する。
- データベースや設定ファイルのテキストフィールドにバイナリデータを保存する。
- JWTのheaderとpayloadをエンコードする。
Base64ではないもの
これは暗号化でもハッシュ化でもありません。誰でも鍵やパスワードなしにBase64文字列を元のデータにデコードできます——単なる表現形式であり、セキュリティ対策ではありません。
標準アルファベットとURL-safeアルファベット
従来のBase64アルファベットでは+と/が使われますが、これらはURLやファイル名において特別な意味を持つ文字です。そのため、+を-に、/を_に置き換えたBase64URLという変種が存在します。標準エンコードの結果を追加のpercent-encodingなしでそのままURLに埋め込むと、+や/がアドレスを壊したり、パスの区切り文字と衝突したりする可能性があります。
よくある間違い: 切り詰められた、または壊れたパディング
文字列末尾の=はゴミではなく、最後のブロックで不足しているバイト数を示すエンコードの一部です。Base64文字列を途中までしかコピーしなかったり、パディングを手動で削除したりすると、デコーダはエラーを返すか、途切れた結果を返します。JWTなど一部のシステムは意図的に=を省略しており、その場合はデコード前に元の長さを復元する必要があります。