プログラミングや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ビット単位に分割して変換します。具体的な手順は以下のとおりです。
- 元のデータをバイナリ(2進数)に変換する
- 6ビットずつに区切る
- 各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%増加するデメリットはありますが、テキストベースの通信で安全にデータを送れるという大きなメリットがあります。暗号化ではないことを理解した上で、適切な場面で活用してみてください。