Base64
バイナリデータを ASCII 文字列に変換するエンコーディング方式。A-Z, a-z, 0-9, +, / の 64 文字を使用する。
Base64 は、バイナリデータを ASCII 文字列に変換するエンコーディング方式です。A-Z (26 文字)、a-z (26 文字)、0-9 (10 文字)、+、/ の計 64 文字を使い、3 バイトのデータを 4 文字で表現します。入力データが 3 の倍数でない場合は、末尾に = (パディング) が付加されます。
Base64 が必要とされる理由は、電子メールや HTTP など、テキストベースのプロトコルではバイナリデータをそのまま送信できないためです。Base64 は電子メールの添付ファイル (MIME)、データ URI スキーム (data:image/png;base64,...)、JWT (JSON Web Token)、API のリクエスト/レスポンスボディなど幅広い場面で使われています。たとえば、小さなアイコン画像を HTML に直接埋め込む際にデータ URI として Base64 エンコードすれば、HTTP リクエスト数を削減できます。Web セキュリティ基礎の書籍で Base64 の活用場面を学べます。
JavaScript では btoa() でエンコード、atob() でデコードできます。ただし、これらの関数は Latin-1 文字のみを扱えるため、日本語などのマルチバイト文字を含む場合は TextEncoder と組み合わせる必要があります。Node.js では Buffer.from(data).toString('base64') を使います。Python では base64 モジュール、Java では java.util.Base64 クラスが標準で提供されています。
よくある誤解として、Base64 を暗号化と混同するケースがあります。Base64 はあくまでエンコーディング (可逆変換) であり、セキュリティ上の保護は一切提供しません。誰でも簡単にデコードできるため、パスワードや機密情報の保護には使えません。また、データサイズは約 33% 増加する点にも注意が必要です。3 バイトが 4 文字になるため、元データの 4/3 倍のサイズになります。ネットワークプロトコル入門の書籍で Base64 の技術的背景が解説されています。
URL やファイル名に Base64 文字列を含める場合、標準の + と / は特殊文字として扱われるため問題が生じます。この対策として、+ を -、/ を _ に置き換えた Base64url (RFC 4648) が使われます。文字数カウントの観点では、Base64 エンコード後の文字列長は元データのバイト数から正確に計算でき、ceil(n / 3) * 4 文字 (パディング込み) となります。