ガイド

Base64とは?歴史・仕組み・用途をやさしく解説

Base64の成り立ち、3バイトを4文字に変える仕組み、パディング、URL-safe版、用途と注意点を正確に解説します。

Base64を一文でいうと

Base64は、バイナリーデータをテキストとして表すエンコード方式です。どんなバイト列でも、広く安全に扱える小さな文字集合の文字列へ変換します。写真、PDF、「こんにちは」のどれを表すバイトかは判断せず、テキスト中心の仕組みを通れる包装を付けるだけです。

変換は可逆で情報を失いませんが、暗号化、ハッシュ、圧縮ではありません。

Base64はどこから来たのか

初期のネットワークや電子メールは、任意の8ビットデータを常に正しく運べるわけではありませんでした。7ビットの印刷可能テキストを想定する中継システムがバイナリを変えてしまうことがあったからです。uuencodeなどの先行方式も同じ問題を扱い、RFC 1421のPrivacy-Enhanced Mail用64文字印刷可能エンコードは現代のBase64へ直接つながります。

その後MIMEがメール本文や添付のContent-Transfer-EncodingとしてBase64を命名しました。2006年のRFC 4648は標準版とURL-safe版の一般的な参照仕様です。Base64は一人のひらめきというより、相互運用のための標準が育った結果です。

なぜ64文字なのか:3から4への仕組み

6ビットでは0から63まで、ちょうど64通りを表せます。標準Base64はA–Z、a–z、0–9、+、/を各値に割り当てます。エンコーダーは3バイト、つまり24ビットを読み、それを4つの6ビット組へ区切り直します。各値を文字表のインデックスとして4文字を出力します。

ASCII/UTF-8の「Man」では、3バイトから19、22、5、46が得られ、T、W、F、uに対応します。結果はTWFu。デコードはこの道を逆向きにたどります。

「Man」は24ビットのブロックをちょうど満たすため、パディングは不要です。
入力
Man
入力バイト
01001101 01100001 01101110
6ビットの組
010011 010110 000101 101110
文字表のインデックス
19 · 22 · 5 · 46
Base64出力
TWFu

パディング、Unicode、Base64url

最後が1バイトなら有効な2文字の後に==、2バイトなら3文字の後に=が付きます。これは秘密のデータではなく、最後の24ビット組に実データがどれだけあったかを示す印です。長さが別の方法で分かるプロトコルでは省略される場合があります。

Base64が扱うのは文字ではなくバイトです。日本語、中文、絵文字は通常UTF-8のバイト列にしてからエンコードします。URLやファイル名向けのbase64urlは+と/を-と_へ置換します。似ていますが、仕様を確認せず混在させてはいけません。

Base64が役立つ場面

代表例はMIMEメール添付、証明書や鍵のPEMブロック、小さな画像やフォントを埋め込むdata: URLです。JSONやXMLが小さなバイナリを文字列として運ぶ場合にも使われます。HTTP Basic認証情報はBase64、JWTの各部分はbase64urlですが、どちらも内容を秘密にはしません。

判断基準は、外側がテキストを要求し、中身がバイトかどうかです。アップロード、オブジェクトストレージ、BLOBがすでにバイナリを扱えるなら、Base64は余計な層になりがちです。

サイズと性能のコスト

完全な3バイトは4文字になります。正確な長さは4 × ceil(n / 3)で、大きな入力では約33.3%増え、小さな入力では比率がさらに大きくなります。改行やdata: URLの接頭辞も少し加わります。

別レイヤーの圧縮で通信量が減る場合はありますが、エンコード自体はメモリとCPUを使います。大きなファイルはバイナリのまま送る方が一般に明快です。

Base64にできないこと

Base64には機密性も真正性もありません。鍵なしで誰でもデコードでき、書き換えも可能です。パスワード、APIトークン、個人情報の保護には使えません。秘密には暗号化とTLS、要約には暗号学的ハッシュ、改ざん検知には署名やMACを使います。

覚え方は簡単です。Base64はテキストの境界を越える道具であって、セキュリティ境界を守る道具ではありません。

技術資料