CSSで画像ファイルを外部から読み込まずにページに埋め込めたり、 メールに添付ファイルが送れたりする——その裏側でBase64というエンコード方式が動いています。 この記事では、Base64の仕組み・生まれた背景・実際に使われている場面、 そして「暗号化とは違う」という重要な誤解を解説します。
Base64とは何か
Base64とは、バイナリデータをASCIIテキストで表現するエンコード方式です。 名前の「64」は使用する文字の種類数を示しています。具体的には次の64文字と、 パディング用の「=」を使います。
- 大文字アルファベット: A〜Z(26文字)
- 小文字アルファベット: a〜z(26文字)
- 数字: 0〜9(10文字)
- 記号: + と /(2文字)
- パディング文字: =(3の倍数に合わせる用途)
重要な点として、Base64は暗号化ではありません。 「形式変換(エンコード)」であり、デコード方法は誰でも知っています。 Base64でエンコードされたデータは、誰でも元のバイナリに戻せます。
なぜBase64が生まれたか
Base64が生まれた主な理由は、メールプロトコル(SMTP)の制約にあります。 SMTPはもともとASCIIテキストのみを扱う前提で設計されており、 バイナリデータ(画像・PDFなど)を直接送ることができませんでした。
この問題を解決するために策定されたのがMIME規格(Multipurpose Internet Mail Extensions)です。 MIMEはメールにバイナリの添付ファイルを含められる仕組みで、 その中でバイナリをテキストに変換する手段としてBase64が採用されました。 「添付ファイルが届く」という当たり前の体験は、このMIME + Base64の仕組みに支えられています。
エンコードの仕組み
Base64の変換ルールは明確です。入力3バイト(24ビット)を6ビットずつ4つに分割し、 それぞれを64文字のいずれかに対応させます。
具体例として、"Man"という3文字をBase64エンコードすると "TWFu" になります。
| 文字 | ASCIIコード(10進) | バイナリ(8ビット) |
|---|---|---|
| M | 77 | 01001101 |
| a | 97 | 01100001 |
| n | 110 | 01101110 |
3バイト(24ビット)を連結すると010011010110000101101110になります。これを6ビットずつ分割すると010011010110000101101110となり、それぞれ10進数で 19・22・5・46 → Base64テーブルで T・W・F・u に対応します。
入力の文字数が3の倍数でない場合は末尾に「=」を付けてパディングします。 1文字余った場合は「==」、2文字余った場合は「=」が末尾に付きます。 また、エンコード後のサイズは元データの約4/3倍(約33%増)になります。
実際に使われている場面
| 用途 | 具体例 |
|---|---|
| メール添付 | MIME multipart形式でバイナリファイルをテキスト化して送信 |
| HTML/CSSへの画像埋め込み | data:image/png;base64,... 形式のデータURI |
| HTTP Basic認証 | Authorization: Basic dXNlcjpwYXNz(user:pass のBase64) |
| JWT | ヘッダー・ペイロードをBase64URLエンコードして「.」で区切る |
| JSON APIでのファイル送信 | バイナリファイルをBase64にしてJSONのフィールドに含める |
Base64は暗号化ではない
Base64でエンコードされたデータは、誰でも元に戻せます。 エンコードとデコードのアルゴリズムは公開されており、秘密鍵も不要です。 見た目がランダムな文字列に変わるため「暗号化されている」と誤解されやすいですが、 情報を秘匿する効果はまったくありません。
特にJWTのペイロードは注意が必要です。eyJ...という文字列はBase64URLエンコードされた平文のJSONであり、誰でも読めます。 JWTの署名は改ざん検知のためにあるものであって、内容の秘匿ではありません。 パスワード・個人情報・機密情報をJWTのペイロードに含めてはいけません。
デコードの方法
JavaScriptを使う場合、組み込み関数でエンコード・デコードができます。
// JavaScript: エンコード
btoa('Man') // "TWFu"
// JavaScript: デコード
atob('TWFu') // "Man"
# コマンドライン: デコード(macOS / Linux)
echo "TWFu" | base64 -d
ブラウザ上で手軽に試したい場合はBase64エンコード/デコードツールを使うと、テキスト・ファイルどちらもワンクリックで変換できます。 URLに安全に使える形式に変換したい場合はURLエンコード/デコードツールも参考にしてください。
まとめ
- Base64はバイナリをASCIIテキストで表現するエンコード方式(暗号化ではない)
- 64種類の文字(A-Z・a-z・0-9・+・/)と「=」パディングを使う
- 3バイト入力 → 6ビット×4 → 4文字出力という変換規則で、サイズは約33%増える
- メール添付(MIME)・データURI・HTTP Basic認証・JWTなど広く使われている
- JWTのペイロードは誰でも読めるため、機密情報を含めてはいけない
- JavaScriptでは
btoa()でエンコード、atob()でデコードできる