Base64とは
コンピュータが扱うデータはすべて「バイト(0〜255の数値)」の連続ですが、古くからあるメールプロトコル(SMTP)やHTTPヘッダーなどは テキスト(ASCII文字)しか安全に通せない という制約がありました。Base64はこの問題を解決するために生まれました。
バイナリデータを64種類の文字に変換することで、どんなデータでも文字列として扱えるようになります。「Base64」という名前は、変換に使う文字の種類が64個であることに由来しています。
エンコードの仕組み
変換テーブル(Base64アルファベット)
64種類の文字と6ビットの値の対応は以下のとおりです。
| 値 | 文字 | 値 | 文字 | 値 | 文字 | 値 | 文字 |
|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w |
| 1 | B | 17 | R | 33 | h | 49 | x |
| 2 | C | 18 | S | 34 | i | 50 | y |
| 3 | D | 19 | T | 35 | j | 51 | z |
| 4 | E | 20 | U | 36 | k | 52 | 0 |
| 5 | F | 21 | V | 37 | l | 53 | 1 |
| 6 | G | 22 | W | 38 | m | 54 | 2 |
| 7 | H | 23 | X | 39 | n | 55 | 3 |
| 8 | I | 24 | Y | 40 | o | 56 | 4 |
| 9 | J | 25 | Z | 41 | p | 57 | 5 |
| 10 | K | 26 | a | 42 | q | 58 | 6 |
| 11 | L | 27 | b | 43 | r | 59 | 7 |
| 12 | M | 28 | c | 44 | s | 60 | 8 |
| 13 | N | 29 | d | 45 | t | 61 | 9 |
| 14 | O | 30 | e | 46 | u | 62 | + |
| 15 | P | 31 | f | 47 | v | 63 | / |
具体例:「Hi」を Base64 にエンコードする
文字列 Hi を Base64 エンコードすると SGk= になります。変換の流れを追ってみましょう。
| ステップ | 内容 | 値 |
|---|---|---|
| 1. 文字をバイトに変換 | H = ASCII 72、i = ASCII 105 |
01001000 01101001 |
| 2. ビットを結合 | 16ビットを連結 | 0100100001101001 |
| 3. 6ビットずつ分割 | 3チャンクに分割(残り4ビットは0埋め) | 010010 000110 100100 |
| 4. 値に変換 | 10進数に変換 | 18 / 6 / 36 |
| 5. 文字に対応 | テーブルで文字を引く | S / G / k |
| 6. パディング追加 | 2バイト入力なので = を1つ追加(4文字単位に揃える) |
SGk= |
パディング(=)の役割
Base64は 3バイト単位 で処理します。入力バイト数が3の倍数でない場合、末尾に = を追加して4文字の倍数に揃えます。
- 入力が3バイトの倍数 → パディングなし
- 1バイト余る →
==を末尾に追加 - 2バイト余る →
=を末尾に追加
主な用途
メール添付ファイル(MIME)
電子メールの規格 MIME(Multipurpose Internet Mail Extensions) では、添付ファイルや非ASCII文字をBase64エンコードして送信します。古いメールサーバーがASCII以外のデータを正しく通せない問題をこれで解決しています。
Data URI(CSS・HTMLへの画像埋め込み)
画像をBase64にエンコードしてHTMLやCSSに直接埋め込む Data URI が使えます。小さなアイコンや背景画像をファイル分割せず1ファイルにまとめられるため、HTTPリクエスト削減に有効です。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." alt="アイコン">
JWT(JSON Web Token)/ API認証
JWT のヘッダーとペイロードはBase64 URLセーフ方式でエンコードされています。URLやHTTPヘッダーで安全に扱えるよう、+→-、/→_に置き換えた「Base64url」が使用されます。
HTTP Basic認証
ブラウザがBasic認証を行う際、ユーザー名:パスワード の文字列をBase64エンコードし、Authorization: Basic SGVsbG86V29ybGQ= という形でHTTPヘッダーに含めて送信します。
その他の用途
- WebSocketや一部のAPIでのバイナリデータ転送
- 環境変数・設定ファイルへの証明書埋め込み(PEM形式の内部でも使用)
- ブラウザストレージへのバイナリデータ保存
Base64変換ツールの使い方
3ステップで変換できます。
- モードを選択 — ページ上部の「エンコード」または「デコード」を選びます。
- テキストを入力 — 入力欄にテキストまたはBase64文字列を貼り付けます。日本語(UTF-8)にも対応しています。
- 結果をコピー — 変換結果が自動表示されます。コピーボタンでクリップボードに取り込めます。
- 標準 Base64 と URL セーフ版を識別する — JWT・OAuth state・S3 署名 URL は Base64URL (
+→-、/→_、padding 省略) を使います。本ツールは自動判別してデコードできます。 - 実用シナリオで応用する — JWT のペイロードをデコードして claims (exp, sub, user_id 等) を確認したり、Data URI で小さな画像を CSS に埋め込んだりと、Base64 の応用先は多岐にわたります。
コードで実装する場合
アプリケーション内でBase64変換を行う代表的な実装例です。
JavaScript(ブラウザ / Node.js)
// エンコード
const encoded = btoa(unescape(encodeURIComponent('こんにちは')));
// デコード
const decoded = decodeURIComponent(escape(atob(encoded)));
Node.js 環境ではより明示的に Buffer を使う方法も一般的です。
// Node.js — エンコード
const encoded = Buffer.from('Hello, World!').toString('base64');
// Node.js — デコード
const decoded = Buffer.from(encoded, 'base64').toString('utf-8');
Python
import base64
# エンコード(1行)
encoded = base64.b64encode('Hello'.encode()).decode() # => 'SGVsbG8='
# デコード(1行)
decoded = base64.b64decode('SGVsbG8=').decode() # => 'Hello'
Base64 vs 他のエンコード方式
| 方式 | 主な用途 | 可逆性 | サイズ変化 | セキュリティ |
|---|---|---|---|---|
| Base64 | バイナリ→テキスト変換 メール・JWT・Data URI |
可逆(デコードで元に戻せる) | 約133%(4/3倍) | なし(誰でも復元可) |
| URLエンコード (Percent-encoding) |
URLの特殊文字エスケープ | 可逆 | 増加(文字による) | なし |
| HTMLエスケープ | HTML特殊文字のサニタイズ ( <→<) |
可逆 | わずかに増加 | XSS対策にはなる |
| ハッシュ化 (SHA-256等) |
パスワード保存・改ざん検知 | 不可逆(元データ復元不可) | 固定長(256ビット等) | 高い(一方向関数) |
URLエンコードを行いたい場合は URLエンコードツール、ハッシュ値の生成には ハッシュ生成ツール もあわせてご利用ください。
注意点・よくある誤解
Base64は暗号化ではない
Base64の目的は「データ形式の変換」です。パスワードや個人情報をBase64にしても、機密保護にはまったくなりません。機密データを保護するには AES・RSAなどの暗号化アルゴリズム を使用してください。
データサイズが約33%増加する
3バイトのデータが4文字(4バイト)になるため、エンコード後のデータは元の 約4/3倍(約133%) になります。画像ファイルをData URIとして埋め込む場合はページ全体のサイズ増加に注意が必要です。大きなファイルには不向きです。
URLで使うときは「URLセーフ版」に注意
標準Base64の +・/・= はURLの予約文字と衝突します。クエリパラメーターやパスにBase64文字列を含める場合は、Base64 URLセーフ形式(+→-、/→_、=省略)を使用してください。
文字コードに注意(日本語など)
JavaScriptの btoa() は ASCII 文字列しか受け付けません。日本語などのマルチバイト文字をエンコードする際は、encodeURIComponent と組み合わせるか、TextEncoder を使ってUTF-8バイト列に変換してから処理する必要があります。