プログラミングやWeb開発をしていると「Base64」という言葉に出会うことがあります。メールの添付ファイル、HTMLに画像を埋め込むData URI、APIのトークンなど、さまざまな場面で使われている技術です。この記事では、Base64の仕組みから具体的な使い方まで、初心者の方にもわかりやすく解説します。

Base64とは何か

Base64は、バイナリデータ(画像やファイルなどの0と1の羅列)を、テキスト文字列に変換するエンコード方式です。「Base64」という名前は、64種類の文字(A-Z、a-z、0-9、+、/)を使ってデータを表現することに由来しています。

重要なポイントとして、Base64は暗号化ではありません。あくまでデータの表現形式を変換しているだけで、誰でも簡単に元のデータに戻す(デコードする)ことができます。セキュリティ目的で使うものではないことを覚えておきましょう。

Base64の仕組み - 6ビット変換

通常のデータは8ビット(1バイト)単位で扱われますが、Base64では6ビット単位に分割して変換します。具体的な手順は以下のとおりです。

  1. 元のデータをバイナリ(2進数)に変換する
  2. 6ビットずつに区切る
  3. 各6ビットを対応する文字(A-Z、a-z、0-9、+、/の64文字)に置き換える

例えば「Hi」という文字列をBase64エンコードしてみましょう。

文字:     H         i
ASCII:    72        105
2進数:    01001000  01101001
6ビット区切り: 010010 000110 1001XX
Base64文字:    S      G      k=
結果: "SGk="

8ビットのデータを6ビットに分けるため、元のデータより約33%サイズが増加します。これはBase64の欠点の一つですが、テキストとして安全に送れるという大きなメリットがあります。

パディング(=)の意味

Base64エンコードされた文字列の末尾に「=」が付いていることがあります。これはパディング(詰め物)と呼ばれます。

Base64は3バイト(24ビット)のデータを4文字に変換するのが基本単位です。しかし、元データのバイト数が3の倍数でない場合、端数が生じます。

  • 余り1バイトの場合: 末尾に「==」が付く
  • 余り2バイトの場合: 末尾に「=」が付く
  • 割り切れる場合: パディングなし
"A"   → "QQ=="   (1バイト → ==)
"Hi"  → "SGk="   (2バイト → =)
"Hey" → "SGV5"   (3バイト → パディングなし)

パディングは、デコード時にデータの正確な長さを復元するために必要です。ただし、実装によってはパディングを省略しても動作する場合があります。

なぜBase64が必要なのか

「わざわざサイズが増えるのに、なぜ変換するのか?」と疑問に思うかもしれません。Base64が必要な理由は、テキストしか扱えない環境でバイナリデータを送るためです。

例えば、電子メール(SMTP)は元々7ビットASCIIテキストしか扱えない仕組みでした。画像や添付ファイルのようなバイナリデータをそのまま送ると、途中で文字化けしたりデータが壊れたりしてしまいます。

Base64を使えば、どんなバイナリデータもA-Zやa-zなどの安全な文字だけで表現できるため、テキストベースの通信でも問題なく送受信できるのです。

Base64の使用場面

1. メールの添付ファイル(MIME)

電子メールで画像やPDFなどのファイルを添付する際、内部的にBase64エンコードされています。メールソフトが自動で処理するため、ユーザーが意識することはほとんどありません。

2. Data URI(HTMLへの画像埋め込み)

HTMLやCSSに小さな画像を直接埋め込む際にBase64が使われます。HTTPリクエストの回数を減らせるメリットがあります。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEU..." />

ただし、大きな画像をData URIにするとHTMLファイルが巨大になるため、アイコンやごく小さな画像に限定して使うのが一般的です。

3. APIの認証トークン

Basic認証では、ユーザー名とパスワードをBase64エンコードしてHTTPヘッダーに含めます。また、JWT(JSON Web Token)でもペイロード部分にBase64URLエンコードが使われています。

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
// "username:password" をBase64エンコードした値

4. JSON内のバイナリデータ

JSONはテキスト形式なので、バイナリデータを含めるにはBase64エンコードする必要があります。APIで画像データをやり取りする際などに使われます。

プログラミングでの扱い方

主要なプログラミング言語でのBase64エンコード・デコードの方法を紹介します。

JavaScript

// エンコード
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="

// デコード
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"

// 日本語を扱う場合(UTF-8対応)
const utf8Encoded = btoa(unescape(encodeURIComponent("こんにちは")));
const utf8Decoded = decodeURIComponent(escape(atob(utf8Encoded)));

Python

import base64

# エンコード
encoded = base64.b64encode(b"Hello, World!").decode()
print(encoded)  # "SGVsbG8sIFdvcmxkIQ=="

# デコード
decoded = base64.b64decode("SGVsbG8sIFdvcmxkIQ==").decode()
print(decoded)  # "Hello, World!"

Base64のエンコード・デコードを試してみましょう

Base64変換ツールを使ってみる

まとめ

Base64は、バイナリデータをテキスト文字列に変換するための標準的なエンコード方式です。6ビット単位で64種類の文字に変換するシンプルな仕組みで、メールの添付ファイル、Data URI、APIの認証など幅広い場面で活用されています。

データサイズが約33%増加するデメリットはありますが、テキストベースの通信で安全にデータを送れるという大きなメリットがあります。暗号化ではないことを理解した上で、適切な場面で活用してみてください。