すべての記事

Base64とは何か、なぜ必要で、どう動くのか

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など一部のシステムは意図的に=を省略しており、その場合はデコード前に元の長さを復元する必要があります。

ツールを試す