Base64とは? — エンコードの仕組み・用途・デコード方法をわかりやすく解説

Base64(ベース64)とは、バイナリデータを64種類のASCII印字可能文字(A〜Z・a〜z・0〜9・+・/)に変換するエンコード方式です。テキストしか扱えないプロトコルでも画像やバイナリファイルを安全に送受信できるようにするために広く使われており、RFC 4648 で標準化されています。

最終更新: 2026年5月22日

目次
  1. Base64とは
  2. エンコードの仕組み
  3. 主な用途
  4. Base64変換ツールの使い方
  5. Base64 vs 他のエンコード方式
  6. 注意点・よくある誤解
  7. よくある質問

Base64とは

定義: Base64とは、任意のバイナリデータを 64種類のASCII文字(A–Z・a–z・0–9・+/)のみで表現するエンコード方式です。RFC 4648 によって標準化されています。

コンピュータが扱うデータはすべて「バイト(0〜255の数値)」の連続ですが、古くからあるメールプロトコル(SMTP)やHTTPヘッダーなどは テキスト(ASCII文字)しか安全に通せない という制約がありました。Base64はこの問題を解決するために生まれました。

バイナリデータを64種類の文字に変換することで、どんなデータでも文字列として扱えるようになります。「Base64」という名前は、変換に使う文字の種類が64個であることに由来しています。

エンコードの仕組み

原理: Base64は 3バイトのバイナリデータを4文字のASCII文字に変換 します。3×8ビット=24ビットを、6ビットずつ4つに分割し、それぞれを対応する文字に置き換えます。

変換テーブル(Base64アルファベット)

64種類の文字と6ビットの値の対応は以下のとおりです。

文字 文字 文字 文字
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

具体例:「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バイト余る → = を末尾に追加

主な用途

一言まとめ: Base64はバイナリデータをテキストとして扱いたい場面ならほぼどこでも登場します。

メール添付ファイル(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変換ツールの使い方

Links Create の Base64変換ツール はインストール不要のブラウザ完結型です。入力と同時に即座に変換結果が表示されます。

3ステップで変換できます。

  1. モードを選択 — ページ上部の「エンコード」または「デコード」を選びます。
  2. テキストを入力 — 入力欄にテキストまたはBase64文字列を貼り付けます。日本語(UTF-8)にも対応しています。
  3. 結果をコピー — 変換結果が自動表示されます。コピーボタンでクリップボードに取り込めます。
  4. 標準 Base64 と URL セーフ版を識別する — JWT・OAuth state・S3 署名 URL は Base64URL (+-/_、padding 省略) を使います。本ツールは自動判別してデコードできます。
  5. 実用シナリオで応用する — 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 他のエンコード方式

比較ポイント: エンコード方式はそれぞれ目的が異なります。用途・可逆性・サイズ変化・セキュリティの4軸で整理すると選択ミスを防げます。
方式 主な用途 可逆性 サイズ変化 セキュリティ
Base64 バイナリ→テキスト変換
メール・JWT・Data URI
可逆(デコードで元に戻せる) 約133%(4/3倍) なし(誰でも復元可)
URLエンコード
(Percent-encoding)
URLの特殊文字エスケープ 可逆 増加(文字による) なし
HTMLエスケープ HTML特殊文字のサニタイズ
<&lt;
可逆 わずかに増加 XSS対策にはなる
ハッシュ化
(SHA-256等)
パスワード保存・改ざん検知 不可逆(元データ復元不可) 固定長(256ビット等) 高い(一方向関数)

URLエンコードを行いたい場合は URLエンコードツール、ハッシュ値の生成には ハッシュ生成ツール もあわせてご利用ください。

注意点・よくある誤解

最重要: Base64は暗号化ではありません。 デコード手順は完全に公開されており、Base64文字列を見た人は誰でも元データを復元できます。

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バイト列に変換してから処理する必要があります。

よくある質問

Base64は暗号化ですか?

いいえ、Base64は暗号化ではありません。デコード手順は誰でも知ることができ、Base64文字列があれば誰でも元データを復元できます。機密データの保護には AES・RSA 等の暗号化を使用してください。

Base64エンコードするとデータサイズはどう変わりますか?

エンコード後のサイズは元データの 約133%(約4/3倍) になります。3バイトを4文字(4バイト)に変換するためです。100KBの画像をData URIで埋め込むと約133KBになります。

Base64とBase64 URLセーフの違いは何ですか?

標準Base64では +/= を使いますが、これらはURLの区切り文字と衝突します。Base64 URLセーフ(RFC 4648 §5) では +-/_ に置き換え、パディングの = を省略します。JWTで使われるのはこのURLセーフ版です。

パディング文字「=」は何のために使われますか?

Base64は3バイト単位で変換します。入力バイト数が3の倍数でない場合、出力が4文字の倍数にならないため、不足分を = で埋めて揃えます。2バイト余りの場合は = が1つ、1バイト余りの場合は == が末尾に付きます。