Base64エンコードとは?仕組み・使い方・セキュリティの基礎
Webアプリケーションを開発・運用していると、必ず一度は出会うのが Base64エンコードです。メールへの画像添付、APIでのトークン受け渡し、CSS内への画像埋め込みなど、活用シーンは多岐に渡ります。本記事では、Base64の仕組みと使い方、そして見落とされがちなセキュリティの注意点まで、実務目線で解説します。
Base64エンコードとは
Base64とは、バイナリデータ (画像・音声・暗号化データ等) を、英数字と記号のみのテキスト形式に変換する技術です。1995年にRFC 1521として規定され、現在は RFC 4648 で標準化されています。
変換に使われるのは以下の64文字 + パディング1文字、合計65種類の文字です。
- 大文字アルファベット (A-Z): 26文字
- 小文字アルファベット (a-z): 26文字
- 数字 (0-9): 10文字
- 記号 (+, /): 2文字
- パディング (=): 1文字
「Base64」という名前は、この 64種類の文字を使う変換 (Base = 基数) という意味から来ています。
なぜBase64が必要なのか
「画像をそのままメールに添付すれば良いのでは?」と思うかもしれません。しかし、初期のメールプロトコル (SMTP) は 7ビットASCII文字 (英数字と一部記号) しか扱えない設計でした。バイナリデータ (8ビット) をそのまま送ると、サーバが文字化けや誤動作を起こす可能性があったのです。
そこで「バイナリを安全な文字だけに変換してから送る」必要が生まれ、Base64エンコードが標準として採用されました。現代でも以下のシーンで広く使われています。
実務での代表的な使用例
- メール添付ファイル: MIME形式で画像・PDFを送るとき
- HTML内画像埋め込み:
<img src="data:image/png;base64,iVBORw..."> - CSS内画像埋め込み:
background: url(data:image/png;base64,...) - API通信: JWT (JSON Web Token)のペイロード、Basic認証のID:パスワード
- OAuth: 認可コード・アクセストークンの伝送
- QRコード: 一部のQRコード規格 (Base32 / Base45)
変換の仕組み
Base64は 「6ビットずつに区切って文字テーブルに対応させる」 という非常にシンプルな仕組みです。具体的に「ABC」(3文字 = 24ビット) を変換してみましょう。
- 「ABC」のASCIIコードは 65, 66, 67 (8ビットずつ・合計24ビット)
- 2進数:
01000001 01000010 01000011 - 6ビットずつ区切る:
010000 010100 001001 000011 - 各6ビットを10進数に:
16, 20, 9, 3 - 文字テーブル参照:
Q, U, J, D - 結果: 「QUJD」
このように、3バイト (24ビット) のデータが、4文字 (32ビット) に変換されます。つまり データサイズは約 4/3 (133%) に増加します。これがBase64の宿命的なオーバーヘッドです。
パディング (=) について
元データが3バイトの倍数で割り切れない場合、出力末尾に = を1〜2個追加して4の倍数に揃えます。
- 元データが「A」(1バイト) →
QQ== - 元データが「AB」(2バイト) →
QUI= - 元データが「ABC」(3バイト) →
QUJD(パディング不要)
Base64エンコード・デコードを試す
本サイトでは Base64エンコード/デコードツール を無料公開しています。ブラウザ内で完結処理するので、機密データを入力しても外部に送信されません。
- テキスト ⇔ Base64の双方向変換
- UTF-8 / Shift_JIS等の文字コード対応
- URLセーフ版 (Base64URL) との変換
- 画像ファイルのBase64エンコード
セキュリティ上の重要な注意点
Base64は単なる「エンコーディング (変換)」であり、誰でも簡単に元のデータに戻せます。「Base64でエンコードしたから安全」というのは大きな誤解です。
以下のような誤用が頻繁に見られます。
悪い例: パスワードをBase64で保存
// ❌ これは「セキュリティ対策」になりません
$encoded = base64_encode($password);
$db->save($encoded);
Base64は1ミリ秒で復号できます。パスワードは必ず bcrypt / Argon2 / scrypt 等のハッシュ化を使用してください。
悪い例: 機密データをBase64でURL送信
// ❌ ログに残る・履歴に残る・全部見える
window.location = '/api?token=' + btoa(secret);
URLパラメータはサーバログ・ブラウザ履歴・Referer等に残ります。機密データはPOSTボディ + HTTPSで送信し、必要なら暗号化してから送るべきです。
悪い例: 設定ファイルにBase64でAPIキーを記述
# ❌ 「読みにくい」だけで、何の防御にもならない
api_key: c2VjcmV0LWFwaS1rZXk=
これは「目視で読みにくくなった」だけで、`base64 -d` コマンドで即復号されます。APIキーは環境変数 (`.env`) かKMS (Key Management Service) で管理しましょう。
正しい使い方
Base64は「機密データを隠す」用途には絶対に使ってはいけません。正しい用途は以下のような場合です。
- バイナリを安全に転送する経路を作る (メール添付・URL埋め込み)
- JSON / XML / YAMLにバイナリを含める (フォーマットの制約回避)
- ハッシュ値や公開鍵を人間にも読める形式で出力
- JWTのペイロード (内容は公開前提、署名で改竄検知)
まとめ
- Base64はバイナリ → テキスト変換の技術 (暗号化ではない)
- データサイズは約 4/3 倍に膨らむ
- メール添付・data URI・JWT等で広く利用される
- 誰でも復号できるので、機密データ保護には不向き
- パスワードはbcrypt等のハッシュ化を使用する
本サイトの Base64エンコード/デコードツール はブラウザ内処理で完結するため、安全にご利用いただけます。データは外部送信されません。
URLエンコードやHTMLエンティティ変換も実務でよく使います。本サイトのエンコード・変換カテゴリには11種類の変換ツールが揃っています。