Base64とは?仕組み・使いどころ・注意点をやさしく解説
「Base64」という言葉は、メール添付・画像の埋め込み・APIトークン・Basic認証など、いたるところで登場します。本記事では 「Base64とは何か」「なぜ使うのか」「使ってはいけない場面」 を、専門用語をできるだけ避けて解説します。
1. Base64とは「バイナリを64種類の文字で表す」方式
Base64は、画像や暗号鍵などのバイナリデータ(0と1の塊)を、テキストとして安全に運ぶための変換方式です。使う文字は次の64種類だけです。
- 英大文字
A-Z(26種) - 英小文字
a-z(26種) - 数字
0-9(10種) - 記号
+と/(2種)
合計64種類なので「Base64」と呼びます。末尾の長さ調整には =(パディング)を使います。
2. 仕組み:3バイトを4文字に変換する
Base64は 「8ビット × 3 = 24ビット」を「6ビット × 4 = 24ビット」に区切り直す だけのシンプルな仕組みです。6ビットで表せる値は0〜63なので、ちょうど64種類の文字に対応させられます。
元の文字: M a n
ASCII: 77 97 110
2進数: 01001101 01100001 01101110
┗━━━━━━━ 24ビットを6ビットずつに区切り直す ━━━━━━━┛
6ビット: 010011 010110 000101 101110
10進数: 19 22 5 46
Base64: T W F u
結果: "Man" → "TWFu"
元データが3の倍数バイトでないときは、6ビット単位で足りない分を0で埋め、文字列の末尾を = で調整します。
| 元データ | Base64 | パディング |
|---|---|---|
| Man(3バイト) | TWFu | なし |
| Ma(2バイト) | TWE= | = 1個 |
| M(1バイト) | TQ== | = 2個 |
3. 何のために使うのか
「テキストしか通せない経路に、バイナリを通したい」場面で使います。代表例は次のとおりです。
- メール添付(MIME):メールは元々テキスト専用。画像やPDFはBase64でテキスト化して送ります。
- HTML/CSSへの画像埋め込み(Data URI):
data:image/png;base64,iVBORw0...の形で、小さな画像を外部ファイルなしに埋め込めます。 - Basic認証:
ユーザー名:パスワードをBase64化してAuthorizationヘッダーに載せます。 - JWT(トークン):ヘッダーとペイロードをURLセーフBase64で表現します。JWTデコーダ も参照。
- APIでのバイナリ受け渡し:JSONは文字列しか持てないため、ファイルをBase64文字列にして送ります。
4. 「URLセーフBase64」とは
標準Base64で使う + と / は、URLやファイル名では特別な意味を持つため不都合です。そこで + を - に、/ を _ に置き換えた「URLセーフBase64」が使われます。JWTやクエリパラメータで頻出します。
| 62番目 | 63番目 | パディング | |
|---|---|---|---|
| 標準 | + | / | = あり |
| URLセーフ | - | _ | 省略されることが多い |
5. よくある誤解:Base64は暗号化ではない
Base64文字列はデコードツールに貼るだけで即座に中身が読めます。パスワードやAPIキーを「Base64にしたから安全」と考えるのは危険です。秘密を守りたい場合は、暗号化(AESなど)やハッシュ化(ハッシュ生成)を使ってください。
6. データ量が約33%増える
Base64は3バイトを4文字に変換するため、データ量が約4/3(約33%)増えます。さらに改行を含む場合はもう少し増えます。大きなファイルをBase64でJSONに埋め込むと通信量・メモリを圧迫するので、大容量データは別経路(ファイルアップロード)を検討しましょう。
7. 各言語での書き方
JavaScript(ブラウザ)
// 文字列 → Base64
btoa(unescape(encodeURIComponent("こんにちは")));
// Base64 → 文字列
decodeURIComponent(escape(atob("44GT44KT44Gr44Gh44Gv")));
※ btoa はマルチバイト文字をそのまま扱えないため、上記のように UTF-8 を経由します。
Python
import base64
base64.b64encode("Man".encode()).decode() # 'TWFu'
base64.b64decode("TWFu").decode() # 'Man'
base64.urlsafe_b64encode(b"...") # URLセーフ版
コマンドライン
echo -n "Man" | base64 # TWFu echo "TWFu" | base64 --decode # Man
8. まとめ
- Base64はバイナリをテキストで運ぶための変換(64種類の文字を使う)。
- メール添付・Data URI・Basic認証・JWTなどで活躍する。
- 暗号化ではないので、秘密の保護には使えない。
- データ量が約33%増える点に注意。
- URL・ファイル名で使うならURLセーフBase64を選ぶ。